內部類(一)
阿新 • • 發佈:2018-12-26
1.把一個類放在另一個類的內部定義,定義在其他類內部的類被稱為內部類,包含內部類的類被稱為外部類。內部類的主要作用有:
1)內部類提供了更好的封裝。
2)內部類可以直接訪問外部類的私有資料,因為內部類被當作是外部類的成員,外部類也可以訪問內部類的私有資料 點選開啟連結
內部類除了需要定義在其他類裡面之外,還有:
1)內部類比外部類可以多使用三個修飾符:private 、protected、static
2)非靜態內部類不能有靜態內部成員。
3)內部類可以看作是一個類成員,所以可以用private,protected,public修飾。
- public class cow{
- private int age;
- public
- this.age = age;
- }
- private class cowleg{
- private String color;
- private double length;
- private cowleg(String color,double length){
- this.color = color;
- this.length= length;
- }
- public void info(){
- System.out.println("年齡為"+age); //內部類可以訪問外部類的私有成員
- System.out.println("顏色為"+color+"長度為"
- }
- }
- public void into(){
- cowleg one = new cowleg("白色",0.99);//為什麼這個構造cowleg物件不能放在main中實現呢?
- one.info();//因為內部類cowleg可以看作是一個cow的非靜態成員,那麼它構造器也可以看作cow的非靜態成員,不能單獨呼叫,必須使用cow的物件去呼叫。
- }
- public static void main(String[] args){
- cow hua = new cow(4);
- hua.into(); //使用cow物件hua去呼叫方法into,通過into去呼叫cowleg的構造器
- }
- }
如果想把cowleg構造器放在mian方法實現,可以有
- public class cow{
- private int age;
- public cow(int age){
- this.age = age;
- }
- private class cowleg{
- private String color;
- private double length;
- private cowleg(String color,double length){
- this.color = color;
- this.length= length;
- }
- public void info(){
- System.out.println("年齡為"+age); //內部類可以訪問外部類的私有成員
- System.out.println("顏色為"+color+"長度為"+length);
- }
- }
- public static void main(String[] args){
- cow hua = new cow(5);
- cowleg one = hua.new cowleg("白色",0.99); //使用cow物件去呼叫cowleg的構造器
- one.info();
- }
- }
注:cowleg類可以直接訪問cow類的private例項變數是因為非靜態內部類物件裡,儲存了一個它所寄生的外部類物件的引用(當呼叫非靜態內部類的例項方法時,必須有一個非靜態內部類例項,非靜態內部類例項必須寄生在外部類例項中。)
2.當非靜態內部類的方法訪問某個變數時,系統優先在該方法裡查詢是否存在該名字的區域性變數。如果沒有,查詢該內部類裡是否有該名字的成員變數。如果沒有,則在外部類
裡找是否有同名字的成員變數。如果再沒有,則編譯器報錯
外部類成員變數,內部類成員變數與內部類裡方法的區域性變數同名時,可以使用this、外部類名.this作為限定來區分
- public class test25{
- private int one = 5;
- class zilei{
- private int one = 8;
- public void info(){
- int one = 10;
- System.out.println(test25.this.one);
- System.out.println(this.one);
- System.out.println(one);
- }
- }
- public static void main(String[] args){
- test25 first = new test25();
- zilei second = first.new zilei();
- second.info();
- }
- }
3.非靜態內部類裡不能有靜態方法,靜態成員變數和靜態初始化塊。
4.靜態內部類。 注:static不能修飾外部類,只能修飾內部類
根據靜態成員不能訪問非靜態成員的規則,靜態內部類不能訪問外部類的例項成員。即使是靜態內部類的例項方法也不能訪問外部類的例項成員,只能訪問外部類的靜態成員
(靜態內部類可以看做是外部類的靜態成員,所以在外部類載入的時候就裝進記憶體了,而這時外部類例項還沒建立。)
5.java還允許在接口裡定義內部類,接口裡定義的內部類預設使用public static修飾(因為介面沒有物件,內部類要麼寄生在外部類的物件中,要麼隨外部類載入一起建立。),也就是說,介面內部類只能是靜態內部類