1、java中private方法默认方式是final,因为private是不能被覆盖的,但是当子类覆盖了基类的private方法时,java编译器并不会报错。所以类中所谓的接口是不包括private的方法的。
2、和c++不同的是,子类是可以重载基类中的方法的,c++不会出现编译错误但是可能和我们所期望的运行结果不同,看下面的例子
class a{
public void f(int k){
System.out.println("inside a.f()");
}
}
class b extends a{
public void f(double k){
System.out.println("inside b.f()");
}
}
public class test{
public static void main(String []args){
b tmp=new b();
tmp.f(1);
//output: inside a.f()
tmp.f(1.0);
//output: inside b.f()
}
}
#include<stdio.h>
class a
{
public:
void f(int k)
{
printf("inside a.f()\n");
}
};
class b:public a
{
public:
void f(double k)
{
printf("inside b.f()\n");
}
};
int main()
{
b *test=new b();
test->f(1);
//output:inside b.f()
test->f(1.0);
//output:inside b.f();
return 0;
}
3、当基类的构造器正在调用子类的动态绑定方法的时候,其结果会让人大吃一惊,看下例
class a{
public a(){
System.out.println("before f()");
f();
System.out.println("after f()");
}
public void f(){
System.out.println("a.f()");
}
}
public class test extends a{
private int r=1;
public test(int ra){
r=ra;
System.out.println("test.test() r="+r);
}
public void f(){
System.out.println("test.f() r="+r);
}
public static void main(String []args){
new test(5);
//output:
before f()
test.f() r=0 //why not "test.f() r=1" ??
after f()
test.test() r=5
}
}