黑马程序员技术交流社区

标题: new修饰符用法 [打印本页]

作者: dongqinglove    时间: 2013-6-28 08:47
标题: new修饰符用法
本帖最后由 dongqinglove 于 2013-7-1 17:06 编辑

今天看资料,就是不明白new的修饰符的用法,希望有人指点谢谢,下面是我写的demo
  1. namespace new的用法
  2. {
  3.     class Program
  4.     {
  5.         static void Main(string[] args)
  6.         {
  7.             Animal an = new Dog();
  8.             an.Eat();
  9.             Dog dog = new Dog();
  10.             dog.Eat();

  11.             an.Jump();
  12.             dog.Jump();
  13.             Console.ReadKey();
  14.         }
  15.     }
  16.     class Animal
  17.     {
  18.         public void Eat()
  19.         {
  20.             Console.WriteLine("吃饭");
  21.         }
  22.         public void Jump()
  23.         {
  24.             Console.WriteLine("跳");
  25.         }
  26.     }
  27.     class Dog:Animal
  28.     {
  29.         new public void Eat()
  30.         {
  31.             Console.WriteLine("dddddddddd");
  32.         }
  33.         public void Jump()
  34.         {
  35.             Console.WriteLine("xxxxxxx");
  36.         }
  37.     }
  38. }
复制代码
运行结果: 感觉new做为修饰符修饰方法,有与没有都一样嘛,谁能给我解释下,麻烦了 谢谢

作者: 逆_水_寒    时间: 2013-6-28 10:15
(内容摘自网络)
解释的比较全,作为初学者,后面的高深的我也看不懂,因为还没学到那里。
你看看前面的解释能理解到哪里就看到哪里,后面的还没学也可能也看不懂。

用法:
一  new 运算符 :用于创建对象和调用构造;
二  new 修饰符 :用于隐藏基类成员的继承;
三  new 约束 :用于在泛型声明中约束可能用作类型参数的参数的类型。
new 运算符:
1.用于创建对象和调用构造
例:Class_Test MyClass = new Class_Test();
2.也用于为值类型调用默认的构造函数
例:int myInt = new int();
myInt 初始化为 0,它是 int 类型的默认值。该语句的效果等同于:int myInt = 0;
3.不能重载 new 运算符。
4.如果 new 运算符分配内存失败,则它将引发 OutOfMemoryException 异常。
new 修饰符 :
使用 new 修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。
new 约束 :
通过继承隐藏名称采用下列形式之一:
1.引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。
2.引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。
3.引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。
4.在同一成员上同时使用 new 和 override 是错误的。
注意:在不隐藏继承成员的声明中使用 new 修饰符将生成警告。
作者: dongqinglove    时间: 2013-6-28 10:29
逆_水_寒 发表于 2013-6-28 10:15
(内容摘自网络)
解释的比较全,作为初学者,后面的高深的我也看不懂,因为还没学到那里。
你看看前面的解 ...

这个我也搜到了,就是不明白,new做为修饰符,显示隐藏和不显示隐藏有何区别
作者: 浪子小雨    时间: 2013-6-28 10:38
这个Dog类是继承Animal类的,如果“new public void Eat()”中没有写new的话就会有警告,使用new之后就会消除这个警告,当然你也可以不用new来修饰,这么做的用处就是隐藏从基类继承的成员,基类中那个方法就不会被显示出来了。
关于new和override, new 修饰符会用同样的名称创建一个新成员并使原始成员变为隐藏的。 override 修饰符会扩展继承成员的实现。
作者: 关关雎鸠    时间: 2013-6-29 16:22
dongqinglove 发表于 2013-6-28 10:29
这个我也搜到了,就是不明白,new做为修饰符,显示隐藏和不显示隐藏有何区别 ...

就如楼上说的,如果子类与父类有相同的方法,在运行的时候会警告,虽然警告不报错,但是总是不爽吧,于是用new来修饰子类的方法表示这是一个新的方法,那么就可以解除这个警告。

总之既然存在就有存在的意义。明白意义就知道为什么要用,当然有的就是硬性规定不存在为什么。
作者: dongqinglove    时间: 2013-7-1 17:07
关关雎鸠 发表于 2013-6-29 16:22
就如楼上说的,如果子类与父类有相同的方法,在运行的时候会警告,虽然警告不报错,但是总是不爽吧,于是 ...

表示同意,谢谢哥们




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2