1

我无法清楚地了解 Java 中的继承。例如,我有:

class A
{ 
     ...
     public void MethodA();
}

一切都清楚了。然后我想要一个(子)类:

class B extends A
{
    ...
    public void MethodB();
}

然后我创建一个A. 然后我想获得一个B拥有所有东西的实例A。我想做一些类似的东西,aA = new B();但得到一个错误。

使用这个东西不是很舒服:

A aA = new A(...);
B aB = new B(null,null,...);
aB = aA

我应该如何正确地做到这一点并清楚地了解 Java 中的继承?

UPD:那么我怎样才能获得一个拥有 A 的所有东西的 B 实例?

4

4 回答 4

4

听起来您首先想要一个实例B。一旦有了这样的实例,您就可以在需要时使用A B

换句话说,每个 的实例B自动也是 的一个实例A

这称为里氏替换原则

于 2013-06-30T07:40:53.847 回答
1

在您的示例中,A - 超类,B - 子类。

子类拥有其超类的所有属性和操作(因为子类继承了其超类的所有属性和操作)。这意味着子类对象可以做它的超类可以做的任何事情。结果,我们可以在需要超类实例时替换子类实例,一切都会正常工作。这称为可替代性。

于 2013-06-30T07:49:03.780 回答
1

您需要了解IS-A关系。让我们讨论一个员工和经理关系的例子。

class Employee{
    public Employee(){
        System.out.println("Employee obj");
    }
}

class Manager extends Employee{
    public Manager(){
        System.out.println("Manager obj");
    }
}

通过扩展Employee,我们将Manager声明为Employee的专业化。因此,每个Manager都是Employee但每个Employee都不是Manager

Employee类型的引用可以引用满足IS-A关系的对象。因此,这些写法是完全合法的:

Employee emp1 = new Employee();
Employee emp2 = new Manager();

但是,如果我们尝试写

Manager man1 = new Employee(); //Wrong: Compilation error.

这违反了IS-A关系。因此,我们得到编译时错误。为了避免这种编译错误,我们需要向类型Manager添加强制转换。但是,转换为类型Manager只能避免编译问题。由于这种类型的转换,您将获得java.lang.ClassCastException 。

Manager man1 = (Manager) new Employee(); //Wrong: avoids compilation error but will generate a ClassCastException at runtime.

我建议您阅读Java 语言规范:第 5.5.1 节,以全面了解强制转换引用类型。

于 2013-06-30T07:55:30.773 回答
0

的每个实例B都有来自 的所有内容A,因为它一个A. 但似乎您实际上想B给定A. 这是不可能的,除非您专门编写您的课程以允许它:

public class B extends A {
  public B(A original) { ... }
}

然后

 A a = new A();
 B b = new B(a);
于 2013-06-30T07:47:54.383 回答