刚学不久,刚在网上看都一多态问题,一看自己也一知半解
public class ploytest { public static void main(String[] args) { 
A a = new A(); 
B b = new B(); 
a.s = "[AA]"; 
b.s = "[BB]"; 
a = b; 
System.out.println(a.s); //1
System.out.println(b.s); 
System.out.println(a.getS()); 
System.out.println(b.getS()); 
System.out.println("===================="); 
((A)b).s = "[AA]"; 
System.out.println(a.s); 
System.out.println(b.s); 
System.out.println(a.getS()); 
System.out.println(b.getS()); 

} class A { 
String s = "[A]"; 
String getS() { 
return s; 

} class B extends A{ 
String s = ""; 
String getS() { 
return s; 


//1句输出[A]不太理解,大哥们讲解下啊。。

解决方案 »

  1.   

    [A]
    [BB]
    [BB]
    [BB]
    ====================
    [AA]
    [BB]
    [BB]
    [BB]
     输出的结果是如此的。
      

  2.   

    如果把MAIN函数的a=b去掉
    [AA]
    [BB]
    [AA]
    [BB]
    ====================
    [AA]
    [BB]
    [AA]
    [BB]这样的话很好理解,涉及方法的override
    那么是吊用父类的属性,子类的方法。加了a=b,第1行的[A],我也是不是很理解。有没大大接滚。
      

  3.   

    我明天了一些了。。
    public class ploytest { public static void main(String[] args) { 
    A a = new A(); 
    B b = new B(); 
    a.s = "[AA]"; 
    b.s = "[BB]"; 
    a = b; 
    System.out.println(a.s); //1因为a=b,故,a还是指向了原来的,上面的修改没有作用,要 
    //是加在a = b ;这句之后,就会变成"[AA]";
    System.out.println(b.s); 
    System.out.println(a.getS()); 
    System.out.println(b.getS()); 
    System.out.println("===================="); 
    ((A)b).s = "[AA]"; 
    System.out.println(a.s); 
    System.out.println(b.s); 
    System.out.println(a.getS()); 
    System.out.println(b.getS()); 

    } class A { 
    String s = "[A]"; 
    String getS() { 
    return s; 

    } class B extends A{ 
    String s = ""; 
    String getS() { 
    return s; 


      

  4.   

    我刚刚摸到JAVA的门,我说的尽供参考
    要实现多态
    1 有 继承 extends        比如 class B extends A            这就满足
    2 要有重写               比如 class A B都有 String getS();这就满足
    3 父类引用指向子类对象   比如 你的程序   A a = new A(); 
                                             B b = new B();
                                             a = b;//将子类对象b  给  父类引用a
                                             也就是  父类引用a 指向 子类对象b
                                                     a b是同一对象 (只不过a只能看到b的
                                                                    一部分)
                                             相当于  A a = new B();
    所以一旦满足  父类a 对象调用的就是 子类b的方法
      

  5.   

    楼上的顶
    所以我觉得
    A a = new A(); 
    B b = new B();
    a = b;//将子类对象b  给  父类引用a
    相当于:
    A a = new B(); 
    B b = new B();
    a = b;//
    应该没有错吧?
      

  6.   

    ""linyong07() 楼上的顶
    所以我觉得
    A a = new A(); 
    B b = new B();
    a = b;//将子类对象b  给  父类引用a
    相当于:
    A a = new B(); 
    B b = new B();
    a = b;//
    应该没有错吧?""你的都没变,,,
    A a = new A(); 
    B b = new B();
    a = b;
    是相当于
    A a = new B();//上面3句相当于这一句
      

  7.   

    A a = new B(); 
    //B b = new B();
    a = b你这着做就多此一举了,不需要这, 你那样做是让a从新指向一个新的B对象
      

  8.   

    A a = new B(); 
    //B b = new B();
    a = b你这着做就多此一举了,不需要这, 你那样做是让a从新指向一个新的B对象
    是什么意思啊?
    A a = new B(); 
    a = b;
    这样不行吧? b没有定义啊
    那如果是这样呢:
    A a ;
    B b = new B();
    a = b;
    总可以吧?这个应该没有指向新的对象吧?(原来的没有初始化嘛)
    是不是啊。。请求xiangfeidecainiao() 回答。你对我帮助很大。呵呵
      

  9.   

    你要理解B类到底含有哪些字段和方法:
    B:
    字段
    A-->s
    B-->s
    方法:
    B-->getS()//覆盖了基类的getS()
    A a=new A();
    a.s = "[AA]"; 
    原来的a指向一个A类对象,此对象的s被设置为[AA]
    但是
    a=b后,a变量指向了另一个对象.原来的A类对象等着垃圾回收.
    a=b换句话说,就是把b指向的B类对象向上转型为A类对象.A a = new A(); 
    B b = new B(); 
    a.s = "[AA]"; 
    b.s = "[BB]"; 
    a = b; 
    这些句子的作用就等于:
    B b=new B();
    b.s="[BB]";
    A a=b;此时的b,含有两个实例:
    A-->s="[A]"
    B-->s="[BB]"由于
    a指向基类,因此a.s得到的是A-->s
    所以此时System.out.println(a.s); 输出是"[A]"((A)b).s = "[AA]";
    由于b被转型为A类,故设置的是A-->s="[AA]"
    因此此时System.out.println(a.s);输出变为"[AA]"由于B类的方法覆盖了A类
    所以无论是a.getS(),还是b.getS()
    均调用的是B-->getS()
      

  10.   

    英雄所见略同,楼上讲得不错,在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则:
    1)实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时由Java虚拟机动态决定的。
    2)静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经作了绑定。
    3)成员变量(包括静态变量和实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经作了绑定。
      

  11.   

    A a = new B(); 
    //B b = new B();
    //a = b 这里也要加,刚刚打快了忘记了,不好意思啊
      

  12.   

    fuyang_ywf() 你讲的太好了。。呵呵
    楼上的CoolNO() 
    你讲的太抽象了,看了半天没看明白,能不能通俗点啊。
      

  13.   

    楼上的几位把关键的地方都的都讲了。
    我也来说一个关于多态的问题。
    在用
    [父类名称]变量名称 = new [子类构造函数]
    的时候,
    NEW出来的对象只能调用父类的方法,子类特有的方法该对象不能使用。
    如果该子类重写了父类的方法,那该对象调用的方法是子类的方法,而不是父类的方法
      

  14.   

    说实在的我看了上面的回答都开始怀疑csdn了,
      

  15.   

    nowave2004() ( ) 信誉:100    Blog   加为好友  2007-06-03 04:23:45  得分: 0  说实在的我看了上面的回答都开始怀疑csdn了,=======================================请指教