爪哇 |父类和子类中的静态变量|从父类访问子 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 原则信息隐藏 / 封装。
没有其他类应该知道类如何存储或处理其属性(又名变量或字段)。这包括类不应该有 getter 和 setter (正如@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 值的主要内容,如果未能解决你的问题,请参考以下文章