java继承处理字段

java继承处理字段,java,inheritance,subclass,super,Java,Inheritance,Subclass,Super,假设我有这个密码 public class A { String name = "a"; public void one(){ System.out.println(name); } public void two(){ System.out.println(name); } public static void main(String[] args){ A a = new A();

假设我有这个密码

public class A {
    String name = "a";
    public void one(){
        System.out.println(name);
    }
    public void two(){
        System.out.println(name);
    }
    public static void main(String[] args){
        A a = new A();
        B b = new B();
        b.one();
    }
}

class B extends A{
    String name="b";
    public void two(){
        System.out.println(name);
    }
}

我不明白为什么b.one()总是产生“a”。根据我对继承的了解,B将看到它没有自己的one()副本,因此它将是super.one()。super.one()将打印出该类中变量名(a)的值。然而,B会不会看到它也有一个名称变量,它的值为“B”,所以它不会去吗?我很困惑,因为我知道这种逻辑适用于方法调用。有人能澄清这一点吗?

你自己的问题部分回答了问题本身。当您执行
super.one()
时,您就不再处于“B”状态。因此,您为什么期望
名称
中除了“a”以外的任何内容呢。调用超类后引用的
名称是
A
的名称。如果
name
public
protected
且未重新声明,则可以更改子类中
name
的值

public class A
{
   protected String name;

   public void printName()
   {
      System.out.println(name);
   }
}

public class B extends A
{
    public B()
    {
        name = "b";
    }
}

public class Main 
{
    public static void main(String [] args)
    {
       B b = new B();
       b.printName();
    }
} 

上面的代码将打印“B”。

简短回答:您通过在
B
中声明另一个来隐藏
name
。字段不会重写。因此,您发现一个字段声明不会重写另一个,就像方法声明那样。联合联络小组说这将发生。我不知道你想让别人告诉你什么。