Java 为什么子类';从基类继承的方法是否打印自身字段的值?

Java 为什么子类';从基类继承的方法是否打印自身字段的值?,java,inheritance,Java,Inheritance,伙计们, 我的问题很简单。请看以下代码: public class Test { public static void main(String[] args){ SubTest st = new SubTest(); st.sayName(); } } class BaseTest{ String name= "BaseTest"; voi

伙计们, 我的问题很简单。请看以下代码:

    public class Test {
            public static void main(String[] args){
            SubTest st = new SubTest();
            st.sayName();
            }
    }

    class BaseTest{
        String name= "BaseTest"; 

        void sayName(){
            System.out.println(getClass());
            System.out.println(this.name);
        }
    }

    class SubTest extends BaseTest{
        String name= "SubTest";


    }
输出:

xxx.xxx.子测验

基本测试

我知道方法将被继承或重写,字段将在继承中隐藏。因此,假设子类的值是打印出来的,而不是基类的值。不过,一定是我掉了什么东西。希望有人能告诉我。
谢谢。

实例变量不像方法那样受多态性的影响。因此,是的,
SubTest
BaseTest
继承了
sayName()
方法,但该方法仍然引用
BaseTest
name
变量。请注意,
子测试
类现在有两个
名称
实例变量

要打印
“子测试”
,您可以覆盖
sayName()


这里,
this.name
将引用
SubTest
name
变量。

实例变量不像方法那样受多态性的影响。因此,是的,
SubTest
BaseTest
继承了
sayName()
方法,但该方法仍然引用
BaseTest
name
变量。请注意,
子测试
类现在有两个
名称
实例变量

要打印
“子测试”
,您可以覆盖
sayName()


这里,
this.name
将引用
SubTest
name
变量。

您的方法在
BaseTest
中定义。它不知道是谁继承了它。它不知道有
子测试
类。因此,当您打印值时,您将打印
BaseTest
类中name的值

如果要在
子测试
中打印name的值,则必须覆盖
子测试
中的方法。由于您没有重写该方法,因此所有调用都会自动调用继承的
sayName()
,正如我所说,它会从
BaseTest

将此代码放入
子测试中
类:

@Override
void sayName(){
      super.sayName(); // calls sayName() of the super class
      System.out.println(this.name); // prints value of name in the SubTest class
}

您的方法在
BaseTest
中定义。它不知道是谁继承了它。它不知道有
子测试
类。因此,当您打印值时,您将打印
BaseTest
类中name的值

如果要在
子测试
中打印name的值,则必须覆盖
子测试
中的方法。由于您没有重写该方法,因此所有调用都会自动调用继承的
sayName()
,正如我所说,它会从
BaseTest

将此代码放入
子测试中
类:

@Override
void sayName(){
      super.sayName(); // calls sayName() of the super class
      System.out.println(this.name); // prints value of name in the SubTest class
}

我知道方法将被继承或重写,字段将在调用的继承中隐藏。当你谈到隐藏时,你指的是一个与类字段同名的方法变量,例如setters。我知道这些方法将被继承或重写,这些字段将在调用的继承中被隐藏。当你谈到阴影时,你指的是一个与类字段同名的方法变量,例如setters。或者更好的是,在类的构造函数中初始化
super.name
变量,无需重写该方法。说
super.name
将引用超类的
name
变量,为了避免超类的
name
变量被隐藏这一事实,或者更好的做法是,在类的构造函数中初始化
super.name
变量,无需重写该方法。说
super.name
将引用超类的
name
变量,为了避免超类的
name
变量被隐藏这一事实。