你真的理解 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) ...
随机推荐
- 在Eclipse中导入SVN库里的Maven项目
长期使用Intellij 对于Eclipse的东西都生疏了... 做了个小教程说明Eclipse下导入Maven工程的步骤以备不时之需 1. 安装maven插件 a) 下载maven http://m ...
- 预写式日志(Write-Ahead Logging (WAL))
SQL Server中使用了WAL(Write-Ahead Logging)技术来保证事务日志的ACID特性.而且大大减少了IO操作. WAL的核心思想是:在数据写入到数据库之前,先写入到日志.再将日 ...
- spring ehcache 页面、对象缓存
一.Ehcache基本用法 CacheManager cacheManager = CacheManager.create(); // 或者 cacheManager = CacheManager.g ...
- 【故障处理】ORA-28040: No matching authentication protocol
[故障处理]ORA-28040: No matching authentication protocol 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者 ...
- RabbitMQ入门教程——安装及配置
RabbitMQ是一个消息代理,一个消息系统的媒介,提供了一个通用的消息发送及接收平台,并且能够保障消息传输过程中的安全.使用erlang语言开发,开源,在易用性.扩展性.高可用性等方面表现不俗 技术 ...
- 将一列包含多个ID拆分多行
看到个不常见的问题~然后在 Inner Sql Server2008 里面找到一个思路. 如果下面的表结构,如何拆分多行并对应员工号呢? 首先创建测试表 CREATE TABLE Department ...
- spring项目的 context root 修改之后,导致 WebApplicationContext 初始化两次的解决方法
修改了 spring web 项目的 context root 为 / 之后,在启动项目时,会导致 WebApplicationContext 初始化两次,下面是其初始化日志: 第一次初始化: 四月 ...
- sql server 2008 相关基础(物理备份还原)
1. restore database KLJY_juncsoft from disk= 'D:\\kljy_2012_12_28.bak' with recovery 注意在还原时,进度一直显示0% ...
- InnoDB源码分析--事务日志(二)
原创文章,转载请标明原文链接:http://www.cnblogs.com/wingsless/p/5708992.html 昨天写了有关事务日志的一些基本点(http://www.cnblogs.c ...
- dyld: Library not loaded: @rpath/libswiftCore.dylib 解决方法
解决: 设置Build Setting - > 搜索 embe关键字 -> 修改属性 见如下图: 如果更新了Xcode 8 这里变成: