內部類
-
如果一個事物的內部包含另一個事物,那么這就是一個類內部包含另一個類
-
分類:成員內部類,區域內部類(包含匿名內部類)
成員內部類
public class Hero {//外部類
private String name;
float hp;
float armor;
public Hero(String name){
this.name = name;
}
//外部類方法
public void method(int s){
System.out.println("外部類方法");
new BattleScore().score(s);//使用外部類方法呼叫內部方法
}
public class BattleScore {//內部類
//內部類方法
public void score(int s){
System.out.println(name + "的成績是" + s);
}
}
}
/////////////////////////////////////////////////
public class InnerClassMain {
public static void main(String[] args) {
//方法一:通過外部方法間接呼叫內部方法
Hero garen = new Hero("garen");
garen.method(100);
//方法二:直接呼叫內部類方法
Hero.BattleScore sore = new Hero("garen").new BattleScore();
sore.score(100);
}
}
-
成員內部類為外部類嵌套一個類
-
訪問成員內部類方法有兩種:
-
通過外部類間接呼叫內部類方法
-
直接使用內部類方法:
外部類名稱.內部類名稱 物件名 = new 外部類名稱().new 內部類名稱(); -
內部類成員變數訪問順序:
public class Outer { int num = 30;//外部類成員變數 public class Inner{ int num = 20; public void method(){ int num = 10; System.out.println(num);//輸出10 System.out.println(this.num);//輸出20 System.out.println(Outer.this.num);//輸出30 } } public static void main(String[] args) { Outer.Inner obj = new Outer().new Inner(); obj.method(); } }
區域內部類
- 一個類是定義在一個方法內部的,則為區域內部類
- 只有當前所屬方法才能使用,外界不能訪問,要訪問區域內部類要通過間接訪問
- 權限修飾符:
- 外部類:public, (default)
- 成員內部類:public, protected, (default), private
- 區域內部類:不能修飾
public class LocalInnerClass {
//外部類方法
public void method(){
//區域內部類,且不能權限修飾符修飾
class InnerClass{
int num = 10;
public void innerMethod(){
System.out.println(num);
}
}
//外界不能直接訪問區域內部類,需要方法內創建物件
//通過呼叫方法間接訪問
InnerClass inner = new InnerClass();
inner.innerMethod();
}
public static void main(String[] args) {
LocalInnerClass obj = new LocalInnerClass();
obj.method();
}
}
- 區域內部類如果希望訪問所在方法的區域變數的,那么這個區域變數必須是有效final的
匿名內部類
-
如果介面的實作類(或者父類的子類)只需要使用唯一的一次,這種情況下可以省略該類的定義,使用匿名內部類
-
在宣告一個抽象類(介面)的同時實體化它,可使代碼更加簡潔精練
-
介面名稱 物件名 = new 介面名稱(){ //覆寫重寫所有的抽象方法 };或者
抽象類名稱 物件名 = new 抽象類名稱(){ //覆寫重寫所有的抽象方法 };public abstract class Hero {//外部類 private String name; float hp; float armor; public Hero(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void attrack();//抽象方法 } ///////////////////////////////////////////// public class InnerClassMain { public static void main(String[] args) { //匿名內部類 Hero ADHero = new Hero("garen"){ @Override public void attrack(){ System.out.println(getName()+"其他攻擊方法"); } }; ADHero.attrack(); } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/161510.html
標籤:Java
