java核心技術-內部類
高階類特性-(類的成員之一:內部類)
內的成員之一:內部類(屬性、方法、構造器、程式碼塊) 可以有四種許可權訪問修飾符
注意:外部類 只有兩種 public 和 default
定義 : 可以將一個類的定義放在另一個類定義的內部,這就是內部類 -thinking in Java
用法:如果一個類 僅跟本類關係密切的話 對於其他類希望隱藏 就可以使用內部類 例ArrayList中的 Itr
一.成員內部類
成員內部類也是最普通的內部類,它是外圍類的一個成員。
在成員內部類中要注意兩點,第一:成員內部類中不能存在任何static的變數和方法;第二:成員內部類是依附於外圍類的,所以只有先建立了外圍類才能夠建立內部類。
public class TestInnerClass { public static void main(String[] args) { //建立非靜態內部類的物件 Person p = new Person(); Person.Computer pc = p.new Computer(); pc.setName("IBM"); //System.out.println(pc.getName()); } } class Person { private String name = "張三"; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } public class Computer{ private String name = "lenovo"; public String getName() { return name; } public void setName(String name) { System.out.println("setName 方法區域性變數name: " + name); System.out.println("Computer 的屬性name:" + this.name); System.out.println("外部內Person 屬性的name:" + Person.this.name); this.name = name; } } }
二.區域性內部類
有這樣一種內部類,它是巢狀在方法和作用於內的,對於這個類的使用主要是應用與解決比較複雜的問題,想建立一個類來輔助我們的解決方案,到那時又不希望這個類是公共可用的,所以就產生了區域性內部類,區域性內部類和成員內部類一樣被編譯,只是它的作用域發生了改變,它只能在該方法和屬性中被使用,出了該方法和屬性就會失效。(做Java後端 用法極少見 本人三年開發 從沒見過有人用過)
public class TestInnerClass2 { //區域性內部類:如下方式使用非常的少 private void show(){ class Inner{ } } //如果一個類僅適用於當前方法時,可以宣告如下方式 public static Comparator getComparator(){ class MyComparator implements Comparator{ @Override public int compare(Object o1, Object o2) { return 0; } } return new MyComparator(); } public static void main(String[] args) { Comparator comparator = TestInnerClass2.getComparator(); } }
三.匿名內部類
注意:
- 1.匿名內部類是沒有訪問修飾符的
- 2.想使用外部的一個變數 該變數要用final修飾 -java8開始不需要
public class TestInnerClass2 {
public static Comparator getComparator1(){
Comparator com = new Comparator(){ //匿名內部類實現的Comparator介面,new的是匿名內部類的構造器
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return 0;
}
};
return com;
}
public static void main(String[] args) {
Comparator comparator = TestInnerClass2.getComparator1();
/* comparator.compare(o1, o2);*/
}
}
四.靜態內部類
在java提高篇-----關鍵字static中提到Static可以修飾成員變數、方法、程式碼塊,其他它還可以修飾內部類,使用static修飾的內部類我們稱之為靜態內部類,不過我們更喜歡稱之為巢狀內部類。靜態內部類與非靜態內部類之間存在一個最大的區別,它是屬於類本身,而不是某個物件。
public class TestInnerClass {
public static void main(String[] args) {
//建立靜態內部類的例項
Person.Mobile pm = new Person.Mobile();
pm.show();
}
}
class Person {
//靜態內部類
static class Mobile{
public void show(){
System.out.println("這是靜態內部類的方法");
}
}
}
五.內部類識別符號
由於每個類都會產生一個.class檔案,其中包含了如何建立該型別的物件的全部資訊。您可能猜到了,內部類也必須生成一個.class檔案以包含它們的Class物件資訊。這些類檔案的命名有嚴格的規則:外圍類的名字,加上$,再加上內部類的名字。
如果內部類是匿名的,編譯器會簡單地產生一個數字作為其識別符號。