package com.oo;public class TestStatic {
public static void main(String[] args) {
A a = new A();
System.out.println(a.i);
a.hello();

B b = new B();
System.out.println(b.i);
b.hello();

A c = new B();
System.out.println(c.i);
c.hello();
}
}class A {
int i = 10;
public void hello() {
System.out.println("hello A");
}
}class B extends A {
int i = 20;
public void hello() {
System.out.println("hello,B");
}
}为什么调用的是父类的属性

解决方案 »

  1.   

    这个问题与多态有关。子类不会继承父类的成员变量。你A中i不会继承给B。如果你想更深入些的话可以去参照下thinking in java的有关多态的知识。
      

  2.   

      System.out.println(c.i);
    这个应该输出的是B的属性吧
            c.hello();
    这个是B的没的说
      

  3.   

    打印的是
    10
    hello A
    20
    hello,B
    10
    hello,B
      

  4.   

    多态有两种形式:一种是方法的重载与覆写,另一种是对象的多态。我想LZ是考虑继承部分多了点。通过B来实例化A,发生了向上转型,理解为他们都各自持有自己的属性就好了。
      

  5.   

    子类对象赋值给父类对象,就像楼主的程序:
     A c = new B(); (声明父类,创建子类).
    对对象c 而言:
    属性是父类的,方法是父类的.(没有覆写).
    属性是父类的,方法是子类的.(有覆写).
      

  6.   

    因为c是A类型的引用,c.i访问到的就是A中定义的i,你若把A中定义的 int i = 10; 删掉,编译时就会报错
      

  7.   

    结合现实生活,类B是类A的子类,类B具有类A的所有功能即方法,因为类B是类A的儿子,但是,儿子不会长的跟爹一模一样,也就是描述属性的东西不会一样,所以也就是说成员变量不会被继承。
      

  8.   

    成员变量支持重写,但不支持后期绑定,成员变量的调用和调用它的引用类型保持一致。lz在子类中对父类的成员变量i进行了重写,所以b.i的值为20,若没有重写,那么子类也使用父类的成员变量,b.i就会为10。但是c是父类型的引用,指向的成员变量也应该是父类型的,所以其值为10方法为后期绑定,如果重写了方法,那么就会调用子类相应的方法
      

  9.   

    这是典型的向上强转:
    即new的时B类,即产生B类中的结果,但由于返回的对象类型为A类类型,故对于A类型的对象,只有A类中的属性字段有效
      

  10.   


    支持这种说法:c.i 访问的就因该是a中的属性i,如果给属性增加get,set方法,在通过方法访问就该是b中的i了,面向对象也建议吧成员设为private的 然后给成员提供get,set方法!    
      

  11.   

    我稍稍看了你写的这段代码:A c = new B();//父类的引用指向子类的对象(向上转型)必定调用B类你从写的方法,
            System.out.println(c.i);//关键是这句话,在Java中啊,在(向上转型)中,只要调用方法这么一说啊,没有调用变量这么一说,所以啊,这儿应该还是A类的变量啦!
            c.hello();//调用的应该是B类的hello方法!
                我这么一说,相信你会理解的啦!
      

  12.   

             A c = new B();//父类引用指向子类对象(向上转型)注意:如果子类的将父类的方法从写了,就得调用子类的方法
            System.out.println(c.i);//关键   在Java中 向上转型只有调用被从写的子类方法这么意见,没有调用子类变量这么一讲,所以调用的是A类的变量  应该是10
            c.hello();//很显然是调用子类即B()类方法
      

  13.   

    方法重写有多态,属性没有,每个类有各自的属性
           B b = new B();
            System.out.println(b.i);
            b.hello();
            
            A c = new B();
            System.out.println(c.i);
            c.hello();
    这两段代码完全一样,怎么会输出:
    20
    hello,B
    10
    hello,B