內部類:
內部類的定義 :
在一個類的內部又定義了一個類,里面的這個類就是內部類。
內部類可以定義在外部類的成員位置(與成員變量的位置相同)或局部位置(意思是,把類寫在外部類的方法里面)。
什么時候使用內部類 :
一個具體的事物里面還有一個具體的事物。比如汽車中有發動機。
1、成員內部類
1.將內部類,定義在了外部類的成員位置。
2.成員內部類,可以使用成員修飾符:public、static等。但是一般也不寫,因為開發也不怎么用。
3.成員內部類,畢竟是一個類,可以繼承,也可以實現接口...
4.調用規則:
內部類可以使用外部類的成員,包括私有(因為內部類沒有出去外部類的范圍)。[例1]
外部類要使用內部類的成員,必須要創建內部類的對象。
package com; public class Outer { private int a = 1; class Inner{ //在外部類成員的位置定義內部類 public void fun(){ System.out.println(a);//內部類可以使用外部類的成員。 } } } class test1{ public static void main(String[] args) { Outer.Inner oi = new Outer().new Inner(); //創建內部類的對象的格式。 oi.fun(); } }
結果:1
內部類中同名變量的調用:
package com; public class Outer { private int a = 1; class Inner{ //在外部類成員的位置定義內部類 private int a = 2; public void fun(){ int a = 3; System.out.println(a);//內部類可以使用外部類的成員。取所在方法的值 } } } class test1{ public static void main(String[] args) { Outer.Inner oi = new Outer().new Inner(); //創建內部類的對象的格式。 oi.fun(); } }
結果:3
package com; public class Outer { private int a = 1; class Inner{ //在外部類成員的位置定義內部類 private int a = 2; public void fun(){ int a = 3; System.out.println(this.a);//內部類可以使用外部類的成員。取所在類的值 } } } class test1{ public static void main(String[] args) { Outer.Inner oi = new Outer().new Inner(); //創建內部類的對象的格式。 oi.fun(); } }
結果:2
package com; public class Outer { private int a = 1; class Inner{ //在外部類成員的位置定義內部類 private int a = 2; public void fun(){ int a = 3; System.out.println(Outer.this.a);//內部類可以使用外部類的成員。取所在類的外部類的值 } } } class test1{ public static void main(String[] args) { Outer.Inner oi = new Outer().new Inner(); //創建內部類的對象的格式。 oi.fun(); } }
結果:1
局部內部類:
定義在成員方法里面。
package com; public class Outer { public void out(){ class Inner{//類定義在方法里面。 public void fun(){ System.out.println("aaa"); } } System.out.println("我是一個方法。"); Inner inner = new Inner();//在方法內部使用這個類。否則在main中沒法使用這個類。 inner.fun(); } } class test1{ public static void main(String[] args) { Outer o = new Outer(); o.out(); } }
結果:aaa
內部類的實際使用--匿名內部類 :
匿名內部類的格式:
new 接口或父類(){
重寫抽象方法
};
匿名內部類的使用舉例:
枚舉類:
要點:
- 使用的是enum關鍵字而不是class。
- 多個枚舉變量直接用逗號隔開。
- 枚舉變量最好大寫,多個單詞之間使用”_”隔開(比如:INT_SUM)。
- 定義完所有的變量后,以分號結束,如果只有枚舉變量,而沒有自定義變量,分號可以省略(例如上面的代碼就忽略了分號)。
- 在其他類中使用enum變量的時候,只需要【類名.變量名】就可以了,和使用靜態變量一樣。
最簡單的使用:
package com; enum Weekday{ SUN,MON,TUS,WED,THU,FRI,SAT } public class test2 { public static void main(String[] args) { System.out.println(Weekday.valueOf("mon".toUpperCase()));//MON for (Weekday w:Weekday.values()){ System.out.println(w + ".ordinal() ===>" +w.ordinal()); } // SUN.ordinal() ===>0 // MON.ordinal() ===>1 // TUS.ordinal() ===>2 // WED.ordinal() ===>3 // THU.ordinal() ===>4 // FRI.ordinal() ===>5 // SAT.ordinal() ===>6 } }
常用的方法和功能:
1、Weekday.valueOf() 方法:
它的作用是傳來一個字符串,然后將它轉變為對應的枚舉變量。前提是你傳的字符串和定義枚舉變量的字符串一抹一樣,區分大小寫。如果你傳了一個不存在的字符串,那么會拋出異常。
package com; enum Weekday{ SUN,MON,TUS,WED,THU,FRI,SAT } public class test2 { public static void main(String[] args) { System.out.println(Weekday.valueOf("mon".toUpperCase())); } }
結果:MON
2、Weekday.values()方法:
這個方法會返回包括所有枚舉變量的數組。在該例中,返回的就是包含了七個星期的Weekday[]。可以方便的用來做循環。
枚舉變量的.ordinal()方法:
默認情況下,枚舉類會給所有的枚舉變量一個默認的次序,該次序從0開始,類似於數組的下標。而.ordinal()方法就是獲取這個次序(或者說下標)
package com; enum Weekday{ SUN,MON,TUS,WED,THU,FRI,SAT } public class test2 { public static void main(String[] args) { System.out.println(Weekday.values()); for (Weekday w:Weekday.values()){ System.out.println(w + ".ordinal() ===>" +w.ordinal()); } } }
結果:
3、枚舉變量的toString()方法:
該方法直接返回枚舉定義枚舉變量的字符串,比如MON就返回【”MON”】。
5、枚舉變量的compareTo()方法:
該方法用來比較兩個枚舉變量的”大小”,實際上比較的是兩個枚舉變量的次序,返回兩個次序相減后的結果,如果為負數,就證明變量1”小於”變量2 (變量1.compareTo(變量2),返回【變量1.ordinal() - 變量2.ordinal()】)
6、枚舉類的name()方法:
它和toString()方法的返回值一樣。