使用私有访问修饰符隐藏的方法

时间:2016-10-10 05:48:32

标签: java inheritance

有问题的代码是:

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)

4 个答案:

答案 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类可见的方法。由于学生将学习方法定义为私人,并且您从同一班级的主要方法调用学习方法,因此只能在班级内部看到,并且您可以调用学生的学习方法。

要澄清这个概念,请尝试这些变化

  • 在main中使用相同的代码到另一个类中,即创建Student的对象并尝试调用其学习方法。它不会编译为不可见
  • 即使对象属于Sam类型,由于您使用的是学生参考变量,因此仍然无法看到学习。

你可以调用学习的唯一原因是因为它是从同一个班级调用的。希望这会有所帮助。

答案 3 :(得分:0)

它会从Sam调用该方法,只有当你使它成为virtual所以它可以具有多态行为时,那么类型为Sam的对象作为学生它确实是对Student的引用,它将调用学生的方法。