开篇先提几个问吧,如果你对这些问题都清楚了,那说明对于 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. 持续集成 .Net手册--提升开发效率和质量

    参考:http://blog.csdn.net/chelsea/article/details/132525 持续集成 .Net手册 一.概念 Martin Fowler的文章:Continuous ...

  2. SQL Server 分页方法汇总

    PageSize = 30 PageNumber = 201 方法一:(最常用的分页代码, top / not in) UserId UserId from UserInfo order by Use ...

  3. MaskedTextBox的聚焦和光标位置

    遇到一个关于MaskedTextBox聚焦和光标居左的问题. ①. 先说说聚焦: 起初给MaskedTextBox设置了Focus(),运行之后,并没有作用. 然后又给Form添加了Load事件,又设 ...

  4. [转]正确配置Linux系统ulimit值的方法

    在Linux下面部署应用的时候,有时候会遇上Socket/File: Can't open so many files的问题:这个值也会影响服务器的最大并发数,其实Linux是有文件句柄限制的,而且L ...

  5. Linux 多线程条件变量同步

    条件变量是线程同步的另一种方式,实际上,条件变量是信号量的底层实现,这也就意味着,使用条件变量可以拥有更大的自由度,同时也就需要更加小心的进行同步操作.条件变量使用的条件本身是需要使用互斥量进行保护的 ...

  6. Android setTag()/getTag()-(转)

    (转自:http://www.cnblogs.com/topcoderliu/archive/2011/06/07/2074419.html) [自己经历:要getTag前提是要有setTag] se ...

  7. nodejs学习资料

    官方文档 阿里nodejs7天快速教程 从零开始nodejs系列文章 一个周末掌握IT前沿技术之node.js篇 nodejs中文api文档    nodejs中文api文档(0.12.2) node ...

  8. 使用数据库sqlite3 C语言实现登陆注册的功能

    //此代码为注册功能 void create_regtable() { int rc; //rc为返回值,判断函数是否执行成功 rc=0函数执行成功,rc !=0函数执行失败 sqlite3 *db; ...

  9. 代理模式 vs 装饰模式

    代理模式和装饰模式有很大的相似性,二者的类图(几乎)是一样的.下面分别讲解代理模式和装饰模式. 1.代理模式 一般著名的跑步运动员都会有自己的代理人,如果想联系该运动员的比赛事宜,可以直接联系他的代理 ...

  10. Android SDK和N多Android开发资源

    开发资源 本文收集整理Android开发需要的Android SDK.工具.Android开发教程.Android设计规范,免费的设计素材等. 欢迎大家推荐自己在Android开发过程中用的好用的工具 ...