Java 共享同一超级类实例的类

Java 共享同一超级类实例的类,java,Java,我有一个非常简单的问题 两个类可以共享同一个超级类实例吗?我知道答案是否定的,因为super是实例本身,但我确实有一些解决方法 public class Parent{ private final int parentId; private static final HashMap<Integer,Parent> parentMap = new HashMap<Integer,Parent>(); private Parent(int i){

我有一个非常简单的问题

两个类可以共享同一个超级类实例吗?我知道答案是否定的,因为super是实例本身,但我确实有一些解决方法

public class Parent{
    private final int parentId;
    private static final HashMap<Integer,Parent> parentMap = new HashMap<Integer,Parent>();

    private Parent(int i){
       parentId = i;
       parentMap.put(i,this);
    }

    public static Parent newInstance(int i)
    {
        if(parentMap.containsKey(i))
            return parentMap.get(i);

        return new Parent(i);

    }
}
重新编写代码以清楚地演示我的问题

有人能帮我吗=D


提前谢谢

我看到两种选择:

  • 将相关父级的属性和方法设置为静态,以便在所有子级之间共享它们
  • 用接口替换父类,并在子类实例之间共享原始父类的属性

Make
ExtendedParent
实例将调用转发给作为成员保留的
父实例。方法不仅要转发调用,还要添加额外的处理,以区分
ExtendedParent
Parent

,您可以使用内部类。您甚至可以使多个不同类型共享同一父类对象。这不是继承,但结果将完全符合您的要求:

public class Test {

    private final String text;

    Test(String text) {
        this.text = text;
    }

    public static void main(String[] args) throws Exception {
        Test t = new Test("Text");
        A a = t.new A();
        B b = t.new B();
        a.printA();
        b.printB();
    }

    class B {
        public void printB() {
            System.out.println(text);
        }
    }

    class A {
        public void printA() {
            System.out.println(text);
        }
    }
}

A
扩展
B
哪个扩展了
超类
?您的
扩展父级
不扩展
父级
!该代码中有多个错误。您可以通过重写子类中的
equals()
来执行所需操作。一个类的两个实例可以将该类的一个祖先的实例作为成员保存。如果这足够解决问题的话。这将是继承之前的组合…我忘记添加extends关键字,现在更正了。我知道它们可以将它们作为一个成员保存,但我的概念模型确实需要一个类来执行另一个类。如果没有其他解决方案,我将不得不接受它。在Java中,实例不会继承任何东西。这样做并不能解决我的问题,我想这样做:父p1=新的ExtendedParent(1);父级p2=新的扩展父级(1);资产净值(p1.等于(p2))//呜呜factor@matutano您可以实现
Parent#equals
来检查ID是否相等注意,您不仅共享父对象,实际上还从两个不同的构造函数调用返回相同的对象。你不能用构造函数,但用工厂类很容易。Adrian的建议很有道理:父对象可能不能共享,但没有理由不能等价。是的,但我不能在ExtendedParent中使用工厂类,我试图通过实例化新的父对象或新的ExtendedParent来获取实例。我得出的结论是这是不可能的。唯一的解决方案是将父实例作为ExtendedParent:\的成员,这就是我目前所拥有的。我想可能会有一些解决办法。我得出的结论是没有。程序员应该可以使用自动装箱,这将解决此问题!:p此解决方案相当于克隆,您创建了一个看起来像原始对象但不是原始对象的对象。我需要有相同的对象,相同的引用。两个构造函数调用不能返回相同的对象。重新考虑你的设计。或重写等于方法。此解决方案与克隆没有任何共同之处,测试实例将是相同的。我将其与克隆进行了比较,因为属性将作为类成员共享。解决方案相当于将父级作为成员。
public class Test {

    private final String text;

    Test(String text) {
        this.text = text;
    }

    public static void main(String[] args) throws Exception {
        Test t = new Test("Text");
        A a = t.new A();
        B b = t.new B();
        a.printA();
        b.printB();
    }

    class B {
        public void printB() {
            System.out.println(text);
        }
    }

    class A {
        public void printA() {
            System.out.println(text);
        }
    }
}