【问题标题】:What is the difference between new <childclass>() and new <parentclass>()?new <childclass>() 和 new <parentclass>() 有什么区别?
【发布时间】:2013-09-13 06:29:43
【问题描述】:

我是一个java新手,所以请帮助我理解这一点。

例如

class a{...}
class b extends a{
   public static void main(...){
      a x = new a();
      b y = new b();
      a z = new b();
    }

这三个实例有什么区别?我应该什么时候使用它们?

编辑:更正最后一条语句

【问题讨论】:

  • 第三条语句将无法编译。
  • 您可以为 b 创建一个实例并将其分配给 a... a x = new b();
  • @Juvanis:第三条语句将编译。
  • @Aniket 帖子已编辑,请参阅以前的版本。
  • @Juvanis:哦!对不起。我没有注意到。

标签: java class instance extends


【解决方案1】:

您可以使用a 作为代码重用方法的参数..即我们可以定义一个方法(带有参数a),使其适用于任何派生类(b,..)


例如:考虑用这个方法读取一个Stream

public void Read(Stream s)
{
   //read s
}

现在您可以在 Stream 的所有 deriving 类中重用此方法

Read(new FileStream(PATH));//read File
Read(new NetworkStream(URL));//read url
Read(new MemoryStream(object));//read memory object

【讨论】:

    【解决方案2】:

    这不会编译

    b z = new a();
    

    你的意思可能是

    a z = new b();
    

    即将子类对象分配给父类引用以利用多态性

    基本上,如果您将子类型对象分配给超类引用,运行时多态性 会确保 实例方法的子类型版本调用,即如果它也已在父类中定义并且您当然希望覆盖它。如果不是,则调用透明地回退到超类版本。

    作为旁注,请使用CapitalCamelCase 上课。

    【讨论】:

      【解决方案3】:

      a z=new b();这是运行时多态性

      class a{...}
      class b extends a{
         public static void main(...){
            a x = new a();
            b y = new b();
            a z = new b();
          }
      

      a x=new a(); -> 这是父类的对象。

      b y =new b();y 是子类的对象。

      a z=new b();z 是父类引用子实例的对象

      假设如果你在父类中有一些函数(hello()),而子类覆盖了函数(hello()),那么你的 z 对象使用那个函数();仅在子类中,子类中的其他功能不能用于该对象(z)。

      点击link了解更多信息

      【讨论】:

      • 请解释答案,仅链接是不够的,因为将来如果链接无效,那么您的回答将毫无用处。
      • 所以如果我理解正确的话,如果扩展类多了两个新函数,那么z就无法访问这两个函数了,因为虽然它指的是扩展类,但它仍然是一个对象的父类,其中这些功能不可用。我说的对吗?
      【解决方案4】:

      首先请遵守java约定。类名以大写字母开头,方法/变量名以camle大小写。

      class A{...}
      class B extends A{
         public static void main(...){
            A x = new A();
            B y = new B();
            B z = new A(); // will not work
          }
      

      声明 1 & 2:A x = new A(); & B y = new B(); 这是创建对象的正常方式。您有一个 A 类型的引用,指向 A 类型的对象(同一类)。第二个也是一样。

      声明 3:B z = new A(); 这不起作用,因为您不能使用子类类型的引用来指向超类的对象,因为您的子类引用可以具有未在超类对象中定义的方法。

      您可能想尝试A z = new B(); - 它被称为多态。谷歌该术语以获取更多信息。那里有很多 tuts。

      【讨论】:

        猜你喜欢
        • 2016-03-20
        • 2018-08-02
        • 2011-11-22
        • 2018-06-04
        • 2012-12-29
        • 2017-10-31
        • 2011-04-23
        • 2014-02-10
        • 1970-01-01
        相关资源
        最近更新 更多