類的編碼規則:
1. 一個.java文件中可以有很多類
2. public權限的類最多只能有一個 ,.java文件的文件名必須是public類的全名
3. 如果沒有public類, 那麼文件名可以隨便命名
4. 將一個類定義在另一個類裏面, 這樣的類就稱爲內部類
5. javac編譯.java文件的時候 , 會爲每個類生成一個.class文件
6. 內部類的文件名形式爲Outer$Inner1.class
1. 成員內部類: 下面的代碼定義了一個成員內部類
public class Outer {
privateInteger num= 0;
private class Inner1 {
privateInteger num= 1;
public void print() {
System.out.println("inner1 print outer's num = "+ Outer.this.num);
}
}
protected classInner2 {
privateInteger num= 2;
public void print() {
System.out.println("inner2 print outer's num = "+ Outer.this.num);
}
}
public voidprint() {
System.out.println("outer print inner1's num1 = "+ new Inner1().num);
System.out.println("outer print inner2's num2 = "+ new Inner2().num);
}
public staticvoidmain(String[] args) {
Outer outer = new Outer();
outer.newInner1().print();
outer.print();
outer.newInner2().print();
}
}
代碼分析:
- 內部類可以用protected和private關鍵字來進行修飾
- 在內部類的print()方法中, 我們可以看到成員內部類可以任意訪問外部類的私有變量和方法
- 成員內部類擁有和外部類擁有同名的變量num和方法print(), 我們在內部類中通過Outer.this.num來調用外部類的同名變量和同名方法
- 外部類調用成員內部類的變量num和方法print()的時候需要先實例化一個內部類的對象newInner1()才能調用
- 成員內部類的實例化操作,要先實例化外部類Outerouter = new Outer();, 然後通過outer對象實例化一個內部類outer.newInner1()
2.靜態內部類:
public class Outer {
private staticInteger count= 0;
public void print() {
System.out.println("outer print inner3 count = "+ new Inner3().count);
}
public staticclassInner3 {
privateInteger count= 3;
public void print() {
System.out.println("inner2 print outer's num = "+ Outer.count);
}
}
public staticvoidmain(String[] args) {
Outer outer = new Outer();
Outer.Inner3inner3 =new Outer.Inner3();
inner3.print();
outer.print();
}
}
代碼分析:
1. 靜態內部類比成員內部類多了一個static修飾符
2. 靜態內部類不依賴於外部類來進行實例化
3. 靜態類不能使用外部類的非static變量 , 要使用的話只能通過實例化一個外部類變量來使用
3. 局部內部類
public class Outer {
privateInteger count= 0;
public void print() {
classInner4 extendsOuter {
privateInteger num= 4;
public String str() {
return this.num.toString();
}
}
System.out.println("outer print inner4's num = "+ new Inner4().str());
}
public staticvoidmain(String[] args) {
newOuter().print();
}
}
局部內部類是定義在一個方法中或者一個代碼塊裏面的類 , 作用域就在定義該內部類的方法中或者代碼塊
局部內部類不能有public、protected、private以及static修飾符
4.匿名內部類:
public abstract class AbstractOuter {
public abstractInteger count();
}
public class Outer {
public staticvoidprint(AbstractOuter outer) {
intcount = 10;
System.out.println("outer print count = "+ outer.count(count));
}
public staticvoidmain(String[] args) {
inttoAdd = 10;
print(newAbstractOuter() {
@Override
publicInteger count(intcount) {
returncount + toAdd;
}
});
}
}
代碼分析:
1. 一個抽象類或者接口是沒有辦法直接new的,我們必須要先有實現類才能new出來它的實現類實例。
2. 所以在mian方法中直接使用匿名內部類來創建一個AbstractOuter實例。
3. JDK1.8之前, 內部類要想訪問方法中的參數toAdd, 參數toAdd必須要用final修飾符, 在JDK1.8中可以不加final