了解Java中的强制转换和继承
我对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:那么我怎样才
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
的所有内容。