我看到子类的构造方法被用于具有父类(super class)类型的变量。例如:
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
formatter
是 DateFormat
类型对象还是 SimpleDateFormat
类型?由于 SimpleDateFormat
类继承自 DateFormat
,因此它可能比其父类(super class)拥有更多的方法。 formatter
调用这些函数的实例是否只能存在于 SimpleDateFormat
而不是 DateFormat
中?在这种情况下,DateFormat
和 SimpleDateFormat
可以互换吗?如:
SimpleDateFormat formatter = new DateFormat ("yyyy-MM-dd");
最佳答案
formatter
的运行时类型由用于实例化它的构造函数确定,其编译时类型是您在声明中使用的类型。您无法在格式化程序上调用存在于其实际运行时类型而不是其声明类型上的方法,除非您使用强制转换来解析方法调用。
顺便说一句,您可以通过简单的实验来回答自己的问题:
public class SuperClass {
public void test() {
System.out.println("Test");
}
public static class SubClass extends SuperClass {
public void testSub() {
System.out.println("Test sub");
}
@Override
public void test() {
System.out.println("Override test");
}
}
public static void main(String[] args) {
SuperClass sc = new SuperClass();
sc.test(); // prints Test
sc = new SubClass();
sc.test(); // prints Override test
sc.testSub(); // does not compile
((SubClass) sc).testSub(); // prints Test sub
}
}
关于java - 父类(super class)类型对象的子类的构造方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25811227/