可以从已经实例化的超类中实例化子类吗?

时间:2015-03-20 00:15:32

标签: java inheritance subclass superclass

所以我有一个超类,我希望从中实例化多个子类。子类可能是多线程的 E.g:

public class Person() {
    protected variables;
    public/private methods ect.
}

public class Man() extends Person {
    private variables;
    public/private methods;
}

public class Woman() extends Person {
    private variables;
    public/private methods;
}

我想实例化Person,然后将Man和Woman类扩展出来。
像:

Person A = new Person();
Man B = //some how extends A;
Woman C = //some how extends A;

还是有其他方法可以达到同一目标吗?

2 个答案:

答案 0 :(得分:1)

您误解了类和对象之间的区别。类是对象如何组成的总体定义。对象是一个特定的实例。

因此,如果您创建Person的实例,那就是Person类的单个对象实例。您无法动态扩展它以在运行时将其作为Man(有些模式可以执行此操作,但不能继承)。如果您想要Man,则可以创建一个实例。

也许你真正的问题是不同的。也许您想使用Person的实例作为模板来创建ManWoman的新实例。

想象一下

class Person {
     private String name;

     public Person(String name) { ... }
}

和一个原型人:

Person kelly = new Person ("Kelly");

也许你想制作一个通用的“凯莉”作为一个男人和一个女人的副本 - 两个独立的对象,恰好有这个性别中立的名字

Man kellyMan = new Man(kelly);
Woman kellyWoman = new Woman(kelly);

我们在上面看到了什么?我们正在看一个复制构造函数模式。原始Person对象的内容可以复制到新的ManWoman对象中,然后这些对象将继续进行自己的生活。例如:

class Man : extends Person {
    public Man(Person template) { 
        super(template); // pass to superclass for copying
    }
}

class Person {
    ...
    public Person(Person template) {
        this.name = template.name;
        // etc
    }
}

这不是一种不常见的事情。在运行时动态更改对象的类型并不常见......我尝试了一次。不要这样做!

答案 1 :(得分:0)

如果你想继承一个类:

public class Child extends Parent { ...

您可以拥有多个从同一父级继承的子类,您只能从多个类继承。以下是您可以使用的一些示例。请记住,当您编写类似Person p = new Person()的内容时,您有p这是对Person对象的引用。尝试将对象类型与不同的引用混合在一起,看看会发生什么。