一、为什么System.out.println(temp.a);这句输出的是12?temp不是一个指向SubClass的SuperClass类型的句柄马?如果这么理解不是应该输出的是13马?temp.test();输出的不就是SubClass里的方法吗?属性是不具有多态性的 你是声明的什么类型 调用属性调用相应类的属性
temp被声明为SuperClass 调用它的a就是SuperClass的a 调用test的时候 因为方法的多态性 这时候时SubClass的二、如果SuperClass中test,改写成private void test() eclispe会抱错,又没有调用SuperClass中的test方法,为什么会抱错呢?谢谢大家拉!
 
你通过tmp调用test方法 首先起码要SuperClass的这个方法 你可以访问,然后才涉及到多态
你既然设为private 肯定就不能调用了虽然你是调用Sub的方法但是你是通过Super调用的 起码这个入口你要有权限

解决方案 »

  1.   

    同意楼上的
    面向对象语言的多态性只是针对函数而言
    对于属性来说,基类与派生类没有重载的可能性。并且是用SuperClass还是SubClass中的属性,在编译期间就已经确定下来了。
    也就是说如果你写System.out.println(((SubClass)temp).a);
    做个类型转化,那么输出的就是13了
      

  2.   

    SuperClass temp = new SubClass();这样定义后,在内存中是有几个对象呢?是一个还是二个?还请大手们指教。
      

  3.   

    SuperClass temp = new SubClass();这样定义后,在内存中是有几个对象呢?是一个还是二个?还请大手们指教。
    创建两个对象,从JAVA虚拟机的角度讲,temp是一个类引用变量,new SubClass()是一个类引用。
    对于用父类指向子类对象,主要的一点就是父引用变量只能访问到它本身定义的所有对象,而它不知道其子类又重新定
    义了哪些属性和方法,所以才会得到这样的结果。