在java中关键字扩展是否要求派生类仅在创建父类实例时继承属性?

时间:2011-05-24 16:01:39

标签: java

如果我有A类,ClassB扩展ClassA。当ClassB尝试访问ClassA的属性,方法等时,是否会自动创建ClassA实例?

如果是这样,如果ClassA是一个抽象类会发生什么?我们不能手动创建抽象类的实例但是JVM如何处理这个场景或者ClassB如何在没有ClassA实例的情况下尝试访问ClassA的成员(因为它是抽象类)

3 个答案:

答案 0 :(得分:1)

没有ClassB,没有ClassA可以独立存在。必须通过new运算符创建Class的实例。要获得B的实例,必须在系统中调用,如:

new ClassB();

如果只有这样的电话:

new ClassA();

然后没有B的实例存在,所以ClassB中的任何东西(除了静态方法)都是无关紧要的。为简单起见,我忽略了通过反射创建新实例。

继承从父级传递到子级,因此子级可以访问父级的public,protected或package私有方法(取决于ClassA和ClassB的声明包);但是父母无法访问孩子的方法。但是,通过多态,可以优先于父方法执行子方法。

我认为你应该阅读一些Java Tutorial

答案 1 :(得分:0)

当一个类在Java中扩展另一个类,然后被实例化时,只有一个对象被创建,并且该对象具有其父类型的所有方法和变量,在法律上允许它们继承。您不必实例化这两个对象。另一种表达方式是:

假设您有A类:

public class ClassA{
  public int var1
  private int var2

  public void method1(){...}
  private void method2(){...}
}

还有B班:

public class ClassB extends ClassA{
  public int newVar1

  public void newMethod1(){...}
}

实际上,B类实际上是这样的:

public class ClassB extends ClassA{
  public int var1
  public int newVar1

  public void method1(){...}
  public void newMethod1(){...}
}

答案 2 :(得分:0)

我有B扩展A,每当你创建一个B时,B A所以A存在。它不作为单独的对象存在,但B是A,所以B具有A所具有的一切。 A可以在没有B的情况下存在。

如果A是抽象的,那么你就不能创建As。当你创建B时,它具有A的所有特性/方法,因为它 A.