Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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 - Fatal编程技术网

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
  • 通过
    A
    的setter和getter访问
    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();
}