public  class BaseClass{

int i = 2;
public void func(){
System.out.println("BaseClass func");
}
}
class SubClass extends BaseClass{
int i = 4;
public void func(){
System.out.println("SubClass func");
}
public static void main(String[] args) {
BaseClass bc = new SubClass();
bc.func();
System.out.println(bc.i);
}
}这段代码,如果用记事本另存为BaseClsas.java,
然后在命令行里面:
javac BaseClass.java
java SubClass
就会有如下结果:
SubClass func
2
但是如果在IDE里面,
例如edicplus或者myeclipse里面,
文件名取为BaseClass
是无法正常运行的,是不是因为IDE默认进行如下操作:
javac BaseClass.java
java BaseClass还是有另外的办法在IDE里面运行该程序?
当然,不能改变该程序。注:如果去掉BaseClass的修饰符public ,
将文件名去为SubClass,
就可以在IDE里面成功运行了。
但我问的是不改变源程序。还有一个问题,
为什么bc.i是父类的i呢?不会被覆盖吗

解决方案 »

  1.   

    为什么bc.i是父类的i呢?不会被覆盖吗
    这个应该是向上类型转换
      

  2.   

    为什么保存成BaseClass.java?按照惯例,应该保存成SubClass.java啊,因为程序入口main()在SubClass.java中啊!
    另外,bc是一个BaseClass类的对象引用,但引用的是其子类SubClass的对象,因为SubClass is a BaseClass。
    在访问bc的方法时会发生动态绑定(多态现象),实际执行的是SubClass类对象的方法。但是请记住,只用访问方法才可能发生多态现象,访问变量时,编译器并没有动态绑定啊。所以,bc.i就是父类的i.
      

  3.   

    因为BaseClass类是public的,所以文件名要保存成BaseClass.java
      

  4.   


    那么你的main函数就写到 BaseClass里。不管怎样 i 的属性是BaseClass的值。
      

  5.   


    那么你的main函数就写到 BaseClass里。不管怎样 i 的属性是BaseClass的值。