[英]Constructor method of subclass for a superclass type object?
我已经看到子类的构造方法用于具有超类类型的变量。 例如:
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
formatter
是DateFormat
类型对象还是SimpleDateFormat
类型? 由于类SimpleDateFormat
继承自DateFormat
,因此它可能比其超类具有更多的方法。 实例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实例的类型由用于创建它的构造函数确定,并且不能更改。
可以在实例上调用的方法取决于用于引用实例的变量的类型。 因此,您可以在同一实例上调用不同的方法集,具体取决于用于引用它的变量的类型。
仅用于引用实例的变量的类型可以是:
在类层次结构中,变量越高,使用该变量的代码就越通用(因此可重用)。 作为设计规则,应将接口用作变量(特别是参数)类型。
建议您阅读以下内容: http : //en.wikipedia.org/wiki/Liskov_substitution_principle
formatter
有两种类型, DateFormat
和SimpleDateFormat
。 调用SimpleDateFormat
的构造函数后,它也会调用DateFormat
的构造函数-但它只是一个对象。
要从SimpleDateFormat
访问方法,可以将其SimpleDateFormat
为:
SimpleDateFormat sdf = (SimpleDateFormat) formatter;
仅当formatter
的类型为SimpleDateFormat
或其任何子类时,此方法才有效。 以下行将产生编译错误:
SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateTimeInstance();
顺便说一句,我从一开始就将formatter
声明为SimpleDateFormat
。 将其声明为DateFormat
而不是DateFormat
将不会带来任何好处-这浪费您的CPU。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.