了解Java中的强制转换和继承

了解Java中的强制转换和继承,java,oop,inheritance,Java,Oop,Inheritance,我对Java中的继承没有一个清晰的概念。例如,我有: class A { ... public void MethodA(); } 这里是一切都很清楚。然后我想要一个(子)类: 然后我创建一个A的实例。然后我想得到一个B的实例,它包含A中的所有内容。我想做一些类似于aA=newb()但是得到一个错误 使用这个东西不是很舒服: aaa=新的A(…) B aB=新的B(空,空,…) aB=aA 我应该如何正确地使用它,并对Java中的继承有一个清晰的认识 UPD:那么我怎样才

我对Java中的继承没有一个清晰的概念。例如,我有:

class A
{ 
     ...
     public void MethodA();
}
这里是一切都很清楚。然后我想要一个(子)类:

然后我创建一个
A
的实例。然后我想得到一个
B
的实例,它包含
A
中的所有内容。我想做一些类似于
aA=newb()但是得到一个错误

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

aaa=新的A(…)
B aB=新的B(空,空,…)
aB=aA

我应该如何正确地使用它,并对Java中的继承有一个清晰的认识


UPD:那么我怎样才能得到一个拥有A所有内容的B实例呢?

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

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


这被称为。

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

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

这被称为。

每个
B
实例都有
A
的所有内容,因为它是
A
。但是看起来您实际上想要从
a
的给定实例创建
B
的实例。这是不可能的,除非您专门编写类以允许它:

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

 A a = new A();
 B b = new B(a);
B
的每个实例都有
A
中的所有内容,因为它是
A
。但是看起来您实际上想要从
a
的给定实例创建
B
的实例。这是不可能的,除非您专门编写类以允许它:

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

 A a = new A();
 B b = new B(a);

在你的例子中,A-超类,B-子类


子类拥有其超类的所有属性和操作(因为子类继承了其超类的所有属性和操作)。这意味着子类对象可以执行其超类可以执行的任何操作。因此,当需要超类实例时,我们可以替换子类实例,并且一切都会正常工作。这称为可替换性。

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


子类拥有其超类的所有属性和操作(因为子类继承了其超类的所有属性和操作)。这意味着子类对象可以执行其超类可以执行的任何操作。因此,当需要超类实例时,我们可以替换子类实例,并且一切都会正常工作。这称为可替代性。

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

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

class Manager extends Employee{
    public Manager(){
        System.out.println("Manager obj");
    }
}
通过扩展雇员,我们宣布经理是雇员的一个专业化。因此,每个经理都是员工,但每个员工都不是经理

Employee类型的引用可以引用满足IS-A关系的对象。因此,以下内容完全合法:

Employee emp1 = new Employee();
Employee emp2 = new Manager();
然而,如果我们试图写

Manager man1 = new Employee(); //Wrong: Compilation error.
这违反了IS-A关系。因此,我们得到了编译时错误。为了避免这种编译错误,我们需要向类型管理器添加强制转换。但是,转换为类型管理器只能避免编译问题。通过这种类型的转换,您将获得java.lang.ClassCastException

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

我建议您仔细阅读,全面了解铸造参考类型。

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

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

class Manager extends Employee{
    public Manager(){
        System.out.println("Manager obj");
    }
}
通过扩展雇员,我们宣布经理是雇员的一个专业化。因此,每个经理都是员工,但每个员工都不是经理

Employee类型的引用可以引用满足IS-A关系的对象。因此,以下内容完全合法:

Employee emp1 = new Employee();
Employee emp2 = new Manager();
然而,如果我们试图写

Manager man1 = new Employee(); //Wrong: Compilation error.
这违反了IS-A关系。因此,我们得到了编译时错误。为了避免这种编译错误,我们需要向类型管理器添加强制转换。但是,转换为类型管理器只能避免编译问题。通过这种类型的转换,您将获得java.lang.ClassCastException

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

我建议您仔细阅读,全面了解选择参考类型的方法。

每只狗都是动物,但不是每只动物都是狗。“那么,我如何才能得到一个B拥有a所有内容的实例呢?”什么都不做。
B
的每一个实例都已经包含了
A
的所有内容。每只狗都是动物,但不是每只动物都是狗。“那么我怎么才能得到一个B实例包含了A的所有内容呢?”什么都不做。
B
的每个实例都已经包含了
A
的所有内容。