代码如下:
class child{
int i=20 ;
void print(){
System.out.println("child") ;
}}
class boy extends child{
int i=10 ;
void print(){
System.out.println("boy") ;
}
}
public class test  {
public static void main(String[] args){
child num=new boy() ;
System.out.println(num.i) ;
num.print() ;
}
}输出结果为:
20
boy
不知道为何分别输出父类的成员变量和子类的成员函数,哪位大哥知道的话给小弟讲解一下,谢谢

解决方案 »

  1.   

    child 里面有个变量i,boy里面除了继承了child的i外还有个自己的变量i
    child num=new boy() ;
     System.out.println(num.i) ;
    这个时候访问的是child的i了,如果不转型的话就是boy的了
      

  2.   

    恩 这样就是10了
    System.out.println(((Boy)num).i);
      

  3.   

    因为boy继承了child类,复写了print()方法,在用父类new一个子类的对象时,会优先使用子类的方法,所以打印出来的是boy
      

  4.   

    这不是相当于解释了吗,方法有多态,所以对父类引用调用方法,实际上是调用的这个子类的方法,属性没有多态所以你用父类引用调用的就是父类的属性,子类引用就是子类的。当父类和子类有相同的非私有属性时,建议你直接使用父类的属性。这样才会有影响,否则是不影响的。除非在子类中使用super去改父类属性
      

  5.   


    child num=new boy() ; 定义了一个父类对象
    System.out.println(num.i) ; 调用i 输出i=20
    num.print() ; 由于子类重写了print()方法 调用子类print()方法 输出boy
      

  6.   

    楼主没看过关于重写和多态的概念么?child num=new boy() ; // 应该是实例化了一个子类,但赋予了父类变量System.out.println(num.i) ; // 调用i输出i=20,因为你调用父类变量去访问的,而成员属性并没有多态概念,所以它会老老实实的根据父类类型去找对应的成员属性num.print(); // 由于子类重写了print()方法;根据多态的特性,将自动调用重写的成员函数。没必要觉得很奇怪,总的来说,这就是Java语言规范所规定的而已。
      

  7.   

    你好,属性是绑定到对象的,方法是动态绑定的,你子类已经把父类的方法给覆盖了,所以调用子类的方法,而属性是不会的因为你变量是child类型的。
                                                                                 成都云时代-白老师
      

  8.   

    这是父类引用指向子类对象,后面输出boy是多态