今天遇到一个题目

分析下面的代码,判断代码是否有误。

 using System;

 namespace Test1
{
class Point
{
public int x;
public int y;
}
class Program
{
static void Main(string[] args)
{
Point[] pointArr = new Point[];
pointArr[].x = ;
pointArr[].y = ;
pointArr[].x = ;
pointArr[].y = ;
pointArr[].x = ;
pointArr[].y = ;
}
}
}

创建了3个对象数组,然后给对象的属性赋值,很明显是正确的吧。
然而!编译能通过,运行却报错!

可以很明显的看到,空引用异常
逐行debug可以发现,当运行到pointArr[0].x = 5;这一句时,异常就产生了
显然,说明pointArr[0]不存在属性x,也就是说,pointArr[0]并不是一个Point对象
它为null
问题出在哪?
这是因为,当我们使用new关键字来创建对象数组时,并不会创建这个类的对象
那么你就要问了,使用了new却不创建对象,new的意义何在?
其实,在使用new关键字创建对象数组时,系统只是在内存中给他开辟了空间而已
看到这里,你可能还是不会相信,那么我们思考一下,创建对象必须调用对象的构造函数吧,那我们重写构造函数,看看会输出什么?
代码如下:

 using System;

 namespace Test1
{
class Point
{
public Point() { Console.WriteLine("这是一个构造函数"); }
public int x;
public int y;
}
class Program
{
static void Main(string[] args)
{
Point[] pointArr = new Point[];
pointArr[].x = ;
pointArr[].y = ;
pointArr[].x = ;
pointArr[].y = ;
pointArr[].x = ;
pointArr[].y = ;
}
} }

我们接着运行
仍然报错,而且并未输出构造函数内的内容

到这里,已经很明显了,使用new创建对象数组时,不会真的创建对象!
当然,以上只是C#中的结论
我们接下来换C++

 #include "pch.h"
#include <iostream>
using namespace std;
class Point {
public:
int x;
int y;
Point() {
cout << "这是一个构造函数" << endl;
} };
int main()
{
Point * pointArr = new Point[];
pointArr[].x = ;
pointArr[].y = ;
pointArr[].x = ;
pointArr[].y = ;
pointArr[].x = ;
pointArr[].y = ;
}

运行:

咦??????????
为什么成功调用了构造函数????
有点迷.......
果然C++和C#还是很不一样的。。。
事情变得有趣起来了呢
我们换java!

 package pack1;

 class Point
{
public int x;
public int y;
public Point() {
System.out.println("这是一个构造函数");
} };
public class TestJava {
public static void main(String[] args) {
Point[] pointArr = new Point[3];
pointArr[0].x = 5;
pointArr[0].y = 6;
pointArr[1].x = 8;
pointArr[1].y = 16;
pointArr[2].x = 15;
pointArr[2].y = 26;
}
}

运行!

空指针报错
说明java里的new关键字创建对象数组时,也是不会创建对象的

总结:
在面向对象语言中,new关键字基本都是只开辟空间,不创建对象的。而C++作为非纯面向对象语言,在设计方面与面向对象语言还是有很大的不同。

----------------------------------------------------------------------------
大家好,我是ABKing

金麟岂是池中物,一遇风云便化龙!
欢迎与我交流技术问题

最新文章

  1. Firebug 学习使用教程
  2. CSS2中的定位属性
  3. 利用 PortableBasemapServer 发布地图服务
  4. Spring第十篇—举例实现AOP
  5. c#中的常用ToString()方法总结
  6. Flex “跑马灯”效果(自定义“跑马灯”控件)
  7. hdu 4294 数学分析+搜索
  8. TensorFlow 深度学习笔记 Stochastic Optimization
  9. hdu 3917 (最大权闭合图)
  10. python基础之实现sql增删改查
  11. web安全之SQL注入
  12. HDU - 5521 Meeting (Dijkstra)
  13. python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原
  14. The folder can’t be opened because you don’t have permission to see its contents.
  15. Unity3D学习笔记(三十二):Xlua(2)
  16. jqGrid pivot获取所有行包括小计数据及原码分析
  17. vue2.0插件
  18. MYsql系统函数和联合查询
  19. [XML123] XSLT
  20. Linux学习笔记(第七章)

热门文章

  1. 让IE8一下兼容CSS3选择器
  2. R &amp; and &amp;&amp;
  3. ubuntu下jps命令无效
  4. unittest详解(二) 跳过用例的执行(skip)
  5. [Pytorch笔记] scatter_
  6. oracle 获取时间
  7. Mongo rs
  8. json转换时 java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException
  9. springboot+mybatis 使用事务
  10. 第十四周课程总结 &amp; 实验报告