Inheritance 用超类的实例实例化子类有什么好方法吗?

Inheritance 用超类的实例实例化子类有什么好方法吗?,inheritance,composition,Inheritance,Composition,最好是在Java中,是否有一种从超类实例实例化子类的好方法 假设我有ClassB,它是ClassA的子类,下面是ClassA的构造函数: public ClassA(){ } 我想做一些类似的事情: public class ClassB extends ClassA{ public ClassB(ClassA aClassA){ super(aClassA); } } 有没有办法从超类的实例中轻松地获取子类的实例,特别是当子类可能只有一个比超

最好是在Java中,是否有一种从超类实例实例化子类的好方法

假设我有ClassB,它是ClassA的子类,下面是ClassA的构造函数:

 public ClassA(){


  }
我想做一些类似的事情:

public class ClassB extends ClassA{

     public ClassB(ClassA aClassA){

       super(aClassA);

    }
}
有没有办法从超类的实例中轻松地获取子类的实例,特别是当子类可能只有一个比超类多的字段,因此它们之间没有太大区别时

比如说,

ClassA=新ClassA()

b类=a类

(编译器将要我这样做:
ClassB=(ClassB)a;
…这将不起作用。)

我该怎么做

有什么方法可以从超类的实例轻松地获取子类的实例吗

不,超类实例不包含子类实例。您试图做的是将超类类型引用变量引用的对象强制转换为子类的对象

ClassB b = (ClassB)a;
这是危险的,因为如果
a
在运行时实际上没有引用
ClassB
的实例,它可能会失败

请记住
ClassB
的所有实例都是
ClassA
的实例,但情况并非相反

我不确定你想达到什么目的,可能是看看它是否有帮助

有什么方法可以从超类的实例轻松地获取子类的实例吗

不,超类实例不包含子类实例。您试图做的是将超类类型引用变量引用的对象强制转换为子类的对象

ClassB b = (ClassB)a;
这是危险的,因为如果
a
在运行时实际上没有引用
ClassB
的实例,它可能会失败

请记住
ClassB
的所有实例都是
ClassA
的实例,但情况并非相反


我不确定您想要实现什么,可能是看看它是否有帮助。

不可能将
ClassA
的实例强制转换到子类
ClassB

你可以这样想:

class A{

   int a;
}

class B extends A{
   long b;
}


A a = new A(); //creating instance of super class. This instance will not have `b`

boolean result = a instanceof B; //the result will be false but if you cast ignoring that

B b = (B)a; //Will throw a CLASS CAST EXCEPTION at runtime
您可以这样做:

A b = new B();

B bb = (B)b;

B
的所有实例也都是
A
的实例,但不可能反向。您可以使用
instanceof

检查它无法将
ClassA
的实例强制转换为子类
ClassB

你可以这样想:

class A{

   int a;
}

class B extends A{
   long b;
}


A a = new A(); //creating instance of super class. This instance will not have `b`

boolean result = a instanceof B; //the result will be false but if you cast ignoring that

B b = (B)a; //Will throw a CLASS CAST EXCEPTION at runtime
您可以这样做:

A b = new B();

B bb = (B)b;

B
的所有实例也都是
A
的实例,但不可能反向。您可以使用
instanceof

检查它,为什么要这样做?这是糟糕的问题建模和/或OO设计的症状。我建议你在这个问题上多想一点,这会让你找到解决方案……我基本上同意。但我仍然认为,从超类创建至少一部分子类应该是Java的一个特性。如果你有一个哺乳动物,你应该能够创造一只老虎,你只需要一点额外的信息。想象一下,如果一个超类包含子类所需的所有信息,而子类只是超类中信息的一部分。这样,至少可以从超类创建子类。很多时候,我觉得在子类中隐藏信息是一个值得面向对象的目标,所以在这种情况下,子类将包含相同的信息,但只是隐藏信息。你为什么要这样做?这是糟糕的问题建模和/或OO设计的症状。我建议你在这个问题上多想一点,这会让你找到解决方案……我基本上同意。但我仍然认为,从超类创建至少一部分子类应该是Java的一个特性。如果你有一个哺乳动物,你应该能够创造一只老虎,你只需要一点额外的信息。想象一下,如果一个超类包含子类所需的所有信息,而子类只是超类中信息的一部分。这样,至少可以从超类创建子类。很多时候,我觉得在子类中隐藏信息是一个值得面向对象的目标,因此在这种情况下,子类将包含相同的信息,但只会隐藏信息。感谢narendra对此的完美解释。但就我个人而言,我认为应该有一种在java中实现这一点的方法。但是我同意这是不可能的。如果有一个class
Book
并且它有子class
HardboundBook
,那么可以肯定地说,
HardboundBook
也将是一本
Book
。但是,如果实例是
书籍
,则不能说它是
硬边界书籍
。所以从逻辑上来说这也是不可能的。是的,我同意…但是如果你有一本书要开始,那么如果你什么都没有开始,那么创建一本硬边界的书应该更容易…对吗?想象一下,你左手什么都没有,右手拿着一本书,你更喜欢哪一本来创建一本硬皮书?很明显,答案是一本书,而不是什么都没有。因此,java应该提供一种方法来帮助您从超类实例化子类,我相信它可能被称为包装类。感谢narendra对此的完美解释。但就我个人而言,我认为应该有一种在java中实现这一点的方法。但是我同意这是不可能的。如果有一个class
Book
并且它有子class
HardboundBook
,那么可以肯定地说,
HardboundBook
也将是一本
Book
。但是,如果实例是
书籍
,则不能说它是
硬边界书籍
。所以从逻辑上来说这也是不可能的。是的,我同意…但是如果你有一本书要开始,那么如果你什么都没有开始,那么创建一本硬边界的书应该更容易…对吗?想象一下,你左手里什么都没有,手里拿着一本书