从父类对象设置所有子类变量

时间:2018-02-21 12:21:02

标签: java

我有两个具有以下结构的A和B类

Class A() {
    Integer a1;
    Integer a2;
}

Class B() extends A {
    Integer b1;
}

如何从A类对象中设置(所有)B类变量a1和a2(它们也可以超过2)?

4 个答案:

答案 0 :(得分:1)

Class A {
    protected Integer a1;
    protected Integer a2;
}

Class B extends A {
    Integer b1;
}

你可以这样做:

B b = new B();
b.a1 = 3;
b.a2 = 4;

答案 1 :(得分:1)

让我们在下面的案例中看到这一点(假设A和B都在同一个版本中)

案例1:

A aReference = new A()
aReference.a1 = 1;
aReference.a2 = 2;
b1 is not present in the object so can not be set.

案例2:

A aReference = new B(); //reference of parent class and object of child class.
aReference.a1 = 10;
aReference.a2 = 20;

b1存在于对象中但不能直接访问,因此需要进行类型转换。

((B)aReference).b1 = 30;

案例3:

B bReference = new B();
bReference.a1 = 10;
bReference.a2 = 20;
bReference.b1 = 30;

案例4:

Suppose you want to modify it from inside a method of B

 class B extends A{
     ....
    public void someMethod(){
       super.a1 = 10;
       super.a2 = 20; 
       b1 = 40;
    } 
 } 

案例5:

If you want to modify the values of the state of child from parent class

public class A{

     public void someMethod(){
         ((B)this).b1 = 10;
         a1 = 20;
         a2 = 30;
    }
}

**第5点是非常糟糕的做法。父类不得知道子类。 ***您应该使用setter方法修改状态并将状态保持为私有

答案 2 :(得分:0)

由于op要求使用父对象引用设置子类变量。你可以试试这个。

代码示例:

class A {
    Integer a1=5;
    Integer a2=6;
}

class B extends A {

}

public class Inherit {

    public static void main(String[] args) {

        A obj = new B();     //casting
        A obj2=new A();

        obj.a1 = 10;
        obj.a2 = 12;


        System.out.println("value of a1 in class A :"+obj2.a1+" & value of a2 in class A :"+obj2.a2);
        System.out.println("value of a1 in class B :"+obj.a1+" & value of a2 in class B :"+obj.a2);
    }

}

这里我们将子类对象转换为父引用,并使用引用来更改变量数据。

答案 3 :(得分:-1)

  • 如果您想从访问孩子,答案很简单:您不能。父类可能有多个子类,因此您必须创建一个引用,因为A没有B的变量,它是B从A继承变量。

    相反,您可以实例化该类并将其作为普通类访问。

     B b = new B();
     b.b1 = 1;
    
  • 如果您的意思是从子级访问父级,则可以使用super关键字调用超类:

    super.a1 = 3; // must execute from B class
    

    由于java不允许多父母,因此不能与其他任何人分享超类。