在Java中,private方法是隐式final的,就是说即使在子类中定义一个一模一样的方法,编译器认为这是两个没有联系的方法。private方法不参与运行时多态,这点和
final方法、static方法是一样的,而且,对显式final方法试图进行重写是会出错的,而对隐式final(private,static)方法可以在子类中定义一模一样的方法,只是不会
参与运行时多态。也就是说,Java中除了声明为final、static、private的方法,其他都是默认的虚方法。
而在C++中却是完全不同的处理思路,C++中可以为父类的private方法声明为virtual,也就是说可以在之子类中override,可以实现运行时多态。
看下面这两段代码在C++和Java中的不同:
1 //C++ 2 #include <iostream> 3 using namespace std; 4 5 class Base { 6 public: 7 void f() { 8 g(); 9 } 10 11 private: 12 virtual void g() { 13 cout << "Hi, MorningStar! I am g() of Base!." << endl; 14 } 15 }; 16 17 class Derived : public Base { 18 private: 19 virtual void g() { 20 cout << "Hi, MorningStar! I am g() of Derived." << endl; 21 } 22 }; 23 24 int main() { 25 Base *pB = new Derived(); 26 pB->f(); //print Hi, MorningStar! I am g() of Derived. 27 delete pB; 28 return 0; 29 }
1 //java 2 class Base { 3 public void f() { 4 g(); 5 } 6 7 private void g() { 8 System.out.println("Hi, MorningStar! I am g() of Base."); 9 } 10 } 11 12 public class Derived extends Base { 13 private void g() { 14 System.out.println("Hi, MorningStar! I am g() of Derived."); 15 } 16 17 public static void main(String[] args) { 18 Base b = new Derived(); 19 b.f(); // print Hi, MorningStar! I am g() of Base. 20 } 21 }
其实大可不必惊讶,不同语言的设计者的想法不同,当然会在这种语言的细节上有一些差异。。只需要深刻理解面向对象的设计思想即可。
参考:C++、Java和C#语言在处理“虚拟私有方法”的差异。
另:下午研究了一波Java8 中接口的默认方法,觉得和C++中的多继承有点像。注意接口的静态方法既不能被接口继承也不能被类继承。
发现C++的多继承和虚继承还挺简单的。嘿嘿。
参考:Java8 默认方法。
时间: 2024-11-08 15:34:32