代码如下:
class Base1 {
  public int mm = 2;
  public void pri(){
    System.out.print(mm);
  }
}class Sub1 extends Base1{
  public int mm = 5;
  public void pri(){
    System.out.print(mm);
  }
}class test {
  public static void main(String[] args){
    Base1 app1 = new Sub1();
    app1.pri();//为什么这里调用的是子类得pri方法而下面这句中输出的是父类的属性值??!
    System.out.print(app1.mm);
  }
}难道子类能改写父类中同名的方法不能改写父类中同名的属性值???!请大家指教,谢谢!

解决方案 »

  1.   

    app1是父类类型的,app1.mm应该是父类类型的mm,也就是2了。app1.pri()是动态绑定,执行的是子类的pri().
      

  2.   

    多态是对方法来的;
    Base1 app1 = new Sub1();把Sub1的对象上升到Base1,
    调用变量时就是调用这个对象实例的变量;
    调用方法时,是调用这个对象实例的方法;这里有个特殊性,就是调用生成的对象的方法;这个地方是多态的体现;
    总之,多态是体现在方法上而不是变量上
      

  3.   

    当app1调用方法时,是本实例的方法,也就是Sub1的方法
      

  4.   

    我来回答你的问题,我开始学习java的时候,也在这方面的问题上胡涂过,赫赫。
    你的例子是明显的超类引用指向子类对象,这是一种常用的“多态”机制,主要是为了用超类的应用管理子类的对象方便,估计你是个新手,如果以后学习到接口的时候,你就会越来越明白为什么要这么做了。当用这种多态机制的时候,往往还要伴随着子类重写夫类的同名方法(包括实例方法和静态方法),也许还会有同名的变量(包括实例变量和静态变量)。下面这个例子就会让你彻底明白这一系列的问题到底是怎么回事:
    //: ConversionTest.java//package g3ds.joop.ch4;class Super{
    static String str1="超类的静态变量";
    String str2="超类的实例变量";

    static void showStatic(){
    System.out.println("超类的静态方法");
    }

    void showNonStatic(){
    System.out.println("超类的实例方法");
    }
    }class This extends Super{
    //定义与超类重名的静态变量
    static String str1="子类的静态变量";

    //定义与超类重名的实例变量
    String str2="子类的实例变量";

    //当改写超类的静态方法时,在当前类中也必须设计为静态的,否则报错!
    static void showStatic(){
    System.out.println("子类的静态方法");
    }

    //改写超类的实例方法
    void showNonStatic(){
    System.out.println("子类的实例方法");
    }

    //添加子类特有的成员变量,可以是静态的或者非静态的
    static String str3="子类特有成员变量";

    //添加子类特有的成员方法,可以是静态的或者非静态的
    void showDetail(){
    System.out.println("子类特有的成员方法");
    }
    }public class ConversionTest{
    public static void main(String arg[]){
    //测试:以超类声明以子类实例化,存在转型
    Super obj=new This();

    //对静态和非静态成员的多态机制测试
    System.out.println(obj.str1);
    System.out.println(obj.str2);
    obj.showStatic();
    obj.showNonStatic();

    }
    }执行的结果如下:
    超类的静态变量
    超类的实例变量
    超类的静态方法
    子类的实例方法这下楼主应该明白了吧???
    总结以下几点:
    1、对于实例变量和静态变量,多态机制反应的是“超类的属性”。
    2、对于静态方法,多态机制反映的是“超类的属性”。
    3、对于实例方法,多态机制反应的是“子类的属性”。
    当然我不知道你学习了“包”机制没有,在不同的包中,子类和超类里的同名方法并不一定是“覆盖”关系了,这点要你在以后的学习中特别要注意!不知道我的回答你满意吗?