爪哇 |父类和子类中的静态变量|从父类访问子 var 值

Posted

技术标签:

【中文标题】爪哇 |父类和子类中的静态变量|从父类访问子 var 值【英文标题】:Java | static vars in parent and child class | accessing the child var value from parent class 【发布时间】:2017-05-21 05:03:44 【问题描述】:

在这种情况下,我有一些具有唯一静态变量的子类,称为“x”。 所有这些子类都以相同的方式使用静态 var,所以我想减少代码重复并将功能放在超类中。 在这种情况下,超类中的方法“getX”。从这里我想返回 x 的值。现在我面临的问题是它使用超类的 x 值而不是子类的值。如何从超类中获取子类的 x 值?

public class Playground 

  public static void main(String[] args) 
    Parent parent = new Parent();
    Child child = new Child();
    Child1 child1 = new Child1();

    System.out.println("Parent.x " + parent.x);
    System.out.println("child.x " + child.x);
    System.out.println("child.x " + child1.x);

    System.out.println("get x: " + parent.getX());
    System.out.println("get x: " + child.getX());
  


class Parent 
  static String x = "static of parent";
  String y = "instance of parent";

  String getX() 
      return x;
  


class Child extends Parent 
  static String x = "static of child";
  String y = "instance of child";


class Child1 extends Parent 
  static String x = "static of child1";
  String y = "instance of child";

这段代码打印出来: Parent.x static of parent child.x static of child child.x static of child1 get x: static of parent get x: static of parent

希望有人可以帮助我。

干杯

【问题讨论】:

【参考方案1】:

尝试将 getX 方法添加到孩子。像这样:

class Child extends Parent 
  static String x = "static of child";
  String y = "instance of child";
  String getX() 
      return x;
  

【讨论】:

在我的真实场景中,我有 6 个子类,所以我不想在所有子类中复制 getX 这是 3-4 个方法(在真实场景中) 但是当你调用getX方法时,java会调用Parent中的那个。这就是为什么你从父母那里得到 x 的原因。我认为这是获得预期结果的唯一方法。【参考方案2】:

在子类中添加 getX 方法。 父getX方法指向父类的静态变量。

【讨论】:

【参考方案3】:

您正在尝试的是违反基本 OOP 原则信息隐藏 / 封装

没有其他类应该知道类如何存储或处理其属性(又名变量字段)。这包括类不应该有 gettersetter (正如@RosárioPereiraFernandes 所建议的那样)

当类表示一个数据传输对象 (DTO) 时,该规则有一个例外,它(几乎)没有业务逻辑,只提供对结构化数据的访问。 DTO 应该有 getter 和(不太常见的)setter

其他类应提供具有业务相关名称的方法以修改其内部状态(其成员变量的值):

class Car
  private final int maxSpeedInMph = 100;
  private int speedInMph = 0;
  public void accellerateBy(int speedDiffInMph)
    if( maxSpeedInMph >=speedInMph + speedDiffInMph )
       speedInMph += speedDiffInMph;
    else 
       speedInMph = maxSpeedInMph ;
      
  public void accellerateTo(int newSpeedInMph)
    if( maxSpeedInMph >=  newSpeedInMph)
       speedInMph = newSpeedInMph;
    else 
       speedInMph = maxSpeedInMph ;
  
  public void decellerateBy(int speedDiffInMph)
    if( 0<=speedInMph - speedDiffInMph )
       speedInMph += speedDiffInMph;
    else 
       speedInMph = 0;
  
  public void emengencyBreak()
    speedInMph = 0;
  
  // you get the idea?

【讨论】:

我明白了,我的情况是每个孩子都有一个我想使用的唯一常量。没有操纵。考虑一个具有不同类型 BankAccount 的银行,并且每种类型的 BankAccount 都有一个恒定的 BankFee。所以我想要一个方法来返回每个 BankAccount 的 BankFee 而无需进入每个子 BankAccount 并添加一个返回类型 BankFee 的 getter。 @DΦC__WTF : “我的情况是每个孩子都有一个我想使用的唯一常量” 为什么? - 您很可能打算在swich 语句中使用它。但是您应该使用 plymorphism 来根据类类型执行特定操作。【参考方案4】:

解决方案可能是在 Parent 中没有静态,而是在实例字段中。

class Parent
    private final X x
    public Parent(X x)
        this.x = x;
    

    public X getX() 
        return x;
    

然后在你的孩子身上,你仍然可以有一个静态的,但你在构造函数中传递它

class Child extends Parent 
    static final X x = ....
    public Child() 
        super(x);
    

【讨论】:

【参考方案5】:

据我所知,无法从父类访问子变量。

但是你可以在子类中覆盖String getX()

@Override
protected String getX()         
    return x;

然后Java调用“最低”getX()方法


我会对你的示例进行不同的编码:

public class Playground 

private static Parent parent = new Parent("static of parent");
private static Child child = new Child("static of child");
private static Child1 child1 = new Child1("static of child1");

  public class Playground 

private static Parent parent = new Parent("static of parent");
private static Child child = new Child("static of child");
private static Child child1 = new Child("static of child1");

  public static void main(String[] args) 


    System.out.println("Parent.x " + parent.getX());
    System.out.println("child.x " + child.getX());
    System.out.println("child.x " + child1.getX());

    System.out.println("get x: " + parent.getX());
    System.out.println("get x: " + child.getX());
  


 class Parent 
     private String x;
     public Parent(String x) 
         this.x = x;

     

     public String getX() 
          return this.x;
      
 

class Child extends Parent 
    protected Child(String x) 
        super(x);
      

-> 这将带来以下输出:

Parent.x static of parent
child.x static of child
child.x static of child1
get x: static of parent
get x: static of child

有问题就问

【讨论】:

以上是关于爪哇 |父类和子类中的静态变量|从父类访问子 var 值的主要内容,如果未能解决你的问题,请参考以下文章

子类从父类继承过来的方法可以操作子类自己定义的成员变量吗

简述在类的继承关系中,子类可以继承父类的都有哪些成员

2017/03/19学习笔记

父类和子类可以相互转化吗?

如何访问子类中的函数?

父类和子类加载顺序-面试被问过一次