繁体   English   中英

超类类型对象的子类构造方法?

[英]Constructor method of subclass for a superclass type object?

我已经看到子类的构造方法用于具有超类类型的变量。 例如:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

formatterDateFormat类型对象还是SimpleDateFormat类型? 由于类SimpleDateFormat继承自DateFormat ,因此它可能比其超类具有更多的方法。 实例formatter能否仅在SimpleDateFormat存在这些函数,而在DateFormat不存在? 在这种情况下, DateFormatSimpleDateFormat是否可以互换? 如:

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有两种类型, DateFormatSimpleDateFormat 调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM