Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java继承-如何将子类实例中的值设置为由其他子类共享(相同)?_Java_Oop_Inheritance - Fatal编程技术网

Java继承-如何将子类实例中的值设置为由其他子类共享(相同)?

Java继承-如何将子类实例中的值设置为由其他子类共享(相同)?,java,oop,inheritance,Java,Oop,Inheritance,我想这样做: Class A Class B extends A Class C extends A B b = new B(); C c = new C(); b->setField("foo"); c->getField; //return "foo" 是否有可能实现这些类 我需要它在hibernate中持久化,将实体拆分为两个实体,并将每个实体都放在自己的表中。我需要有一些相同的字段(id,一些FK,一些值)。所以我想在一个子类中设置这些字段,在第二个子类中设置相同的值

我想这样做:

Class A 
Class B extends A
Class C extends A

B b = new B();
C c = new C();

b->setField("foo");
c->getField; //return "foo"
是否有可能实现这些类

我需要它在hibernate中持久化,将实体拆分为两个实体,并将每个实体都放在自己的表中。我需要有一些相同的字段(id,一些FK,一些值)。所以我想在一个子类中设置这些字段,在第二个子类中设置相同的值。所有子类都需要具有/共享完全相同的值


有什么想法吗

您可以尝试将字段设置为静态。然后您可以通过这种方式访问它。

如果字段是静态的,那么它们将共享相同的值。不支持Hibernate,所以我不确定从持久性的角度看这是否会改变任何东西。

无论从Java的角度看这是否可能(是的,但以一种迂回的方式),它都不是处理所需内容的正确方法。如果使用外键并更新某个持久化实体中的值,则应在将其用作外键的实体中更新相应的值。让JPA/Hibernate为您处理这个问题。我建议您阅读JavaEE教程中的JavaPersistenceAPI以及Hibernate指南,了解它的功能以及如何处理跨不同实体类和/或表共享/划分的数据

编辑:由于每个人都在反复讨论静态字段,这完全不是OP想要的,,因此我将提供一个示例,说明我将如何做到这一点

public class Key {
    private String value;
    public Key(final String value) {
        this.value = vale;
    }
    public String getValue() {
        return value;
    }
    public void setValue(final String value) {
        this.value = value;
    }
}

public class A {
    private final Key field;
    public A(final Key field) {
        this.field = field;
    }
    public setField(final String value) {
        field.setValue(value);
    }
}

public class B {
    private final Key field;
    public B(final Key field) {
        this.field = field;
    }
    public setField(final String value) {
        field.setValue(value);
    }
}

//When using...
Key k = new Key("value");
A a = new A(k);
B b = new B(k);

但正如我所说,这只是Java级别的解决方案,但在持久性上下文中无法正常工作。您需要阅读有关JPA和Hibernate的主键和外键的使用。从原始问题中使用的符号判断,我认为海报来自非Java背景,因此在意外地重新发明轮子之前,他必须学会如何正确使用这些技术。Hibernate通常不会管理静态字段。在这种情况下,您可以只向类a添加一个静态getter和setter。如果您不将它们隐藏在子类中(没有静态方法的重写),则调用
C.setField(“foo”)
a.setField(“foo”)
C.setField(“foo”)
(注意
C
是一个实例)等都将调用同一个方法


如果您想为实体提供公共属性,但实体可以有不同的值,请尝试使用
@MappedSuperClass
注释。

您可以使用以下代码:

public class A {

    private static String field;

    public static String getField() {
        return field;
    }

    public static void setField(String field) {
        A.field = field;
    }
}


public class B extends A{

}


public class C extends A{

}


public class Test {

    public static void main(String[] args){
        B.setField("Thank you"); // or 
           new B().setField("Thank you"); 

        System.out.println(C.getField()); // or
            System.out.println(new C().getField());

  // it will work for object and for class as well
    }
}

输出:谢谢

该字段是静态的吗?如果没有,对象
b
c
如何共享该值?这将为该类的每个实例设置值。看看这是如何处理JPA持久性的,这根本不是OP想要的,而且会带来一个重大问题。是的,伙计,你是对的。静态场的答案是我想要的,我完全错过了这种方式。但你是对的,我不能用它来解决我的问题。我将检查dku.rajkumar ass acceptet先生的答案,因为这是第一部分od问题的正确答案-是可能的。但非常感谢你写得很好的回答,它激励我寻找另一个解决方案。