java 基礎之內部類
阿新 • • 發佈:2018-12-26
java中內部類的寫法非常奇怪,個人覺得也不好理解,只需要瞭解一下它的語法就行。
概念:
1)在類的內部在定義一個類,類名不需要和檔案相同
2)內部類一旦通過編譯為生成兩個獨立的位元組碼檔案
3)內部類可以訪問外部類的私有成員而不破壞封裝
分類
1.成員內部類
1)成員內部類不能有static屬性和方法
2)必須先有外部類才能使用成員內部類
3)語法:
Outer out = new Outer();
Outer.Inner in = out.new Inner();
public class MyOutClazz { private int value = 100; class InnerClazz{ public void m(){ System.out.println(value); } } public MyOutClazz(int value) { this.value = value; } /** * 返回 #{bare_field_comment} * * @return #{bare_field_comment} */ public int getValue() { return value; } /** * 設定 #{bare_field_comment} * * @param value * #{bare_field_comment} */ public void setValue(int value) { this.value = value; } public void f(){ InnerClazz innerClazz = new InnerClazz(); innerClazz.m(); } }
public static void main(String[] args) {
MyOutClazz myOutClazz1 = new MyOutClazz(100);
myOutClazz1.new InnerClazz().m();;
MyOutClazz myOutClazz2 = new MyOutClazz(200);
myOutClazz2.new InnerClazz().m();;
}
執行結果
100
200
2.靜態內部類
1)不依賴外部類物件,可直接建立內部類物件
2)只能直接訪問外部類的靜態成員
3)語法:
Out.Inner inner = new Out.Inner();
我們看下面的例子,給MyOutClazz 增加一個靜態成員屬性 和 靜態內部類
static class InnerClazz2{
public void m(){
System.out.println(value2);
}
}
private static int value2 = 200;
public static void main(String[] args) { MyOutClazz myOutClazz1 = new MyOutClazz(100); // 1.建立成員內部類 MyOutClazz.InnerClazz innerClazz = myOutClazz1.new InnerClazz(); innerClazz.m(); // 2.建立靜態內部類 MyOutClazz.InnerClazz2 innerClazz2 = new MyOutClazz.InnerClazz2(); innerClazz2.m(); }
執行結果
100
200
3.區域性內部類
定義下方法內部,作用範圍和建立物件的範圍僅在方法主體中
我們看下面的例子
public interface Teacher {
public void teach();
}
public class TeachSystem {
public static void main(String[] args) {
Teacher teachSys = getTeachSys(1);
teachSys.teach();
}
public static Teacher getTeachSys(int val){
class EnglishT implements Teacher{
@Override
public void teach() {
System.out.println("English teacher");
}
}
class MathT implements Teacher{
@Override
public void teach() {
System.out.println("Math teacher");
}
}
if(val <= 10) {
return new EnglishT();
}else {
return new MathT();
}
}
}
我們可以將TeachSystem 的main 方法當成一個簡單的 選課系統 傳入引數val 根據一定的規則,選擇課程是英語還是數學,這樣設計我們很好的隱藏了內部的實現細節
執行結果
English teacher
而如果我們不使用部內部類,重新新建兩個 English和 math的類 ,一個學生要選課話,都能不執行我們這個系統,不調getTeachSys這個方法Teacher tea = new EnglishT();
tea.teach();
這樣直接自己來選擇課程了;4.匿名內部類
匿名內部類是一種特殊的區域性內部類,如果一個內部類滿足如下兩個特點,就可以改寫為匿名內部類
1)該內部類繼承自某個類或者實現某個介面
2)該內部類在整個方法,整個生命週期中只建立了一個物件
它的語法算java裡比較有特色的了,剛我們設計的那個選課系統就可以改為匿名內部類
public class TeachSystem {
public static void main(String[] args) {
Teacher teachSys = getTeachSys(1);
teachSys.teach();
}
public static Teacher getTeachSys(int val){
if(val <= 10) {
// 返回 math
return new Teacher() {
@Override
public void teach() {
System.out.println("math teacher");
}
};
}else {
// 返回 English
return new Teacher() {
@Override
public void teach() {
System.out.println("english teacher");
}
};
}
}
}
執行結果
math teacher