高級類特性 (類的成員之一:內部類) 內的成員之一:內部類(屬性、方法、構造器、代碼塊) 可以有四種許可權訪問修飾符 註意:外部類 只有兩種 public 和 default 定義 : 可以將一個類的定義放在另一個類定義的內部,這就是內部類 thinking in 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對象信息。這些類文件的命名有嚴格的規則:外圍類的名字,加上$,再加上內部類的名字。
如果內部類是匿名的,編譯器會簡單地產生一個數字作為其標識符。