日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java 继承和内部类_Java自学-接口与继承 内部类

發(fā)布時間:2023/12/19 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 继承和内部类_Java自学-接口与继承 内部类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Java 內(nèi)部類

內(nèi)部類分為四種:

非靜態(tài)內(nèi)部類 靜態(tài)內(nèi)部類 匿名類 本地類

步驟 1 : 非靜態(tài)內(nèi)部類

非靜態(tài)內(nèi)部類 BattleScore “戰(zhàn)斗成績”

非靜態(tài)內(nèi)部類可以直接在一個類里面定義

比如:

戰(zhàn)斗成績只有在一個英雄對象存在的時候才有意義

所以實例化BattleScore 的時候,必須建立在一個存在的英雄的基礎(chǔ)上

語法: new 外部類().new 內(nèi)部類()

作為Hero的非靜態(tài)內(nèi)部類,是可以直接訪問外部類的private實例屬性name的

package charactor;

public class Hero {

private String name; // 姓名

float hp; // 血量

float armor; // 護甲

int moveSpeed; // 移動速度

// 非靜態(tài)內(nèi)部類,只有一個外部類對象存在的時候,才有意義 // 戰(zhàn)斗成績只有在一個英雄對象存在的時候才有意義 class BattleScore {

int kill;

int die;

int assit;

public void legendary() {

if (kill >= 8)

System.out.println(name + "超神!");

else

System.out.println(name + "尚未超神!");

}

}

public static void main(String[] args) {

Hero garen = new Hero();

garen.name = "蓋倫";

// 實例化內(nèi)部類 // BattleScore對象只有在一個英雄對象存在的時候才有意義 // 所以其實例化必須建立在一個外部類對象的基礎(chǔ)之上 BattleScore score = garen.new BattleScore();

score.kill = 9;

score.legendary();

}

}

步驟 2 : 靜態(tài)內(nèi)部類

在一個類里面聲明一個靜態(tài)內(nèi)部類

比如敵方水晶,當(dāng)敵方水晶沒有血的時候,己方所有英雄都取得勝利,而不只是某一個具體的英雄取得勝利。

與非靜態(tài)內(nèi)部類不同,靜態(tài)內(nèi)部類水晶類的實例化 不需要一個外部類的實例為基礎(chǔ),可以直接實例化

語法:new 外部類.靜態(tài)內(nèi)部類();

因為沒有一個外部類的實例,所以在靜態(tài)內(nèi)部類里面不可以訪問外部類的實例屬性和方法

除了可以訪問外部類的私有靜態(tài)成員外,靜態(tài)內(nèi)部類和普通類沒什么大的區(qū)別

package charactor;

public class Hero {

public String name;

protected float hp;

private static void battleWin(){

System.out.println("battle win");

}

//敵方的水晶 static class EnemyCrystal{

int hp=5000;

//如果水晶的血量為0,則宣布勝利 public void checkIfVictory(){

if(hp==0){

Hero.battleWin();

//靜態(tài)內(nèi)部類不能直接訪問外部類的對象屬性 System.out.println(name + " win this game");

}

}

}

public static void main(String[] args) {

//實例化靜態(tài)內(nèi)部類 Hero.EnemyCrystal crystal = new Hero.EnemyCrystal();

crystal.checkIfVictory();

}

}

步驟 3 : 匿名類

匿名類指的是在聲明一個類的同時實例化它,使代碼更加簡潔精練

通常情況下,要使用一個接口或者抽象類,都必須創(chuàng)建一個子類

有的時候,為了快速使用,直接實例化一個抽象類,并“當(dāng)場”實現(xiàn)其抽象方法。

既然實現(xiàn)了抽象方法,那么就是一個新的類,只是這個類,沒有命名。

這樣的類,叫做匿名類

package charactor;

public abstract class Hero {

String name; //姓名

float hp; //血量

float armor; //護甲

int moveSpeed; //移動速度

public abstract void attack();

public static void main(String[] args) {

ADHero adh=new ADHero();

//通過打印adh,可以看到adh這個對象屬于ADHero類 adh.attack();

System.out.println(adh);

Hero h = new Hero(){

//當(dāng)場實現(xiàn)attack方法 public void attack() {

System.out.println("新的進攻手段");

}

};

h.attack();

//通過打印h,可以看到h這個對象屬于Hero$1這么一個系統(tǒng)自動分配的類名

System.out.println(h);

}

}

步驟 4 : 本地類

本地類可以理解為有名字的匿名類

內(nèi)部類與匿名類不一樣的是,內(nèi)部類必須聲明在成員的位置,即與屬性和方法平等的位置。 本地類和匿名類一樣,直接聲明在代碼塊里面,可以是主方法,for循環(huán)里等等地方

package charactor;

public abstract class Hero {

String name; //姓名

float hp; //血量

float armor; //護甲

int moveSpeed; //移動速度

public abstract void attack();

public static void main(String[] args) {

//與匿名類的區(qū)別在于,本地類有了自定義的類名 class SomeHero extends Hero{

public void attack() {

System.out.println( name+ " 新的進攻手段");

}

}

SomeHero h =new SomeHero();

h.name ="地卜師";

h.attack();

}

}

步驟 5 : 在匿名類中使用外部的局部變量

在匿名類中使用外部的局部變量,外部的局部變量必須修飾為final

為什么要聲明為final,其機制比較復(fù)雜,請參考第二個Hero代碼中的解釋

注:在jdk8中,已經(jīng)不需要強制修飾成final了,如果沒有寫final,不會報錯,因為編譯器偷偷的幫你加上了看不見的final

package charactor;

public abstract class Hero {

public abstract void attack();

public static void main(String[] args) {

//在匿名類中使用外部的局部變量,外部的局部變量必須修飾為final final int damage = 5;

Hero h = new Hero(){

public void attack() {

System.out.printf("新的進攻手段,造成%d點傷害",damage );

}

};

}

}

package charactor;

public abstract class Hero {

public abstract void attack();

public static void main(String[] args) {

//在匿名類中使用外部的局部變量damage 必須修飾為final int damage = 5;

//這里使用本地類AnonymousHero來模擬匿名類的隱藏屬性機制

//事實上的匿名類,會在匿名類里聲明一個damage屬性,并且使用構(gòu)造方法初始化該屬性的值 //在attack中使用的damage,真正使用的是這個內(nèi)部damage,而非外部damage

//假設(shè)外部屬性不需要聲明為final //那么在attack中修改damage的值,就會被暗示為修改了外部變量damage的值

//但是他們倆是不同的變量,是不可能修改外部變量damage的 //所以為了避免產(chǎn)生誤導(dǎo),外部的damage必須聲明為final,"看上去"就不能修改了 class AnonymousHero extends Hero{

int damage;

public AnonymousHero(int damage){

this.damage = damage;

}

public void attack() {

damage = 10;

System.out.printf("新的進攻手段,造成%d點傷害",this.damage );

}

}

Hero h = new AnonymousHero(damage);

}

}

總結(jié)

以上是生活随笔為你收集整理的java 继承和内部类_Java自学-接口与继承 内部类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。