有问题的代码是:
class Student {
private void study() {
System.out.println("Student is studying");
}
public static void main(String args[]) {
Student student = new Sam();
student.study();
}
}
public class Sam extends Student {
void study() {
System.out.println("Sam is studying");
}
}
输出:
Student is studying
创建了类Sam的对象,并且作为Student是超类,我们可以将Sam对象分配给Student类型的引用变量。当它调用方法研究时,很明显该对象具有打印“Sam正在学习”的学习方法。我看到有人说,由于Reference类型是Superclass,并且方法被隐藏,它调用超类方法,但由于我对对象和引用类型的理解,我无法消化它。即引用变量只是一个指向对象的指针(远程控制类比头部第一个java)
答案 0 :(得分:1)
正如评论中所提到的,私有方法是自动最终和隐藏的。因此,您无法覆盖任何私有方法。
因此,原始方法study
将成为一种全新的方法,并不会超越学生的研究。
请参阅this链接。
答案 1 :(得分:1)
我通过一个简单的例子解释方法隐藏和方法覆盖概念
/* Java program to show that if static method is redefined by
a derived class, then it is not overriding. */
// Superclass
class Base {
// Static method in base class which will be hidden in subclass
public static void display() {
System.out.println("Static or class method from Base");
}
// Non-static method which will be overridden in derived class
public void print() {
System.out.println("Non-static or Instance method from Base");
}
}
// Subclass
class Derived extends Base {
// This method hides display() in Base
public static void display() {
System.out.println("Static or class method from Derived");
}
// This method overrides print() in Base
public void print() {
System.out.println("Non-static or Instance method from Derived");
}
}
// Driver class
public class Test {
public static void main(String args[ ]) {
Base obj1 = new Derived();
// As per overriding rules this should call to class Derive's static
// overridden method. Since static method can not be overridden, it
// calls Base's display()
obj1.display();
// Here overriding works and Derive's print() is called
obj1.print();
}
}
Output:
Static or class method from Base
Non-static or Instance method from Derived
因为我们知道我们不能覆盖静态方法,但是如果我们覆盖静态方法那么它被称为方法隐藏而不是方法覆盖。在简单方法的情况下,它被称为方法覆盖。我希望我已经清除你的怀疑
在上面的例子中
由于方法隐藏发生在上面的代码中,并且在隐藏方法的情况下,你必须记住一个重要的点,即引用变量将决定将调用哪个方法
如果我们这样做
Student student = new Sam();
输出
Student is studying
如果我们这样做
Sam student = new Sam();
输出
sam is studying
如果方法覆盖,则对象将决定调用哪个方法。
答案 2 :(得分:1)
我将尝试用不同的词语解释这一点。 使用Student引用变量,您只能调用Student类可见的方法。由于学生将学习方法定义为私人,并且您从同一班级的主要方法调用学习方法,因此只能在班级内部看到,并且您可以调用学生的学习方法。
要澄清这个概念,请尝试这些变化
你可以调用学习的唯一原因是因为它是从同一个班级调用的。希望这会有所帮助。
答案 3 :(得分:0)
它会从Sam调用该方法,只有当你使它成为virtual
所以它可以具有多态行为时,那么类型为Sam的对象作为学生它确实是对Student的引用,它将调用学生的方法。