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
变量被隐藏这一事实。