在Java中对派生类方法的访问更严格
由于私有、受保护和公共(访问修饰符)影响字段的可访问性和范围。因此,该方法不能是从类外部调用的私有方法。
在程序 1 中:我们为 Derived 类创建对象并调用 foo函数,但是这个 foo函数是私有的,即它的范围仅在 Derived 类中,当我们想通过 Main 类访问时会出错。
在程序 2 中:我们为 Derived 类创建对象并调用 foo函数,而这个 foo函数是公共的,所以这不会出错,因为我们可以从包中的任何地方访问它。
在程序 3 中:这里我们为基类创建对象,然后调用 foo函数,现在派生类和基类中的 foo函数必须是公共的或受保护的(从不私有),因为私有方法仅在该范围内具有可访问性。
注意:被调用的函数永远不会是私有的,因为如果被调用的函数在基类中并且被派生类覆盖,则其范围仅在大括号 ({}) 中,那么派生类中的被覆盖方法也是公共的或受保护的。
程序 1
Java
// file name: Main.java
class Base {
public void foo() { System.out.println("Base"); }
}
class Derived extends Base {
// compiler error
private void foo() { System.out.println("Derived"); }
}
public class Main {
public static void main(String args[])
{
Derived d = new Derived();
d.foo();
}
}
Java
// file name: Main.java
class Base {
private void foo() { System.out.println("Base"); }
}
class Derived extends Base {
// works fine
public void foo() { System.out.println("Derived"); }
}
public class Main {
public static void main(String args[])
{
Derived d = new Derived();
d.foo();
}
}
Java
// file name: Main.java
class Base {
public void foo() { System.out.println("Base"); }
}
class Derived extends Base {
// if foo is private in derived class then it will
// generate an error
public void foo() { System.out.println("Derived"); }
}
public class Main {
public static void main(String args[])
{
Base d = new Base();
d.foo();
}
}
输出 :
prog.java:10: error: foo() in Derived cannot override foo() in Base
private void foo() { System.out.println("Derived"); }
^
attempting to assign weaker access privileges; was public
prog.java:16: error: foo() has private access in Derived
d.foo();
^
2 errors
节目二
Java
// file name: Main.java
class Base {
private void foo() { System.out.println("Base"); }
}
class Derived extends Base {
// works fine
public void foo() { System.out.println("Derived"); }
}
public class Main {
public static void main(String args[])
{
Derived d = new Derived();
d.foo();
}
}
输出
Derived
方案 3
Java
// file name: Main.java
class Base {
public void foo() { System.out.println("Base"); }
}
class Derived extends Base {
// if foo is private in derived class then it will
// generate an error
public void foo() { System.out.println("Derived"); }
}
public class Main {
public static void main(String args[])
{
Base d = new Base();
d.foo();
}
}
输出
Base