============C#===========================
 
using System;
class B:A
{
 
 
public   dynamic make(){
return "B";
}
 
public static void Main(){
A a=new B();
Console.WriteLine(a.make());
}
}
 
class A
{
public  dynamic make(){
return "A";
}
}
================Java===========================
 
 
class B extends A
{
 
 
public   String make(){
return "B";
}
 
public static void main(String[] args){
A a=new B();
System.out.println(a.make());
}
}
 
class A
{
public  String make(){
return "A";
}
}
==============================================
这两个的结果让我蛋疼很久了
 
真相就在C#的三个关键字 virtual,new和override上
上面的C#例子是个果断的继承分裂
而在Java的任意基类中所有可继承的方法都看作虚函数,也就是自带C#中的virtual关键字
而派生子类呢,与基类中相同的方法全部Auto自带override关键字。
于是C#真正的多态应该是如下
==============================================
using System;
class B:A{
public override dynamic make(){
return "B";
}
public static void Main(){
A a = new B();
Console.WriteLine(a.make());
}
}
class A{
public virtual dynamic make(){
return "A";
}
}
==============================================
这才是Java中的普遍继承现象。
这样也省的我把自己的Java思想覆盖了,因为有关键字约束。
new又是怎么回事呢?
可以这样解释:继承关系可以看作一条链,例如A:B,B:C(A继承B,B继承自C)
看作一条这样的链 C->B->A
假如三个类中都有相同函数 public void printText(){...}而关键字不同
C: public virtual void printText(){Console.WriteLine("C");}
B: public override void printText(){Console.WriteLine("B");}
A: public override void printText(){Console.WriteLine("A");}
现在如此实例化 
C c=new A();
c.printText();//结果是A,这是正常现象(说是正常现象,是因为跟自己的Java知识不冲突)
而按照下面的函数声明(加入new)
 
C: public virtual void printText(){Console.WriteLine("C");}
B: public override void printText(){Console.WriteLine("B");}
A: public new void printText(){Console.WriteLine("A");}
 
也如上实例化并调用
C c=new A();
c.printText();//你能猜到答案是什么吗?
结果输出的是B
这样的结果我们可以如此理解
virtual override关键字结合能让继承“链化”,“链化”的继承状态下,上转符合正常继承结果,也是常用的方法。
而加入new关键字,是为了将这条链断开,此时上转是另一个情况:调用距离基类最近的“断点”前的类特性(例子中也就是B,因为继承链断成 C->B A。出现C B->A的话会调用C的printText())
如果继承时没有任何关键字(C#编译器会发出警告:需要new关键字,但是可通过编译)会默认每个子类有new关键字,也就是形成C B A这样的无链接继承。
================================================
也就是说……不写关键字不仅出现奇怪的现象,也会抹杀自己以前的知识- -
所以,关键字v5