开篇先提几个问吧,如果你对这些问题都清楚了,那说明对于 new  这个关键字已经掌握得很好了,也不再需要花时间来阅读本文了,

1   new  一个class  与 new   一个Struct有什么不同?

2   new 在.net中有几种用法?

3   new 运算符 是否可以重载?

4   new 一个基类中的方法,与override一个基类中的方法有什么不同?

5   int i 与 int i = new int();有何不同?

答案会在文章结尾给出!

  首先来简单介绍下new

做为修饰符的new: 用于向基类成员隐藏继承成员

做为运算符的new: 用于调用基类的构造函数 和 创建对象并分配内存

下面这段代码如果你能够看出结果说明你对于new 的掌握已经很不错了,因为在各种面试中对于new的考题好像不曾缺过,如果你懂了那么在面试中那就是小菜了

 class BaseNumber
{
public static int i = ; public BaseNumber()
{
Console.WriteLine("这是基类的构造方法{0}", i.ToString());
} public virtual void ShowNumber()
{
Console.WriteLine("基类ShowNumber方法{0}", i.ToString());
} public virtual void ShowInfo()
{
Console.WriteLine("基类的ShowInfo方法{0}", i.ToString());
}
} class Number : BaseNumber
{
public new static int i = ; public Number()
{
Console.WriteLine("这子类的构造方法{0}", i.ToString());
} public override void ShowNumber()
{
Console.WriteLine("子类ShowNumber的方法{0}", i.ToString());
} public new virtual void ShowInfo()//因为有了new 关键字隐藏了基类中的成员会不会提示任何警告
{
Console.WriteLine("子类的ShowInfo方法{0}", i.ToString());
}
} class Program
{
private static void Main(string[] args)
{
BaseNumber baseNumber = new BaseNumber(); //调用本身的构造方法
Console.WriteLine("======基类构造完成=============\n"); /*调用本身及基类的构造方法 注意:子类继承了基类之后 在new 时会先调用基类的构造方法再调用子类的
而调用析构函数的顺序则相反,先调用子类的析构函数再调用基类的*/
Number number = new Number();
Console.WriteLine("======子类构造完成=============\n"); baseNumber.ShowInfo(); //调用基类方法
baseNumber.ShowNumber(); //调用基类方法
Console.WriteLine("==========基类方法调用完毕============\n"); number.ShowInfo(); //调用子类的方法
number.ShowNumber(); //调用子类的方法因为重写了基类的方法
Console.WriteLine("==========子类方法调用完毕============\n"); BaseNumber num = new Number(); //会调用基类与子类的构造方法(先调基类再调子类)
num.ShowInfo(); //此时为基类的实例所以会调用基类的方法
num.ShowNumber(); //被子类重写所以调用子类的方法 Console.ReadKey();
}
}

以上代码 回答了

第2 题 “new 在.net中有几种用法或者说用处的” 一部分:创建新对象,及隐藏基类中的方法

第4 题  new 一个基类中的方法,与override基类中的方法有什么不同?

new一个基类中的方法并在子类中调用时,不会调用基类的方法,因为基类中的方法被隐藏了

new 关键字用于隐藏基类中的成员,如果子类中有一个方法与基类中的方法完全一致且没有加new关键字时,编辑器会提示警告

The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.

而Override则是重写基类中的方法,

而对于这一段代码我自己也不是特别理解但我猜测是这样的,如有不对还请各位指出

BaseNumber num = new Number();

先说说这段代码的执行过程 new Number()时因为继承了基类BaseNumber所以会先调用BaseNumber的构造函数,

然后调用Number的构造函数,从结果图可以看到这个过程,然后将实例化后的子类赋给基类在这个过程中应该存在一个隐式的转换 类似于

BaseNumber num = new Number() as BaseNumber; 所以最终实例化的还是基类!

下面逐个来解释开篇的问题

1   new  一个class  与 new   一个Struct有什么不同?

答:因为Class是引用类型,所以new 会分为两步 1 在托管堆中分配内存,2 调用构造函数实现对象初始化

而Struct是值类型 也是会分两步 1 在线程栈中分配内存,2 调用构造函数实现对象初始化,

2   new 在.net中有几种用法?

答:2.1 隐藏基类成员,

  2.2创建实例对象,并分配内存,

2.3 做为类约束 class Generia<T> where :new () //约束类必须要有公共的参构造函数

3   new 运算符 是否可以重载?

答:肯定是不可以的 (原因微软FrameWork规定了)

4   new 一个基类中的方法,与override基类中的方法有什么不同?

答:new一个基类中的方法并在子类中调用时,不会调用基类的方法,因为基类中的方法被隐藏了

而Override则是重写基类中的方法,在调用基类方法时会自动去子类中找到被Override的方法

5   int i 与 int i = new int();有何不同?

答: 在.net Framework中所有的值类型都会自动初始化,也就是说int i ; 其实隐式的调用了其构造方法。 而int i = new int() 只不过是显示的调用了构造方法。

另外值类型内存是分配在线程栈上的,且不受GC控制脱离其做用域就会自动销毁并回收内存空间

好了关于new这个最常用的关键字就说到这里了,如果还有朋友发现更高深的用法,欢迎指出~本文虽然很基础,但是还是有很多朋友对new 没有细心了解过

希望本文能带给需要的朋友一点小小的收获,如果您觉得本文对您有那么一点点帮助还望小小的推荐一下啊,您的推荐将是我源源不断的写作力~!!

你真的理解 new 了吗?的更多相关文章

  1. 您真的理解了SQLSERVER的日志链了吗?

    您真的理解了SQLSERVER的日志链了吗? 先感谢宋沄剑给本人指点迷津,还有郭忠辉童鞋今天在QQ群里抛出的问题 这个问题跟宋沄剑讨论了三天,再次感谢宋沄剑 一直以来,SQLSERVER提供了一个非常 ...

  2. 【转】你真的理解Python中MRO算法吗?

    你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...

  3. 对于C#中的一些点滴你真的理解了吗?

    废话不多说看题目,看看我们自己真的理解了吗? 1.如下代码输出的结果是什么? public class A{ public virtual void Func(int  number=10) { Co ...

  4. Android菜鸟的成长笔记(4)——你真的理解了吗?

    原文:Android菜鸟的成长笔记(4)--你真的理解了吗? 在上一篇中我们查看了QQ的apk源文件中的布局结构,并仿照QQ完成了我们第一个应用的界面,详细请看<Android菜鸟的成长笔记&g ...

  5. 我想这次我真的理解了 JavaScript 的单线程机制

    今天面试的时候被问到一个问题,是关于 JS 异步的.当时我脑海中闪过了一个单线程的概念,但却没有把真正的原理阐述清楚.所以回来特意重新回顾了前面单线程和异步相关的一些知识点. 虽然之前学习的时候也接触 ...

  6. 你真的理解Java 注解吗?

    你真的理解Java 注解吗? 1.什么是注解? 官方解释: Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.Java ...

  7. Java随谈(六)## 我们真的理解 Java 里的整型吗?

    我们真的理解 Java 里的整型吗 整型是我们日常生活中最常用到的基础数据类型,看这篇文章之前,我想问: 我们真的像自己认为的那么理解 Java 内的整型吗? 也许看完本篇文章你就有自己的答案. C ...

  8. Java内存模型原理,你真的理解吗?

    [51CTO.com原创稿件]这篇文章主要介绍模型产生的问题背景,解决的问题,处理思路,相关实现规则,环环相扣,希望读者看完这篇文章后能对 Java 内存模型体系产生一个相对清晰的理解,知其然知其所以 ...

  9. 【java基础】程序员你真的理解反射机制吗?

    目录 前言 1.反射的概述 2.正式使用反射之前很有必要了解的Class类 3.反射的使用 前言 很多讲解反射的博客文章并没有详细讲解Class类,~当然包括之前的我也一样~,这样的文章只会让反射徒有 ...

  10. 你真的理解Java的按引用传递吗?

    首先我们来看下面这段代码: public class Test1 { String a = "123"; public static void change(Test1 test) ...

随机推荐

  1. [MySQL Reference Manual] 4 MYSQL Program

    4 MYSQL Program 目录 4 MYSQL Program 4.3 MySQL Server和Server启动程序 4.3.1 mysqld 4.3.2 mysqld_safe 4.3.3 ...

  2. mysql 触发器的创建 修改 删除

    //做一个简单的练习,创建一个简单的触发器 完成添加文章的时候,自动加上时间,默认作者 为 ‘日记本的回忆‘ show columns from test; //查看表结构 //查看已存在触发器 sh ...

  3. 烂泥:使用nginx利用虚拟主机搭建WordPress博客

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 最近开始打算学习nginx web服务器,既然是学习还是以实用为目的的.我们在此以搭建WordPress博客为例. 搭建WordPress博客,我们需要 ...

  4. GacUI学习(二)

    GacUI学习(一)之高仿系统记事本(二) 转载请注明来源:http://www.cnblogs.com/lyfh/p/6107614.html 上篇<GacUI学习(一)之高仿系统记事本(一) ...

  5. C语言链表中数组实现数据选择排序,升序、降序功能主要难点

    链表排序讲解: head指针指向链表的头结点,是找到整个链表的唯一依据,如果head指针丢失,整个链表就找不到了. head存储的是第一个节点的地址,head->next存储的是第二个节点的地址 ...

  6. sed grep find命令

    一.sed [-nerf][n1,n2] action -n 安静模式,只有经过sed处理过的行才显示出来,其他不显示. -r 表示sed支持扩展的正则表达式 -e 表示直接在命令行模式上进行sed操 ...

  7. BI软件搞不定业务管理报表的需求

    BI是商业智能的缩写,是可以帮助企业做出明智的业务经营决策的工具,其数据来源于各个业务系统,如ERP.CRM.SCM.进销存.HER.OA等. BI系统不同于传统的管理信息系统,他号称是一个整体应用的 ...

  8. stanford coursera 机器学习编程作业 exercise 3(使用神经网络 识别手写的阿拉伯数字(0-9))

    本作业使用神经网络(neural networks)识别手写的阿拉伯数字(0-9) 关于使用逻辑回归实现多分类问题:识别手写的阿拉伯数字(0-9),请参考:http://www.cnblogs.com ...

  9. POJ 1696 Space Ant 【极角排序】

    题意:平面上有n个点,一只蚂蚁从最左下角的点出发,只能往逆时针方向走,走过的路线不能交叉,问最多能经过多少个点. 思路:每次都尽量往最外边走,每选取一个点后对剩余的点进行极角排序.(n个点必定能走完, ...

  10. cookie 和 session 的基础知识

    cookie 和 session 的基础知识 cookie 和session 的区别详解 这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会 ...