JAVA基礎(58)---內部類
內部類
指的是定義在類的內部的類。
成員內部類
定義在類的內部,方法的外部的內部類,稱為成員內部類
區域性內部類
指的是定義在方法內的內部類,稱為區域性內部類。
內部類的定義形式
class{
class{
}
}
思考問題
①如何建立內部類的物件?
外部類類名.內部類類名 物件名稱 = new 外部類().new 內部類();
要產生內部類,首先需要產生外部類(內部類是外部類的一個成員,對於成員的訪問我們都需要物件)
②對於包含了內部類的類,編譯之後,會產生幾個.class位元組碼檔案?
產生兩個位元組碼檔案
內部類的位元組碼檔案的名稱為 外部類$內部類.class
③ 內部類能否訪問外部類的私有的成員屬性? 可以
內部類的構成和普通類的構成是一樣,而且內部類能直接訪問外部類的成員,包括私有的成員
④ 內部類能否使用private public protected進行修飾
可以。但是內部類使用private修飾之後,在其他類中訪問是不方便的
⑤對於內部類中宣告的變數,類似於外部類中的區域性變數,只能在內部類中使用,而不能在外部類中使用。
⑥區域性內部類不能在外部產生該內部類的物件,要產生該區域性內部類的物件,只能在方法內部產生。但是對於區域性內部類編譯之後也會產生兩個clas位元組碼檔案。對於區域性內部類,要想使用方法的區域性變數,那麼該變數一定是 final。jdk8 會自動為該變數新增 final 修飾
public class OutterClass {
private int num = 10;
private OutterClass.innerClass ic;
public OutterClass() {
System.out.println("outterclass 構造方法");
}
public void printInfo() {
System.out.println(num );
}
private class innerClass{//成員內部類
int a = 100;
public innerClass() {
System.out.println("innerClass 構造方法");
}
public void show() {
num = 200;
System.out.println(num);
printInfo();
}
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public OutterClass.innerClass getIc() {
return ic;
}
public void setIc() {
this.ic = new OutterClass().new innerClass();;
}
public static void main(String[] args) {
OutterClass oc = new OutterClass();
OutterClass.innerClass ic = new OutterClass().new innerClass();
System.out.println(oc);
System.out.println(ic);
System.out.println("-----------------------");
ic.show();
}
}
public class OutterClass2 {
public void test() {
final int num = 20;
class methodInnerClass{
public void show2() {
System.out.println(num);
}
}
methodInnerClass mc = new methodInnerClass();
mc.show2();
}
public void demo() {
}
public static void main(String[] args) {
OutterClass2 oc2 =new OutterClass2();
oc2.test();
}
}
public class Test {
public static void main(String[] args) {
OutterClass oc = new OutterClass();
oc.setIc();
Object obj = oc.getIc();
System.out.println(obj);
}
}