public class Main {
public static void main(String[] args) {
//new Safe().m1();
new UnSafe().m1(); // 为什么里面调用的不是UnSafe类中的m2方法
}
}
class Safe{
public void m1(){
System.out.println(1);
System.out.println(this);
m2();
}
private void m2(){
System.out.println(2);
}
}
class UnSafe extends Safe{
public void m2(){
System.out.println(3);
}
}
输出结果
1
cn.study.UnSafe@27973e9b
2 # 为什么打印结果不是3呢
因为在Safe类的m1方法中调用了m2方法,而m2方法是私有方法,无法被子类重写,因此即使UnSafe类中有m2方法,但在Safe类的m1方法中调用的仍然是父类的m2方法,所以打印结果是2。
该回答引用GPTᴼᴾᴱᴺᴬᴵ
在Java中,方法的调用是基于实际对象类型的,而不是基于声明对象类型的。
在这个例子中,虽然在 main 方法中创建了一个 UnSafe 的实例,但是它是通过 Safe 类型的引用来引用的。因此,在 new UnSafe().m1(); 调用 m1 方法时,this 指向的是 Safe 类型的实例,而不是 UnSafe 类型的实例。因此,在 m2 方法中调用的是 Safe 类型的 m2 方法,而不是 UnSafe 类型的 m2 方法。所以输出结果为:
1
cn.study.UnSafe@27973e9b
2
如果要调用 UnSafe 类型的 m2 方法,可以通过将 m2 方法声明为 public 类型来解决。
私有方法不能重写
System.out.println(this);
这里输出的是对象 toString 的结果,默认的 toString输出的是对象的hash