高級類特性-(類的成員之一:內部類)
內的成員之一:內部類(屬性、方法、構造器、代碼塊) 能夠有四種權限訪問修飾符java
注意:外部類 只有兩種 public 和 defaultsql
定義 : 能夠將一個類的定義放在另外一個類定義的內部,這就是內部類 -thinking in Java後端
用法:若是一個類 僅跟本類關係密切的話 對於其餘類但願隱藏 就可使用內部類 例ArrayList中的 Itr架構
一.成員內部類併發
成員內部類也是最普通的內部類,它是外圍類的一個成員。分佈式
在成員內部類中要注意兩點,第一:成員內部類中不能存在任何static的變量和方法;第二:成員內部類是依附於外圍類的,因此只有先建立了外圍類纔可以建立內部類。ide
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對象信息。這些類文件的命名有嚴格的規則:外圍類的名字,加上$,再加上內部類的名字。若是內部類是匿名的,編譯器會簡單地產生一個數字做爲其標識符。 歡迎工做一到五年的Java工程師朋友們加入Java羣: 891219277羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!