如果我有Class A和ClassB扩展ClassA。 ClassB实例是否被自动创建当ClassB尝试访问ClassA的属性,方法等?java中的关键字扩展是否只需要派生类继承父类实例时创建的属性?
如果是这样,如果ClassA是抽象类会发生什么?我们不能手动创建抽象类的实例,但JVM如何处理这种情况,或者ClassB如何尝试访问没有ClassA实例的ClassA成员其抽象类)
如果我有Class A和ClassB扩展ClassA。 ClassB实例是否被自动创建当ClassB尝试访问ClassA的属性,方法等?java中的关键字扩展是否只需要派生类继承父类实例时创建的属性?
如果是这样,如果ClassA是抽象类会发生什么?我们不能手动创建抽象类的实例,但JVM如何处理这种情况,或者ClassB如何尝试访问没有ClassA实例的ClassA成员其抽象类)
没有ClassA可以独立存在没有ClassB。一个Class的实例必须通过new运算符创建。为了得到B的情况下,必须有系统调用地方,比如:
new ClassB();
如果只有调用,如:
new ClassA();
然后没有B的实例存在,所以无论是在ClassB的(除了静态方法)是无关紧要的。为了简单起见,我忽略了通过反射创建新实例。
继承从父项流向子项,所以子项可以访问父项的公共,受保护或包私有方法(取决于ClassA和ClassB的声明包);但父母不能访问孩子的方法。但是通过多态性可以优先于父方法执行子方法。
我想你应该读一些Java Tutorial。
你有它倒退。 ClassB是一个ClassA,如果B存在,它是一个A,因此隐式存在。 A可以存在没有B.因为B延伸A. – hvgotcodes 2011-05-24 16:07:24
当一个类在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(){...}
}
我有B扩展A,每当你创建一个B,B 是一个这样一个A存在。它不是作为一个单独的对象存在,但是B是一个A,所以B具有A的一切。 A可以不存在B而存在。
如果A是抽象的,那么你不能创建As。当你创建B时,它具有A的所有合适的/方法,因为它是 A.
也许这篇文章会回答你的问题:http://www.javaworld.com/javaworld/jw-11- 2001/jw-1102-java101.html – 2011-05-24 16:12:11