形似于A a = new B() 的疑惑!
1.对象a到底是基类A的对象还是派生类B的对象?
2.有文章说B是实质类,A只是声明了一个引用,这样的话为什么对象不能调用B中的方法,而只能调用A中的方法。
3.我发现在这样使用时,一般都是在类中存在重写(override)或者隐藏(new)的应用时,而且上述两个关键字只对A a = new B() 形势调用时有作用,有一种说法是:只有在派生类对象被基类重塑时上述两个关键字才会起作用。这种说法对吗?这就是所谓“派生类对象被基类重塑”的全部意义?
希望高手来答,我觉得和我这个水平上的许多人都有自己的看法,但是没人敢说自己的看法是对的。呵呵!
1.对象a到底是基类A的对象还是派生类B的对象?
2.有文章说B是实质类,A只是声明了一个引用,这样的话为什么对象不能调用B中的方法,而只能调用A中的方法。
3.我发现在这样使用时,一般都是在类中存在重写(override)或者隐藏(new)的应用时,而且上述两个关键字只对A a = new B() 形势调用时有作用,有一种说法是:只有在派生类对象被基类重塑时上述两个关键字才会起作用。这种说法对吗?这就是所谓“派生类对象被基类重塑”的全部意义?
希望高手来答,我觉得和我这个水平上的许多人都有自己的看法,但是没人敢说自己的看法是对的。呵呵!
{
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. 因为A类型中的引用不知道B中的函数,如果要调用B的函数,需要强制转换B b = (B)a;
3. 有的面向对象方法学说, 不要从concrete类中继承,也就是说父类和接口只是一个约定,客户只要持有这个父类或者借口的引用,就是按照约定操作这个类,而子类实现这个约定。因此实现解构,就是客户不关心子类的实现。
.NET框架程序设计(修订版)(译者:李建忠)里面说的很清楚:没一个对象实际上有个隐藏成员:函数表对象转换实际上就是改动了这个函数表而已A a = new B() 实际就是把对象b的指针引用给了a,而后把A的函数表给b套上关键字:隐藏(new)实际上是把函数表中那个指针指向的地址给改了
重写(override)则是把指针指向的地址里的内容给改了呵呵,先把实际上这个就是c++中*p,&p的区别有空看一下:侯捷的两本《深入浅出mfc》《深度探索C++对象模型》
或者去博客园clr研究小组看看
http://www.cnblogs.com/anytao/archive/2008/04/09/anytao_insidenet_example.html
{
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("");
}
}
{
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的