论坛首页 Java版 OO

Java 继承静态成员解惑。

浏览 489 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2008-06-26 关键字: inheritance
先看一段程序,猜猜看输出的结果是什么?
class Super {
    static int stat = 1;
    int nonStat = 2;
	
    static int statMethod(){
        return 3;
    }
	
    int nonStatMethod(){
        return 4;
    }
}
 
public class Sub extends Super {
    static int stat = 10;
    int nonStat = 20;
 
    static int statMethod(){
        return 30;
    }
	
    int nonStatMethod(){
        return 40;
    }
 
    public static void main(String[] args) {
        Super s = new Sub();
        System.out.println("Static is " + s.stat);
        System.out.println("Non-Static is " + s.nonStat);
        System.out.println("Static method is " + s.statMethod() );
        System.out.println("Non-Static method is " + s.nonStatMethod() );
	
        Sub sub = (Sub)s;
        System.out.println("Static is " + sub.stat);
        System.out.println("Non-Static is " + sub.nonStat);
        System.out.println("Static method is " + sub.statMethod() );
        System.out.println("Non-Static method is " + sub.nonStatMethod() );	
    }
}








输出结果是:

Static is 1
Non-Static is 2
Static method is 3
Non-Static method is 40
Static is 10
Non-Static is 20
Static method is 30
Non-Static method is 40


可能你要问: WHY ?

在这里,教给你一个我总结的一个小技巧,这个小技巧基本上能接决Java使用继承时的大部分疑惑。

首先,“动态联编”-- 想起什么了吗? C++里的概念? 呵呵,是的,我猜想面像OO语言大部分应该是使用“动态联编”来达到继承多态这个目的的,Java应该也是。
也就是说java在访问非静态成员时是采用动态联编的,也就是说在程序每运行到someObject.someMethod()的时候都会去找someObject到底是那个对像的引用,然后再去找那个对像是属于哪个类的,然后再调用那个被找到的类的someMethod. 注意,someMethod一定得是“非静态”的。

除了上面所提到的“非静态”成员采用动态联编外,类的所用静态成员均采用"静态联编",也就是说在someObject.someField的someField在程序运行之前就确定下来了,而确定方法是根据someObject的“声明类型”确定的。就是说someObject被声明为哪个类,someField就是哪个类的成员。

第一次发文章,有意见的话请多多指教。
   
时间:2008-06-26
简单来说:static是不允许被继承的
   
0 请登录后投票
时间:2008-07-07
static只是属于某个类,不属于某个特定的对象
   
0 请登录后投票
论坛首页 Java版 OO

跳转论坛:
JavaEye推荐