你真的理解 new 了吗?
开篇先提几个问吧,如果你对这些问题都清楚了,那说明对于 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 了吗?的更多相关文章
- 您真的理解了SQLSERVER的日志链了吗?
您真的理解了SQLSERVER的日志链了吗? 先感谢宋沄剑给本人指点迷津,还有郭忠辉童鞋今天在QQ群里抛出的问题 这个问题跟宋沄剑讨论了三天,再次感谢宋沄剑 一直以来,SQLSERVER提供了一个非常 ...
- 【转】你真的理解Python中MRO算法吗?
你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...
- 对于C#中的一些点滴你真的理解了吗?
废话不多说看题目,看看我们自己真的理解了吗? 1.如下代码输出的结果是什么? public class A{ public virtual void Func(int number=10) { Co ...
- Android菜鸟的成长笔记(4)——你真的理解了吗?
原文:Android菜鸟的成长笔记(4)--你真的理解了吗? 在上一篇中我们查看了QQ的apk源文件中的布局结构,并仿照QQ完成了我们第一个应用的界面,详细请看<Android菜鸟的成长笔记&g ...
- 我想这次我真的理解了 JavaScript 的单线程机制
今天面试的时候被问到一个问题,是关于 JS 异步的.当时我脑海中闪过了一个单线程的概念,但却没有把真正的原理阐述清楚.所以回来特意重新回顾了前面单线程和异步相关的一些知识点. 虽然之前学习的时候也接触 ...
- 你真的理解Java 注解吗?
你真的理解Java 注解吗? 1.什么是注解? 官方解释: Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.Java ...
- Java随谈(六)## 我们真的理解 Java 里的整型吗?
我们真的理解 Java 里的整型吗 整型是我们日常生活中最常用到的基础数据类型,看这篇文章之前,我想问: 我们真的像自己认为的那么理解 Java 内的整型吗? 也许看完本篇文章你就有自己的答案. C ...
- Java内存模型原理,你真的理解吗?
[51CTO.com原创稿件]这篇文章主要介绍模型产生的问题背景,解决的问题,处理思路,相关实现规则,环环相扣,希望读者看完这篇文章后能对 Java 内存模型体系产生一个相对清晰的理解,知其然知其所以 ...
- 【java基础】程序员你真的理解反射机制吗?
目录 前言 1.反射的概述 2.正式使用反射之前很有必要了解的Class类 3.反射的使用 前言 很多讲解反射的博客文章并没有详细讲解Class类,~当然包括之前的我也一样~,这样的文章只会让反射徒有 ...
- 你真的理解Java的按引用传递吗?
首先我们来看下面这段代码: public class Test1 { String a = "123"; public static void change(Test1 test) ...
随机推荐
- Mongodb Manual阅读笔记:CH4 管理
4 管理 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...
- MySQL 系列(五) 多实例、高可用生产环境实战
MySQL 系列(五) 多实例.高可用生产环境实战 第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 史上最屌.你不知道的数据库操作 第三 ...
- 【Html5】Html5新特性Notification实现桌面消息推送(2016-05-25)
序:最近工作使用WorkTile,发现使用Chrome浏览器的时候如果有任务下发给我则会在桌面右下角提示(当前浏览器为最小化模式).感觉这个东西蛮有意思的,感觉可以给用户更好的体验,于是乎就查询了一下 ...
- db2数组、函数
一. 数组 在db2中,创建一个数组会在functions下生成两个对象:sys类型和用户类型的Array /*创建数组*/ ) array[]; /*删除数组*/ drop type arrName ...
- x01.os.5: DOS 功能调用
DOS 功能调用(INT 21)-------------------------------AH = 0-2E 适用 DOS 1.0 以上版本AH = 2F-57 适用 DOS 2.0 以上版本AH ...
- x01.BitmapHelper:图像处理
“所有致我于死地的,也激发我胆魄”,姚贝娜的<心火>,是我近年来听过最好的歌,特此推荐一下. 图像处理,大概分三步:1.LockBits():2.进行处理:3.UnlockBits():这 ...
- 当Sublime Text 2 遇到 EOFError: EOF when reading a line
重新用Sublime Text, command+B运行一小段python程序时遇到 EOFError: EOF when reading a line 似曾相识哪里见过,但是想不起来该如何解决了 S ...
- IO的多路复用和信号驱动
Linux为多路复用IO提供了较多的接口,有select(),pselect(),poll()的方式,继承自BSD和System V 两大派系. select模型比较简单,“轮询”检测fd_set的状 ...
- [译] OpenStack Kilo 版本中 Neutron 的新变化
OpenStack Kilo 版本,OpenStack 这个开源项目的第11个版本,已经于2015年4月正式发布了.现在是个合适的时间来看看这个版本中Neutron到底发生了哪些变化了,以及引入了哪些 ...
- 新版Microsoft Azure Web管理控制台 - Microsoft Azure New Portal - (2)
前文我们提到在Resource Manager模式中,虚拟机默认不再与云服务对应,也不再有类似xxx.cloudapp.net的二级域名.在Resource Manager模式中,虚拟机的网卡.公共I ...