关于#java#的问题,请各位专家解答!

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 类型来解决。

私有方法不能重写

img

System.out.println(this);
这里输出的是对象 toString 的结果,默认的 toString输出的是对象的hash