扩:new and override

简介:

昨天有个网友问我继承里面的new和override关键词有啥区别,呃,我们来看个例子就知道了

new ==》隐藏父类同名方法  override==》覆盖

定义一个父类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public  class  People
{
     /// <summary>
     ///ushort参考: https://msdn.microsoft.com/zh-CN/library/cbf1574z.aspx
     /// </summary>
     public  string  Name {  get set ; }
     public  ushort  Age {  get set ; }
 
     public  People( string  name,  ushort  age)
     {
         this .Name = name;
         this .Age = age;
     }
     public  void  Hi() //People
     {
         Console.WriteLine( "Name: "  this .Name +  " Age: "  this .Age);
     }
     public  virtual  void  Show() //People
     {
         Console.WriteLine( "Name: "  this .Name +  " Age: "  this .Age);
     }
}

  定义一个子类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public  class  Student : People
{
     #region 属性
     /// <summary>
     /// 学校
     /// </summary>
     public  string  School {  get set ; }
     /// <summary>
     /// 班级
     /// </summary>
     public  string  StrClass {  get set ; }
     /// <summary>
     /// 学号
     /// </summary>
     public  string  StrNum {  get set ; }
     #endregion
 
     #region 构造函数
     /// <summary>
     /// 调用父类构造函数
     /// </summary>
     /// <param name="name"></param>
     /// <param name="age"></param>
     public  Student( string  name,  ushort  age) :  base (name, age)
     {
 
     }
     public  Student( string  name,  ushort  age,  string  school,  string  strClass,  string  strNum) :  this (name, age)
     {
         this .School = school;
         this .StrClass = strClass;
         this .StrNum = strNum;
     }
     #endregion
 
     /// <summary>
     /// new-隐藏
     /// </summary>
     public  new  void  Hi() //Student
     {
         Console.WriteLine( "Name: "  this .Name +  " Age: "  this .Age +  " School: "  this .School +  " strClass: "  this .StrClass +  " strNum: "  this .StrNum);
     }
     /// <summary>
     /// override-覆盖
     /// </summary>
     public  override  void  Show() //Student
     {
         Console.WriteLine( "Name: "  this .Name +  " Age: "  this .Age +  " School: "  this .School +  " strClass: "  this .StrClass +  " strNum: "  this .StrNum);
     }
}

  调用一下

1
2
3
4
5
6
7
8
9
10
11
12
static  void  Main( string [] args)
         {
             People p =  new  Student( "app" , 10,  "北京大学" "001" "01001" );
             p.Hi(); p.Show();
 
             System.Console.WriteLine();
 
             Student s = p  as  Student;
             s.Hi(); s.Show();
 
             System.Console.ReadKey();
         }

  输出:

可以发现,用new修饰的方法,其父方法并没有被改变,只是被隐藏了

用override重写的方法却被覆盖,从而改变了(多态)

 


本文转自毒逆天博客园博客,原文链接:http://www.cnblogs.com/dunitian/p/5206954.html,如需转载请自行联系原作者

相关文章
|
1月前
|
Oracle Java 关系型数据库
农行1面:说说 final,finally,finalize的区别
在 Java中,“final”、“finally”和“finalize”是三个不同的关键字或方法,尽管它们的名字相似,但在功能和用途上却有显著的区别,这篇文章我们继续分析一篇农行1面的题目:说说 final,finally,finalize的区别。
17 3
|
编译器 C++
【C++11保姆级教程】final和override
【C++11保姆级教程】final和override
196 0
方法的覆盖Override
方法的覆盖Override
56 0
|
编译器
public final static搭配的好处
final 和 static 往往搭配使用,效率更高,不会导致类加载.底层编译器做了优化处理
174 0
public final static搭配的好处
override 指示符
override 指示符
79 0
System.ArgumentOutOfRangeException: 容量超出了最大容量
System.ArgumentOutOfRangeException: 容量超出了最大容量
247 0
System.ArgumentOutOfRangeException: 容量超出了最大容量
|
安全 Java
Java集合类型的默认容量以及扩容机制
Java集合类型的默认容量以及扩容机制