2011-05-24 34 views
0

如果我有Class A和ClassB扩展ClassA。 ClassB实例是否被自动创建当ClassB尝试访问ClassA的属性,方法等?java中的关键字扩展是否只需要派生类继承父类实例时创建的属性?

如果是这样,如果ClassA是抽象类会发生什么?我们不能手动创建抽象类的实例,但JVM如何处理这种情况,或者ClassB如何尝试访问没有ClassA实例的ClassA成员其抽象类)

+0

也许这篇文章会回答你的问题:http://www.javaworld.com/javaworld/jw-11- 2001/jw-1102-java101.html – 2011-05-24 16:12:11

回答

1

没有ClassA可以独立存在没有ClassB。一个Class的实例必须通过new运算符创建。为了得到B的情况下,必须有系统调用地方,比如:

new ClassB(); 

如果只有调用,如:

new ClassA(); 

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

继承从父项流向子项,所以子项可以访问父项的公共,受保护或包私有方法(取决于ClassA和ClassB的声明包);但父母不能访问孩子的方法。但是通过多态性可以优先于父方法执行子方法。

我想你应该读一些Java Tutorial

+2

你有它倒退。 ClassB是一个ClassA,如果B存在,它是一个A,因此隐式存在。 A可以存在没有B.因为B延伸A. – hvgotcodes 2011-05-24 16:07:24

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(){...} 
} 
0

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

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