形似于A a = new B() 的疑惑!
1.对象a到底是基类A的对象还是派生类B的对象?
2.有文章说B是实质类,A只是声明了一个引用,这样的话为什么对象不能调用B中的方法,而只能调用A中的方法。
3.我发现在这样使用时,一般都是在类中存在重写(override)或者隐藏(new)的应用时,而且上述两个关键字只对A a = new B() 形势调用时有作用,有一种说法是:只有在派生类对象被基类重塑时上述两个关键字才会起作用。这种说法对吗?这就是所谓“派生类对象被基类重塑”的全部意义?
希望高手来答,我觉得和我这个水平上的许多人都有自己的看法,但是没人敢说自己的看法是对的。呵呵!

解决方案 »

  1.   

    class   A   
      {   
          public   void   print(){}   
      }   
      class   B   extends   A{   
          public   void   print(){}   
      }   
      class   C   extends   A{   
          public   void   print(){}   
      }   
        
      class   Test   
      {   
          public   void   testa(A   a)   
        {   
            a.print();   
        }   
          public   static   void   main(String[]   args)   
          {   
                A   a   =   new   B();   
                A   a1   =   new   C();   
                Test   t   =   new   Test();   
                t.testa(a);//调用B中的public   void   print(){}   
                t.testa(a1);//调用C中的public   void   print(){}   
            }   
      }
    多态.
      

  2.   

    1. a是派生类的对象
    2. 因为A类型中的引用不知道B中的函数,如果要调用B的函数,需要强制转换B b = (B)a;
    3. 有的面向对象方法学说, 不要从concrete类中继承,也就是说父类和接口只是一个约定,客户只要持有这个父类或者借口的引用,就是按照约定操作这个类,而子类实现这个约定。因此实现解构,就是客户不关心子类的实现。
      

  3.   

    先把 OOP 三大概念弄清楚.
      

  4.   

    我试了ericzhangbo1982111的方法,怎么调用的是还是基类中的方法?
      

  5.   

    请先看
    .NET框架程序设计(修订版)(译者:李建忠)里面说的很清楚:没一个对象实际上有个隐藏成员:函数表对象转换实际上就是改动了这个函数表而已A a = new B() 实际就是把对象b的指针引用给了a,而后把A的函数表给b套上关键字:隐藏(new)实际上是把函数表中那个指针指向的地址给改了
            重写(override)则是把指针指向的地址里的内容给改了呵呵,先把实际上这个就是c++中*p,&p的区别有空看一下:侯捷的两本《深入浅出mfc》《深度探索C++对象模型》
    或者去博客园clr研究小组看看 
      

  6.   

    ps:也可以去看看这个《你必须知道的.NET》
    http://www.cnblogs.com/anytao/archive/2008/04/09/anytao_insidenet_example.html
      

  7.   

    我那个是java的代码.... public class c1
        {
            public virtual string ff(string f)
            {
                return "123";
            }
        }
        public class B : c1
        {
            public override string ff(string f)
            {
                return "321";
            }
        }
    public class C : c1
        {
            public override string ff(string f)
            {
                return "ccc";
            }
        }
    class Program
        {
            static void Main(string[] args)
            {            c1 c = new B();
                c1 c2 = new C();
                string s2 = c.ff("");
                s2 = c2.ff("");
            }
        }
      

  8.   

    晕呀  我也用的2楼的方法  只是稍微改了点   代码如下  结果调用的还是基类的print()class Program
        {
            public void testa(A a)
            {
                a.print();
            }
            static void Main(string[] args)
            {
                A a = new B();
                A a1 = new C();
                Program t = new Program();
                t.testa(a);//调用B中的public  void  print(){}  
                t.testa(a1);//调用C中的public  void  print(){}             Console.ReadLine();
            }
        }    class  A  
        {  
          public  void  print()
          {
              Console.WriteLine("调用A的");
          }  
        }  
      class  B:A
      {  
          public  void  print()
          {
              Console.WriteLine("调用B的");
          }  
      }  
      class  C:A
      {  
          public  void  print()
          {
              Console.WriteLine("调用C的");
          }  
      }  
    运行时显示:
                 调用A的
                 调用A的