java 继承和内部类_Java自学-接口与继承 内部类
Java 內部類
內部類分為四種:
非靜態內部類 靜態內部類 匿名類 本地類
步驟 1 : 非靜態內部類
非靜態內部類 BattleScore “戰斗成績”
非靜態內部類可以直接在一個類里面定義
比如:
戰斗成績只有在一個英雄對象存在的時候才有意義
所以實例化BattleScore 的時候,必須建立在一個存在的英雄的基礎上
語法: new 外部類().new 內部類()
作為Hero的非靜態內部類,是可以直接訪問外部類的private實例屬性name的
package charactor;
public class Hero {
private String name; // 姓名
float hp; // 血量
float armor; // 護甲
int moveSpeed; // 移動速度
// 非靜態內部類,只有一個外部類對象存在的時候,才有意義 // 戰斗成績只有在一個英雄對象存在的時候才有意義 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 = "蓋倫";
// 實例化內部類 // BattleScore對象只有在一個英雄對象存在的時候才有意義 // 所以其實例化必須建立在一個外部類對象的基礎之上 BattleScore score = garen.new BattleScore();
score.kill = 9;
score.legendary();
}
}
步驟 2 : 靜態內部類
在一個類里面聲明一個靜態內部類
比如敵方水晶,當敵方水晶沒有血的時候,己方所有英雄都取得勝利,而不只是某一個具體的英雄取得勝利。
與非靜態內部類不同,靜態內部類水晶類的實例化 不需要一個外部類的實例為基礎,可以直接實例化
語法:new 外部類.靜態內部類();
因為沒有一個外部類的實例,所以在靜態內部類里面不可以訪問外部類的實例屬性和方法
除了可以訪問外部類的私有靜態成員外,靜態內部類和普通類沒什么大的區別
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();
//靜態內部類不能直接訪問外部類的對象屬性 System.out.println(name + " win this game");
}
}
}
public static void main(String[] args) {
//實例化靜態內部類 Hero.EnemyCrystal crystal = new Hero.EnemyCrystal();
crystal.checkIfVictory();
}
}
步驟 3 : 匿名類
匿名類指的是在聲明一個類的同時實例化它,使代碼更加簡潔精練
通常情況下,要使用一個接口或者抽象類,都必須創建一個子類
有的時候,為了快速使用,直接實例化一個抽象類,并“當場”實現其抽象方法。
既然實現了抽象方法,那么就是一個新的類,只是這個類,沒有命名。
這樣的類,叫做匿名類
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(){
//當場實現attack方法 public void attack() {
System.out.println("新的進攻手段");
}
};
h.attack();
//通過打印h,可以看到h這個對象屬于Hero$1這么一個系統自動分配的類名
System.out.println(h);
}
}
步驟 4 : 本地類
本地類可以理解為有名字的匿名類
內部類與匿名類不一樣的是,內部類必須聲明在成員的位置,即與屬性和方法平等的位置。 本地類和匿名類一樣,直接聲明在代碼塊里面,可以是主方法,for循環里等等地方
package charactor;
public abstract class Hero {
String name; //姓名
float hp; //血量
float armor; //護甲
int moveSpeed; //移動速度
public abstract void attack();
public static void main(String[] args) {
//與匿名類的區別在于,本地類有了自定義的類名 class SomeHero extends Hero{
public void attack() {
System.out.println( name+ " 新的進攻手段");
}
}
SomeHero h =new SomeHero();
h.name ="地卜師";
h.attack();
}
}
步驟 5 : 在匿名類中使用外部的局部變量
在匿名類中使用外部的局部變量,外部的局部變量必須修飾為final
為什么要聲明為final,其機制比較復雜,請參考第二個Hero代碼中的解釋
注:在jdk8中,已經不需要強制修飾成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屬性,并且使用構造方法初始化該屬性的值 //在attack中使用的damage,真正使用的是這個內部damage,而非外部damage
//假設外部屬性不需要聲明為final //那么在attack中修改damage的值,就會被暗示為修改了外部變量damage的值
//但是他們倆是不同的變量,是不可能修改外部變量damage的 //所以為了避免產生誤導,外部的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);
}
}
總結
以上是生活随笔為你收集整理的java 继承和内部类_Java自学-接口与继承 内部类的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: palindromic java_Lon
- 下一篇: 网线t568a和t568b的区别有哪些
