浏览 539 次
|
精华帖 (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就是哪个类的成员。 第一次发文章,有意见的话请多多指教。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-06-26
简单来说:static是不允许被继承的
|
|
| 返回顶楼 | |
|
最后更新时间:2008-07-07
static只是属于某个类,不属于某个特定的对象
|
|
| 返回顶楼 | |




