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;
}
}