属性的 Java 字段隐藏

标签 java field

我刚开始学习 Java,所以如果答案有些明显,请耐心等待。我做了一些研究,但无济于事。

据我了解,属性不会被覆盖,而只会隐藏字段。为了确定是否使用父类(super class)或子类中的属性,Java 将检查引用的类型。

然后我不明白这里的输出:

public class Super {
    String str = "I'm super!\n";

    public String toString() {
        return str;
    }
}

public class Sub extends Super {
    String str = "I'm sub.\n";
}

public class TestFH {
    public static void main(String[] args) {
        Sub s1 = new Sub();

        System.out.printf(s1.toString());
    }
}

它给了我:

I'm super!

我知道我可以通过方法覆盖轻松实现我想要的。我只是好奇引擎盖下发生了什么。

提前致谢。

最佳答案

当您调用 s1.toString() 时,它会找到仅在 Super 类中定义的 toString() 方法,因此将该方法用作父类(super class)方法在子类中可用。 您的父类(super class)方法 toString() 使用它自己的类变量 str(值在父类(super class)中初始化) 作为方法的返回值因此,行为即输出为 I'm super!

如果你想获得 I'm sub.\n 的输出,那么你需要重用与父类(super class)中相同的变量并分配新的字符串值,即 I' m sub.\n 到它。最好的选择是将构造函数用作:

  public class Super {
     String str = "I'm super!\n";

     public Super(String stringValue){
         this.str = stringValue;
     }

     public String toString() {
        return str;
     }
  }

  public class Sub extends Super {
     public Sub(){
       super("I'm sub.\n");
     }
  }

  public class TestFH {
    public static void main(String[] args) {
       Sub s1 = new Sub();
       System.out.printf(s1.toString());
    }
  }

关于属性的 Java 字段隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13984472/

相关文章:

java - 编写程序去除给定字符串中的空格

django - Django:For循环迭代表单字段

java - 使用 facebook graph api 共享链接后,Android 解析 facebook 登录不起作用。

Java 网络服务器和 TIME_WAIT

java - Hadoop 失败错误 : java. lang.ArrayIndexOutOfBoundsException:5

java - 将字段写入字节码不起作用

mysql - 如何在 php 中从 mysql 查询中拆分值

java - 在 Java 中同步访问只读映射的正确方法

database - awk 和字段拆分参数

使用开源软件具有可填写、可保存的表单的 PDF