Java 面向对象/Java 继承
我们可以重写Java中的私有方法吗?
让我们首先考虑下面的Java程序作为覆盖或运行时多态的简单示例。
class Base {
public void fun() {
System.out.println("Base fun");
}
}
class Derived extends Base {
public void fun() { // overrides the Base's fun()
System.out.println("Derived fun");
}
public static void main(String[] args) {
Base obj = new Derived();
obj.fun();
}
}
该程序打印“Derived fun”。
基类引用'obj'引用派生类对象(请参阅表达式“Base obj = new Derived()”)。当在obj上调用fun()时,根据引用对象的类型进行调用,而不是根据引用。
私有方法是否可行?
预测下列程序的输出。
class Base {
private void fun() {
System.out.println("Base fun");
}
}
class Derived extends Base {
private void fun() {
System.out.println("Derived fun");
}
public static void main(String[] args) {
Base obj = new Derived();
obj.fun();
}
}
我们得到编译器错误“fun()在Base中有私人访问”。所以编译器试图调用基类函数,而不是派生类,意味着fun()不被覆盖。
内部类可以访问其外部类的私有成员。如果我们扩展一个内部类并在内部类中创建fun(),该怎么办?
内部类可以访问其外部类的私有成员,例如在下面的程序中,内部访问的私有数据成员味精的fun()(这是编译器很好的)。
/* Java program to demonstrate whether we can override private method
of outer class inside its inner class */
class Outer {
private String msg = "GeeksforGeeks";
private void fun() {
System.out.println("Outer fun()");
}
class Inner extends Outer {
private void fun() {
System.out.println("Accessing Private Member of Outer: " + msg);
}
}
public static void main(String args[]) {
// In order to create instance of Inner class, we need an Outer
// class instance. So, first create Outer class instance and then
// inner class instance.
Outer o = new Outer();
Inner i = o.new Inner();
// This will call Inner's fun, the purpose of this call is to
// show that private members of Outer can be accessed in Inner.
i.fun();
// o.fun() calls Outer's fun (No run-time polymorphism).
o = i;
o.fun();
}
}
输出:
Accessing Private Member of Outer: GeeksforGeeks
Outer fun()
在上面的程序中,我们创建了一个外部类和一个内部类。我们从Outer扩展Inner并在Outer和Inner中创建了一个fun()方法。如果我们观察我们的输出结果,很明显fun()方法没有被覆盖。这是因为私有方法在编译期间被绑定,它是引用变量的类型 - 而不是引用的对象的类型 - 决定了要调用的方法。。作为一个侧面说明,由于静态绑定,私有方法在性能上可能更好(与非私有方法和非最终方法相比)。