使用new关键字创建对象数组(C#,C++,Java)
今天遇到一个题目
分析下面的代码,判断代码是否有误。
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)的更多相关文章
- JSon_零基础_007_将JSon格式的"数组"字符串转换为Java对象"数组"
将JSon格式的"数组"字符串转换为Java对象"数组". 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“n ...
- Java-Runoob-高级教程-实例-数组:16. Java 实例 - 数组并集
ylbtech-Java-Runoob-高级教程-实例-数组:16. Java 实例 - 数组并集 1.返回顶部 1. Java 实例 - 数组并集 Java 实例 以下实例演示了如何使用 unio ...
- ylbtech-Java-Runoob-高级教程-实例-数组:15. Java 实例 – 判断数组是否相等
ylbtech-Java-Runoob-高级教程-实例-数组:15. Java 实例 – 判断数组是否相等 1.返回顶部 1. Java 实例 - 判断数组是否相等 Java 实例 以下实例演示了如 ...
- Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素
ylbtech-Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素 1.返回顶部 1. Java 实例 - 在数组中查找指定元素 Java 实例 以下实例 ...
- Java-Runoob-高级教程-实例-数组:13. Java 实例 – 数组交集
ylbtech-Java-Runoob-高级教程-实例-数组:13. Java 实例 – 数组交集 1.返回顶部 1. Java 实例 - 数组交集 Java 实例 以下实例演示了如何使用 reta ...
- Java-Runoob-高级教程-实例-数组:12. Java 实例 – 数组差集
ylbtech-Java-Runoob-高级教程-实例-数组:12. Java 实例 – 数组差集 1.返回顶部 1. Java 实例 - 数组差集 Java 实例 以下实例演示了如何使用 remo ...
- Java-Runoob-高级教程-实例-数组:11. Java 实例 – 删除数组元素
ylbtech-Java-Runoob-高级教程-实例-数组:11. Java 实例 – 删除数组元素 1.返回顶部 1. Java 实例 - 删除数组元素 Java 实例 以下实例演示了如何使用 ...
- Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素-un
ylbtech-Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素 1.返回顶部 1. Java 实例 - 查找数组中的重复元素 Java 实例 以下实例 ...
- -Java-Runoob-高级教程-实例-数组:09. Java 实例 – 数组扩容
ylbtech-Java-Runoob-高级教程-实例-数组:09. Java 实例 – 数组扩容 1.返回顶部 1. Java 实例 - 数组扩容 Java 实例 以下实例演示了如何在数组初始化后 ...
随机推荐
- Python语法之垃圾回收机制
目录 一 引入 二.什么是垃圾回收机制? 三.为什么要用垃圾回收机制? 四.垃圾回收机制原理分析 4.1.什么是引用计数? 4.2.引用计数扩展阅读 一 引入 解释器在执行到定义变量的语法时,会申请内 ...
- Spring中的IOC和AOP
一.IOC(DI) Inversion of Control 控制反转,也叫(Dependency Injection)依赖注入. 我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这 ...
- 千万级别数据量mysql优化策略
表结构优化 1. 使用独立表空间 独立表空间指的是innodb表的一种数据结构 独占表空间: 每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件 ...
- BZOJ 4668: 冷战 并查集启发式合并/LCT
挺好想的,最简单的方法是并查集启发式合并,加暴力跳父亲. 然而,这个代码量比较小,比较好写,所以我写了 LCT,更具挑战性. #include <cstdio> #include < ...
- stat:查看文件时间参数
Linux 系统中,每个文件主要拥有 3 个时间参数,分别是文件的访问时间.数据修改时间以及状态修改时间: 访问时间(Access Time,简称 atime):只要文件的内容被读取,访问时间就会更新 ...
- Android_(菜单)选项菜单
Android系统中菜单分为Options Menu.Context Menu.Sub Men三种 Options Menu和Context Menu属于一级菜单 Sub Menu属于Options ...
- task.delay 和 thread.sleep
1.Thread.Sleep 是同步延迟. Task.Delay异步延迟. 2.Thread.Sleep 会阻塞线程,Task.Delay不会. 3.Thread.Sleep不能取消,Task.Del ...
- x-admin
https://blog.csdn.net/u014793102/article/details/80316335
- Ajax+PHP实现的进度条--实例
之前重点学习PHP,所以javascript.Ajax都比较弱一点.现在也开始补课了,今天实现了一个进度条的例子,感觉Ajax实现动态页面真的很厉害,并没有想象中的那么难理解. 进度条作为反应实时传输 ...
- TP5 未定义变量:XXX
TP5开发模式下报错级别非常高,哪怕变量未定义都直接抛出异常 应用公共函数文件 路径: application/common.php 在common.php文件写入 // 异常错误报错级别, err ...