xie-wen-hui
船帆虽小,却也能远航!

1、使用接口接收
package p5;

public class Test {

    public static void main(String[] args) {
        /**
         * 1、frock类型class p5.Frock; inner类型是class p5.Frock$1InnerH3
         * 2、frock.h2()返回对象类型是其实是实现接口InnerH3类的对象类型,
         * 属于外部类Frock的成员,所以不需要向下转型
         * */
        Frock frock = new Frock();
        Inner inner = frock.h2();
        inner.show();
        System.out.println(frock.getClass());
        System.out.println(inner.getClass());
    }
}

//1、使用接口把内部类InnerH3接出来
interface Inner{ public void show();}

//使用子类把InnerH3接出来


//外部类Frock
class Frock {
    int a1 = 20;
    //局部内部类
    public Inner h2(){
        class InnerH3 implements Inner{
            int a1 = 10;
            public void show(){
                System.out.println("------------------");
                //内部类成员与外部类成员重名时,在内部类调用属性遵循就近原则
                System.out.println("局部内部类-a1:"+a1);
                //调用外部类成员名使用必须 外部类名.this.重名属性名,this.重名属性名都不行
                System.out.println("外部类属性-a1:"+Frock.this.a1);
            }
        }
        InnerH3 innerH3 = new InnerH3();
        innerH3.show();
        return innerH3;
    }

}

输出:
	------------------
	局部内部类-a1:10
	外部类属性-a1:20
	------------------
	局部内部类-a1:10
	外部类属性-a1:20
	class p5.Frock
	class p5.Frock$1InnerH3
2、使用抽象类接收
package p5;

public class Test1 {
    public static void main(String[] args) {
        /**分析:
         * 1、frock1对象类型是class p5.Frock1,
         * 而inner1类型是 class p5.Frock1$1InnerH3,所以需要向下转型
         * 2、 frock1.h2()返回对象是抽象类的子类,转成抽象类类型Inner1时,所以需要向下转型
         * */
        Frock1 frock1 = new Frock1();
        Inner1 inner1= (Inner1) frock1.h2();
        inner1.show();
        System.out.println(frock1.getClass());
        System.out.println(inner1.getClass());
    }
}

//1、使用接口把内部类InnerH3接出来
//interface Inner{ public void show();}

//2、使用抽象类把InnerH3接出来
abstract class  Inner1{  //
    /**第一步,建一个抽象类和抽象方法,
     * 给h2()方法提供一个接受内部类对象
     * */
    public void show(){}
}

//外部类Frock
class Frock1 {
    int a1 = 20;
    //局部内部类
    public Inner1 h2(){
        /**
         * 第二步,让内部类继承抽象类,
         * 然后返回内部类对象,让抽象类接收
         * */
        class InnerH3 extends Inner1{
            int a1 = 10;
            public void show(){
                System.out.println("------------------");
                //内部类成员与外部类成员重名时,在内部类调用属性遵循就近原则
                System.out.println("局部内部类-a1:"+a1);
                //调用外部类成员名使用必须 外部类名.this.重名属性名,this.重名属性名都不行
                System.out.println("外部类属性-a1:"+Frock1.this.a1);
            }
        }
        InnerH3 innerH3 = new InnerH3();
        innerH3.show();
        return innerH3;
    }
}
posted on 2021-02-21 07:24  xie-wen-hui  阅读(62)  评论(0编辑  收藏  举报