你是否尝试过这样子调用?
//another class
public static void main(String args[]){
Son.f();
}
看看这样子还能通过么?
我的结果是,也能通过!!!!!!!
我认为他的意思是static方法,根本不能够继承
这样子就没有覆盖的意思了
//another class
public static void main(String args[]){
Son.f();
}
看看这样子还能通过么?
我的结果是,也能通过!!!!!!!
我认为他的意思是static方法,根本不能够继承
这样子就没有覆盖的意思了
如果你用
Father f=new Son();
f.f();//这里调用的还是Father.f()的方法,与直接用Father.f()调用的结果相同,因为f是Father类型的如果这样调用:
Son s=new Son();
s.f();//这里调用的就是Son.f()的方法了,因为s是Son类型的也就是说static修饰的部分是不能被覆盖、重写的
public A(){
}
public static void fun()
{ System.out.println("it is in A"); }
}public class B extends A {
public static void main(String[] agr)
{
A a = new B();
a.fun();
} public static void fun() { System.out.println("it is in B"); }
}
运行结果it is in A
B b = new B();
b.fun();
则出来就是:it is in B
package chap2;
class Son extends Father
{
static void f()
{
System.out.println(1);
}
public static void main(String args[]){
Son.f();
Father.f();
}}则输出为
1
0
而如果为:
package chap2;class Son extends Father
{ public static void main(String args[]){
Son.f();
Father.f();
}}
则输出为:
0
0
我认为这时Son默认是继承Father的。则说明static方法可以继承也可以重载!!!!
static的属性和方法是可以继承的,但不能重载,你那种不是重载!!!
其实继承类中同名,同参数的方式只是把父类的static方法隐藏起来了。
Father f=new Son();
f.f();//因为f是Father类型的,所以调用的还是Father.f()的方法,
//与直接用Father.f()调用的结果相同,但如果这个方法不是static类型的话,就调用Son类中的方法,这是由于上溯造型既类
的多形性特性造成的。
类的static方法只要程序开始运行,便在内存中分配一块指向固定地址的函数指针。对该类的任何处理,比如继承或是实例化都不会影响这个固定的指针(即所谓静态)。
根据《c++ completely reference》中所述,类的继承是分层的,继承树中的某个对象拥有其树中其他父对象的指针,尤其是在多重继承中就更加显而易见!这里举个简单例子:Son son = new Son();
Father father = (Father)son;
在java中继承中的重写都是动态绑定的覆盖,Father中定义了一个非Static方法 f();Son覆盖(重写)了该方法,上面的程序无论是son.f()还是father.f()其实调用的都是son.f().而在C++中除非声明f()是虚函数,否则上面的程序结果正好相反,son.f()就是son.f()而father.f()调用的是father.f(),;结合wdong18(东东)的见解,可以认为在c++和JAVA中对于继承树中的被覆盖的静态方法是一样的,就是静态函数指针,不可以被覆盖。java中的继承,类也同样是分层的。