Java 如何在子方法内访问子类中的父类变量?
我有一节课Java 如何在子方法内访问子类中的父类变量?,java,Java,我有一节课 public class A { private String name; public void setName(String name){ this.name = name; } public string getName(){return name;} public String toString() { StringBuilder builder = new StringBuilder();
public class A {
private String name;
public void setName(String name){
this.name = name;
}
public string getName(){return name;}
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(name).append(", ");
return builder.toString();
}
}
我有一个子类B扩展了a,我必须从B中的一个in-toString方法访问名称。我已经编写了以下代码,但不确定这是否是一个好的实践
public class B extends A {
private String gender;
public void setGender(String gender){
this.gender = gender;
}
public string getGender(){return gender;}
@Override
public String toString() {
c = new A();
StringBuilder builder = new StringBuilder();
builder.append(c.getName()).append(", ");
builder.append(gender).append(", ");
return builder.toString();
}
}
编辑:
如果无法访问类B中的私有字符串名称,是否必须使用super.setName(name)
覆盖setName()?在这种情况下,如果我不想使用A的任何对象,它与使用B类而不扩展A类有多大区别
我刚开始使用JAVA修改服务。只需在toString方法中调用
getName()
,或super.getName()
比如:
继承类时,还从继承的类继承所有公共和受保护的方法和变量。所以你可以这么做
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(this.getName()).append(", ");
builder.append(this.getGender()).append(", ");
return builder.toString();
}
永远不要忘记那句古老的格言:你不会继承父母的私产 如果您希望
B
访问A.name
,您有两个选项:
- 将
更改为名称
(坏)或公共
(更好)的受保护
A
- 通过
的setter和getter访问A
,例如name
this.getName()
- 使用
您当前所做的只是返回默认值
A.name
,而不是实际属于B
实例的name值。您可以使用super
关键字来使用模式类方法或实例变量。比如super.name
No,这不是好的做法。首先,c
变量中的name
值从未设置为任何值,因此它始终是默认值。您可以从派生类中访问基类的getter和setter,为什么不直接使用它们呢?我无法更改父类,它正在几个不同的项目中使用。我忘了提到A类属于另一个包。@spod它所在的包与public
或protected
级别无关。无论如何,您最好只使用提供的setter/getter,或者在需要时使用reflection。是的,这可以通过调用特定字段的getter函数来实现,因为getter方法总是使用public access修饰符设置。所以这是一种最简单的方法,尽管使用super关键字调用getter也是一种很好的方法。
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(this.getName()).append(", ");
builder.append(this.getGender()).append(", ");
return builder.toString();
}