今天在工作时,调用工厂类中的一个方法,该方法返回的是实现一个接口的对象,然后调用该对象的的方法(这个方法接口并没有)时,竟然发现无法调用,一时感到奇怪,不知为何?
回来想了想,查了查资料才知道,原因如下:
Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
这个在编译时,创建的接口类引用已经被确定,即它所能使用的属性,方法都已经固定,只有这个接口提供的属性和方法才能被访问。而在运行时动态的返回的接口实现类对象,无法访问他的扩展方法和扩展属性
public class JavaSETest {
@Test
public void testExtends() {
RootClass root = new Child();
root.test1();//这是对Test1的方法重写!
// root.test2();//出现错误,无法获取
Child child = (Child)root;//转型后就可以访问了
child.test2();//i am here!
RootInterface rootInterface = new Child();
rootInterface.test1();//这是对Test1的方法重写!
//rootInterface.test2();报错
Child child2 = (Child)rootInterface;//向下转型即可获取
child2.test2();//i am here!
}
}
class RootClass {
public void test1() {
System.out.println("where are you!");
}
}
class Child extends RootClass implements RootInterface{
public void test2() {
System.out.println("i am here!");
}
public void test1() {
System.out.println("这是对Test1的方法重写!");
}
}
interface RootInterface {
public void test1();
}
千里之堤毁于蚁穴,还是希望自己能掌握好基础,做一名优秀的程序员。