內部類
-
什麼是內部類: 定義在一個類的類體當中的類
-
作用: 共享數據的方式之一
-
分類
-
成員內部類
可以共享外部類所有的 屬性和方法(病毒和人的關係)
創建方式: Outer.Inner in = new Outer.new Inner();
內部類中不允許有static修飾的內容,除非內部類有static修飾
public class OuterInner{
public static void main(String[] args){
Outer.Inner inner =new Outer().new Inner();
inner.show();
}
}
class Outer{
int i=1;
static int j=2;
class Inner{
public void show(){
System.out.println(i);
System.out.println(j);
}
}
}
/*
這樣的寫法是不可以的 Inner中的show()方法是無法訪問到i的
class Outer{
int i=1;
}
calss Inner{
public void show(){
System.out.println(i);
}
}
*/
-
靜態內部類
爲了描述類和類的關係
只能共享外部類的 靜態的屬性和方法(房東和租客的關係)
創建方式:Outer.Inner in = new Outer.Inner();
public class OuterInner{ public static void main(String[] args){ Outer.Inner inner =new Outer.Inner(); inner.show(); } } class Outer{ int x=1; static int y=2; static class Inner{ int z=5; static int i=6; public void show(){ //System.out.println(x); 無法訪問的x System.out.println(y); System.out.println(z); System.out.println(i); } } }
-
局部內部類
在外部類的方法體中,永遠都不可以有static的聲明
1)如果能夠共享外部類的所有成員: 存在於非靜態方法中
2) 如果能夠共享外部類的靜態成員: 存在於靜態方法中
final修飾的局部變量 jdk8.0以後可以不加final(老師和學生的關係)
創建方式:Inner in = new Inner(); 內部類結束之後 所在的方法結束之前
public class OuterInner{ public static void main(String[] args){ Outer outer =new Outer(); outer.show(999); } } class Outer{ int a=1; //成員變量 static int b=2; //靜態變量 public void show(int c){ int d=8; //局部變量 class Inner{ //局部內部類 int x=9; public void test(){ System.out.println(a); System.out.println(b); // c d 是final最終變量 無法修改 System.out.println(c); System.out.println(d); System.out.println(x); } }// 類結束之後 Inner inner = new Inner(); inner.test(); //方法結束之前 } }
-
匿名內部類
某些情況下,一個類的名字並不重要,使用一之後就不再使用
這個名字就顯得很無用
創建方式:
new 父類/接口(){
};
匿名類可以共享的數據 取決於匿名內部類的位置 可能等價於上面三種形式
import java.util.*; public class OuterInner{ public static void main(String[] args){// 實現了Comparator接口的 無名的 類對象 Set<Integer> set =new TreeSet<>(new Comparator<Integer>(){ @Override public int compare(Integer x ,Integer y){ return y-x; //降序 } }); //Set<Integer> set =new TreeSet<>((x,y) -> y-x); jdk8.0lambda表達 //式 在部分場景下可以代替匿名內部類 Collections.addAll(set,5,3,4,1,2); System.out.println(set); } }
public class TestAnonyInner2{ public static void main(String[] args){ Student s1 = new Student(); s1.play(); Person james = new Person("james"){ @Override public void play(){ System.out.println("dunkdunkdunk!!!"); } }; james.play(); } } abstract class Person{ String name; public Person(String name){ this.name = name; } public abstract void play(); } class Student extends Person{ public Student(){ super("庫裏"); } @Override public void play(){ System.out.println("我是三分大神"); } }