📜  在Java中对派生类方法的访问更严格

📅  最后修改于: 2022-05-13 01:54:58.473000             🧑  作者: Mango

在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