在C#中怎么和JAVA的继承不同呢? namespace FirstProgram { using System; class Test { static void Main() { cat Acat=new cat(); Acat.printCat(); Acat.printName(); cat Atiger=new tiger(); Atiger.printCat(); Atiger.printName(); Console.Read(); } } class cat { public String name="Cat"; public void printCat() { Console.WriteLine("I am a cat!"); } public void printName() { Console.WriteLine(name); } } class tiger: cat{ public new String name="Tiger"; public new void printCat() { Console.WriteLine("I am a tiger!"); } public new void printName() { Console.WriteLine(name); } } } 结果是: I am a cat! cat Iam a Cat! cat
cat Acat=new tiger();
的时候自动upcast到cat类型,upcast是自动并且安全的。
上面这个例子其实是要说明OOP里面多态在java语言里的特性。
类tiger里面重载了类act的printCat和printname方法,所以
Acat.printCat();
Acat.printname();
这两句打印出来都是tiger的方法里面的信息(Acat是tiger的实例)。
最后的cat为什么会打印类cat的name值呢?
因为在tiger类里面虽然也有一个同名字的成员name,但是实际上他们
两个的namingspace不是一样的,一个是cat.name,另外一个是tiger.name,
所以,cat类型的引用Acat便会打印出cat的name出来而不是tiger类的name。
如果最后一句改成
System.out.println(((tiger)Acat).name);
便会打印出tiger来
来自于tiger的实例class tiger extends cat
tiger继承于cat类一个老虎继承于猫科的类
类tiger里面重载了printCat和printname方法,把类cat里的这两个方法覆盖了
所以tiger可以向上转型成cat.
Acat 实际指向 tiger类。
你调用Acat的方法时是用的tiger类方法,这是动态绑定
但是如果你调用的是字段,那么它调用的是cat类里的字段
cat类的引用指向了一个tiger类的实例,程序运行中调用的是运行时的类型
"动态绑定只绑定方法,不绑定属性"这句话记住就可以了
namespace FirstProgram
{
using System;
class Test
{
static void Main()
{
cat Acat=new cat();
Acat.printCat();
Acat.printName();
cat Atiger=new tiger();
Atiger.printCat();
Atiger.printName();
Console.Read();
}
} class cat
{
public String name="Cat";
public void printCat()
{
Console.WriteLine("I am a cat!");
}
public void printName()
{
Console.WriteLine(name);
}
} class tiger: cat{
public new String name="Tiger";
public new void printCat()
{
Console.WriteLine("I am a tiger!");
}
public new void printName()
{
Console.WriteLine(name);
}
}
}
结果是:
I am a cat!
cat
Iam a Cat!
cat