今天遇到一个题目

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

 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

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

使用new关键字创建对象数组(C#,C++,Java)的更多相关文章

  1. JSon_零基础_007_将JSon格式的"数组"字符串转换为Java对象"数组"

    将JSon格式的"数组"字符串转换为Java对象"数组". 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“n ...

  2. Java-Runoob-高级教程-实例-数组:16. Java 实例 - 数组并集

    ylbtech-Java-Runoob-高级教程-实例-数组:16. Java 实例 - 数组并集 1.返回顶部 1. Java 实例 - 数组并集  Java 实例 以下实例演示了如何使用 unio ...

  3. ylbtech-Java-Runoob-高级教程-实例-数组:15. Java 实例 – 判断数组是否相等

    ylbtech-Java-Runoob-高级教程-实例-数组:15. Java 实例 – 判断数组是否相等 1.返回顶部 1. Java 实例 - 判断数组是否相等  Java 实例 以下实例演示了如 ...

  4. Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素

    ylbtech-Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素 1.返回顶部 1. Java 实例 - 在数组中查找指定元素  Java 实例 以下实例 ...

  5. Java-Runoob-高级教程-实例-数组:13. Java 实例 – 数组交集

    ylbtech-Java-Runoob-高级教程-实例-数组:13. Java 实例 – 数组交集 1.返回顶部 1. Java 实例 - 数组交集  Java 实例 以下实例演示了如何使用 reta ...

  6. Java-Runoob-高级教程-实例-数组:12. Java 实例 – 数组差集

    ylbtech-Java-Runoob-高级教程-实例-数组:12. Java 实例 – 数组差集 1.返回顶部 1. Java 实例 - 数组差集  Java 实例 以下实例演示了如何使用 remo ...

  7. Java-Runoob-高级教程-实例-数组:11. Java 实例 – 删除数组元素

    ylbtech-Java-Runoob-高级教程-实例-数组:11. Java 实例 – 删除数组元素 1.返回顶部 1. Java 实例 - 删除数组元素  Java 实例 以下实例演示了如何使用 ...

  8. Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素-un

    ylbtech-Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素 1.返回顶部 1. Java 实例 - 查找数组中的重复元素  Java 实例 以下实例 ...

  9. -Java-Runoob-高级教程-实例-数组:09. Java 实例 – 数组扩容

    ylbtech-Java-Runoob-高级教程-实例-数组:09. Java 实例 – 数组扩容 1.返回顶部 1. Java 实例 - 数组扩容  Java 实例 以下实例演示了如何在数组初始化后 ...

随机推荐

  1. 【C#-去空格】去掉字符串后空字符串\0\0\0\0\0\0

    使用  变量.Replace(@“\0”,"") string str="abcde\0\0\0\0\0\0"; str=str.Replace(@" ...

  2. css动画速度与三次贝赛尔曲线

      今天要说的是css的动画曲线.   首先要说的是语法: value: 1.linear:线性动画,也就是匀速,以相同的速度开始以相同的速度结束. 2.ease:默认的动画效果,特点是先快后慢,时间 ...

  3. 快速搭建 Serverless 人脸识别离线服务

    简介 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准 ...

  4. MySQL数据库入门———常用基础命令

    mysql 连接数据库命令: MySQL 连接本地数据库,用户名为“root”,密码“123”(注意:“-p”和“123” 之间不能有空格) mysql -h localhost -u root -p ...

  5. R_Studio(决策树算法)鸢尾花卉数据集Iris是一类多重变量分析的数据集【精】

    鸢尾花卉数据集Iris是一类多重变量分析的数据集 通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类 针对 ...

  6. Unity3D_(游戏)卡牌01_启动屏界面

      卡牌2D游戏展示 (游戏代码放到  卡牌04_游戏界面  文章最后面~) 游戏项目已托管到github上(里面有个32bit可执行文件) 传送门 规则 开始游戏每张卡牌初始翻开展示 展示几秒后卡牌 ...

  7. iview简单使用+按需加载组件的方法(全局和局部)

    1,简单使用 vue项目中使用iview非常简单: 首先安装依赖: $ npm install iview --save 会安装最新版本的依赖,安装完成后package.json会出现如下图配置 表示 ...

  8. Python argparse 用法总结

    使用argparse的四个基本步骤 创建 ArgumentParser() 对象 调用 add_argument() 方法添加参数 使用 parse_args() 解析添加的参数 # example ...

  9. LocalDate/LocalDateTime与String的互相转换示例(附DateTimeFormatter详解)

    摘自:https://www.jianshu.com/p/b7e72e585a37 LocalDate/LocalDateTime与String的互相转换示例(附DateTimeFormatter详解 ...

  10. C++入门经典-例3.13-不加break的switch判断语句

    1:不加break,会依次运行下面的语句,代码如下: // 3.13.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include &l ...