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
。字段不会重写。因此,您发现一个字段声明不会重写另一个,就像方法声明那样。联合联络小组说这将发生。我不知道你想让别人告诉你什么。