你真的理解 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) ...
随机推荐
- go sync.Mutex 设计思想与演化过程 (一)
go语言在云计算时代将会如日中天,还抱着.NET不放的人将会被淘汰.学习go语言和.NET完全不一样,它有非常简单的runtime 和 类库.最好的办法就是将整个源代码读一遍,这是我见过最简洁的系统类 ...
- java编写冒泡排序
int[] arry={7,1,6,5,3,4,9,8,2}; for(int a=0;a<arry.length;a++) { for(int b=a+1;b<arry.length;b ...
- msysGit管理GitHub代码
msysGit管理GitHub代码 代码的管理,在日常开发中是很重要的环节,程序员的修炼三部曲——版本控制,单元测试,项目自动化. 本篇就简单的说说通过msysGit来管理GitHub中的代码,实 ...
- Debian deb源方法升级PHP软件包
学习Linxu以来,一直坚持编译方式安装软件包,貌似圈子里面也是都倾向于编译,可是搜索到的编译方法都是一堆复制粘贴来的指令, 每个人都这么编译, 却几乎没有人去写明那些五花八门的编译指令代表了什么,是 ...
- 参加 Tokyo Westerns / MMA CTF 2nd 2016 经验与感悟 TWCTF 2016 WriteUp
洒家近期参加了 Tokyo Westerns / MMA CTF 2nd 2016(TWCTF) 比赛,不得不说国际赛的玩法比国内赛更有玩头,有的题给洒家一种一看就知道怎么做,但是做出来还需要洒家拍一 ...
- AI (Adobe Illustrator)详细用法(三)
本文主要是介绍和色彩相关的用法. 一.路径外观设置 1.设置描边粗细 手动输入20px 下拉选择 鼠标选中数值,按向上或向下的箭头调整 在右边的描边菜单中修改 Note:按住shift键,然后上下箭头 ...
- 超链接a的target属性
<a>标签的target意思很明确就是在哪里打开目标文档. 第一种情况: 默认情况:当我们没有设置超链接属性target的value值时默认是_self,即<a target=&qu ...
- [转]html5 js 访问 sqlite 数据库的操作类
本文转自:http://blog.csdn.net/tsxw24/article/details/7613815 webkit 核心的浏览器提供了 3个 api接口,用于访问本地sqlite数据,但使 ...
- 自罚一杯-PHP基础(一)
hi 懒癌是最可怕的癌了吧,在即将迎来本命年时,给自己定下每天必干的几件成习惯的事情,望不再鸽!! php是我一直在学习的东西,但总以为php简单,难点在需要掌握大量的相关知识,其实并不完全对,php ...
- 用pygame学习初级python(二) 15.5.11
闲得无聊,对第一版的东西做了一些修改,让它更像一个游戏,也具有一些可玩性. 项目的github地址:https://github.com/lfkdsk/BrainHole_pygame 1.人物类进行 ...