31内部类
1.內部類的概念與分類
分類:
- 1。成員內部類
- 2。局部內部類(包含匿名內部類)
2.成員內部類的定義和使用
Body.java
package InnerClass;public class Body {public class Heart {public void beat() {System.out.println("心臟跳動,鵬鵬鵬");System.out.println("我叫:" + name);}}//外部類的成員變量private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}//外部類的方法public void bodyMethod(){System.out.println("外部類的方法");Heart heart = new Heart();//間接方式heart.beat();} }Demo01InnerClass.java
package InnerClass; /* * 如果一個事物的內部包含另一個事物,那么這就是一個類內部包含另外一個類 * 例如:身體和心臟的關系。汽車與發動機的關系。(心臟,發動機單獨工作無意義,只在里面工作才有意義) * * 分類: * 1。成員內部類 * 2。局部內部類(包含匿名內部類) * * 成員內部類的定義格式: * 修飾符 class 外部類名稱 { * 修飾符 class 內部類名稱{ * //... * } * //... * } * 注意:內用外,隨意訪問;外用內,需要內部類對象 * * 如何使用成員內部類?有兩種方式 * 1。間接方式:在外部類的方法當中,使用內部類;然后main只是調用外部類的方法。 * 2。直接方式,公式 * 外部類名稱.內部類名稱 對象名 = new 外部類名稱().new 內部類名稱(); * */ public class Demo01InnerClass {public static void main(String[] args) {Body body1 = new Body();//間接方式body1.bodyMethod();//外部類的方法//心臟跳動,鵬鵬鵬//我叫:nullSystem.out.println("====");Body.Heart heart = new Body().new Heart();heart.beat();//心臟跳動,鵬鵬鵬//我叫:null} }3.內部類的同名變量訪問
Outer.java
package InnerClass; //如果出現了重名現象,那么格式是:外部類名稱.this.內部類成員變量名 public class Outer {int num = 10;//外部類的成員變量public class Inner{int num = 20;//內部類的成員變量public void methodInner() {int num = 30;//內部類方法的局部變量System.out.println(num);//30局部變量,就近原則System.out.println(this.num);//20System.out.println(Outer.this.num);//10,外部類的成員變量}} }Demo02InnerClass.java
package InnerClass;public class Demo02InnerClass {public static void main(String[] args) {Outer.Inner inner = new Outer().new Inner();inner.methodInner();//30//20//10} }4.局部內部類定義
Outerr.java
package InnerClass; /* * 如果一個類是定義在一個方法內部的,那么這就是一個局部內部類 * "局部":只有當前所屬的方法才能使用它,出了這個方法外面就不能使用了。 * 定義格式 * 修飾符 class 外部類名稱{ * 修飾符 返回值類型 外部類方法名稱(參數列表) { * class 局部內部類名稱 { * //... * } * } * } * * 小節一下類的權限修飾符 * public>protect>(default)>private * 定義一個類的時候,權限修飾符規則: * 1。外部類:public/(default) * 2.成員內部類:public/protected/(default)/private * 3.局部內部類:什么都不能寫(不是default,default同一個包下還能使用) * */ public class Outerr {public void methodOuterr() {class Inner {//局部內部類int num = 10;public void methodInner(){System.out.println(num);}}Inner inner = new Inner();inner.methodInner();} }Demo03InnerClass.java
package InnerClass; //局部內部類的訪問 public class Demo03InnerClass {public static void main(String[] args) {Outerr outerr = new Outerr();outerr.methodOuterr();//10} }5.局部內部類的final
package InnerClass;/* * 局部內部類,如果希望訪問所在方法的局部變量,那么這個局部變量必須是【有效final的】 * 備注:從java1.8開始,只要局部變量事實不變,那么final關鍵字可以省略。 * 原因: * 1.new出來的對象在堆內存當中。 * 2。局部變量是跟著方法走的,在棧內存當中。 * 3。方法運行結束之后,立刻出棧,局部變量就會立刻消失。(num) * 4。但是new出來的對象(MyInner)會在堆當中持續存在,直到垃圾回收消失。 * 只要能保證局部變量不變,就可以復制一份在常量池當中。 * */public class MyOuter {public void methodOuter() {int num = 10;//所在方法的局部變量class MyInner{public void methodInner() {System.out.println(num);}}} }6.匿名內部類
MyInterface.java
package Demo01;public interface MyInterface {public abstract void method1();//抽象方法public abstract void method2(); }MyInterfaceImpl.java
package Demo01;public class MyInterfaceImpl implements MyInterface{@Overridepublic void method2() {System.out.println("實現類覆蓋方法222");}@Overridepublic void method1() {System.out.println("實現類覆蓋重寫了方法111");} }DemoMain.java
package Demo01; /*如果接口的實現類(或者是父類的子類),子需要使用唯一的一次 * 那么這種情況下就可以省略掉該類的定義i,而改為使用【匿名內部類】 * 匿名內部類的定義格式: * 接口名稱 對象名 = new 接口名稱() { * //覆蓋重寫所有抽象方法 * }; * 好處在于,不需要把他的實現類再寫,少一個類 * * 對“new 接口名稱() {....}”格式進行解析: * 1.new代表創建對象的動作 * 2.接口名稱就是匿名內部類需要實現哪個接口 * 3.{。。。}這才是匿名內部類的內容 * * 注意的問題: * 比如說這里面的MyInterfaceImpl只用了一次(new了一次),所以沒必要定義,直接使用匿名內部類就行 * 1.匿名內部類,在創建對象的時候,只能使用唯一一次(每次new的時候需要重寫大括號內部的內容) * 如果希望多次創建對象,而且類的內容一樣的話,那么就必須使用單獨定義的實現類。 * 2.匿名對象,在調用方法的時候,只能調用唯一一次。 * 如果希望同一個對象,調用多次方法,那么必須給對象起個名字。 * 3.匿名內部類是省略了實現類/子類名稱,但是匿名對象是省略了對象名稱 * 強調:匿名內部類和匿名對象不是一回事。 * */ public class DemoMain {public static void main(String[] args) { // MyInterface impl = new MyInterfaceImpl(); // impl.method1();//實現類覆蓋重寫了方法//使用匿名內部類,但不是匿名對象,對象名稱就叫objMyInterface objA = new MyInterface() {@Overridepublic void method1() {System.out.println("匿名內部類實現了方法1-A");}@Overridepublic void method2() {System.out.println("匿名內部類實現了方法2-A");}};//注意分號不要丟,這個大括號內部叫匿名內部類objA.method1();//匿名內部類實現了方法1objA.method2();//使用了匿名內部類,而且省略了對象名稱,也是匿名對象new MyInterface() {@Overridepublic void method1() {System.out.println("匿名內部類實現了方法1-B");}@Overridepublic void method2() {System.out.println("匿名內部類實現了方法2-B");}}.method1(); // objB.method1(); // objB.method2();//因為匿名對象無法調用第二次方法,所以需要再創建一個匿名內部類的匿名對象new MyInterface(){@Overridepublic void method1() {System.out.println("匿名內部類實現了方法1-B");}@Overridepublic void method2() {System.out.println("匿名內部類實現了方法2-B");}}.method2();//匿名內部類實現了方法1-A//匿名內部類實現了方法2-A//匿名內部類實現了方法1-B//匿名內部類實現了方法2-B} }總結
- 上一篇: 30四种权限修饰符
- 下一篇: 2021-11-09类作为成员变量类型