使用new关键字创建对象数组(C#,C++,Java)

今天遇到一个题目

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

 1 using System;
 2
 3 namespace Test1
 4 {
 5     class Point
 6     {
 7         public int x;
 8         public int y;
 9     }
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             Point[] pointArr = new Point[3];
15             pointArr[0].x = 5;
16             pointArr[0].y = 6;
17             pointArr[1].x = 8;
18             pointArr[1].y = 16;
19             pointArr[2].x = 15;
20             pointArr[2].y = 26;
21         }
22     }
23 }

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

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

 1 using System;
 2
 3 namespace Test1
 4 {
 5     class Point
 6     {
 7         public Point() { Console.WriteLine("这是一个构造函数"); }
 8         public int x;
 9         public int y;
10     }
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             Point[] pointArr = new Point[3];
16             pointArr[0].x = 5;
17             pointArr[0].y = 6;
18             pointArr[1].x = 8;
19             pointArr[1].y = 16;
20             pointArr[2].x = 15;
21             pointArr[2].y = 26;
22         }
23     }
24
25 }

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

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

 1 #include "pch.h"
 2 #include <iostream>
 3 using namespace std;
 4 class Point
 5
 6 {
 7 public:
 8     int x;
 9     int y;
10     Point() {
11         cout << "这是一个构造函数" << endl;
12     }
13
14 };
15 int main()
16 {
17         Point * pointArr = new Point[3];
18         pointArr[0].x = 5;
19         pointArr[0].y = 6;
20         pointArr[1].x = 8;
21         pointArr[1].y = 16;
22         pointArr[2].x = 15;
23         pointArr[2].y = 26;
24 }

运行:

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

 1 package pack1;
 2
 3 class Point
 4 {
 5     public int x;
 6     public int y;
 7     public Point() {
 8         System.out.println("这是一个构造函数");
 9     }
10
11 };
12 public class TestJava {
13     public static void main(String[] args) {
14         Point[] pointArr = new Point[3];
15         pointArr[0].x = 5;
16         pointArr[0].y = 6;
17         pointArr[1].x = 8;
18         pointArr[1].y = 16;
19         pointArr[2].x = 15;
20         pointArr[2].y = 26;
21     }
22 }

运行!

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

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

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

原文地址:https://www.cnblogs.com/ABKing/p/11965225.html

时间: 2024-10-11 21:15:53

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

集思广益,有个几百万关键字的数组的文本匹配的算法

关键字 都是放在一个数组中的,譬如$keyword_arr=["key1","key2","example",......],大约有几百万甚至上千万的关键字,这些关键字已经按照优先级从前到后排列了,越靠前的关键字优先匹配,匹配的最多次数是$max次:目前采用for循环$keyword_arr数组,然后将关键字组装成'/\\b(?:'.$value.')\\b/i';正则来匹配文本内容$text:如果已经匹配了$max次了,就停止匹配. 这个算法肯

const对象,NULL和nullptr,C++中创建对象数组

 1.定义成了const之后的类 #include <iostream> class area { public: int x; int y; mutable int z; //不受const约束的类成员 area() :x(10), y(10), z(2) { } void printxy()const //不可以访问类中局部变量 { z = z + 1; std::cout << x << " " << y << &q

JSon_零基础_007_将JSon格式的&quot;数组&quot;字符串转换为Java对象&quot;数组&quot;

将JSon格式的"数组"字符串转换为Java对象"数组". 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“name.values”集合, 通过get(key)方法取得key对应的value部分(字符串). 通过getJSONObject(key)可以取得一个JSONObject对象. 通过getJSONArray(key)可以得到一个JSONArray对象. 导入需要的jar包: package com.west.

求1+2+3+...+n的值,要求不能使用乘除法,for、while、if、else、switch、case、等关键字及条件判断语句(JAVA)

采用递归和三目表达式注意红色字体一定不能写成n-- 1 package com.hunag; 2 3 public class Sum { 4 5 static int sum; 6 public static int isum(int n) 7 { 8 sum+=n; 9 sum=n==0?sum:isum(--n); 10 System.out.println(n); 11 return sum; 12 } 13 public static void main(String[] args)

JAVA笔记4__static关键字/对象数组/foreach/方法的可变参数

/** * static关键字:修饰属性(实质就是全局变量).方法(无需本类的对象即可调用此方法).类. * 1.static方法只能调用static方法 * 2.static方法只能访问static数据 * 3.static方法不能以任何方式引用this或super */ public class Main { public static void main(String[] args) { A a = new A(); a.val = 2; A a1 = new A(); a1.val =

Java 数组基础,java.util.Arrays

定义数组 方式1(推荐,更能表明数组类型) 方式2(同C语言) 方式3?定义时直接初始化 数组运用基础 数组长度 equals() 数组元素不为基本数据类型时 二维数组 二维数组基础 变长的二维数组 java.utils.Arrays 类 参考文献: ? 数组(Array):相同类型数据的集合. 定义数组 方式1(推荐,更能表明数组类型) type[] 变量名 = new type[数组中元素的个数]; 比如: int[] a = new int[10]; 数组名,也即引用a,指向数组元素的首地

节省创建对象数组的技巧

... 不管Student obj[10];//obj是指针首地址 还是Student* pStudent=new Student[10];...delete  pStudent; ... 实际上最终给各个对象初始化的时候调用的都是默认的构造函数(结构体是没有构造函数的),如果有重载的构造函数的话,再使用这种方式岂不浪费时间?以下是解决方法:class Student {public:     Student();     Student(char name[20],int age,float

(转载)Java里新建数组及ArrayList java不允许泛型数组

java中新建数组: String[] s;//定义的时候不需要设置大小 s = new String[5];//为数组分配空间时就要设置大小 对于ArrayList, ArrayList<String> result = new ArrayList<String>(); //这时候就不需要设置大小了,result.add(string)添加一个元素,result.remove(string)删除一个元素,大小可以由result.size()得到 再来看看 java里允许Map[]

const关键字与数组、指针

目录 const关键字 const修饰数组 const修饰指针 用两个const修饰指针 @ 开始回顾C基础知识.C中使用指针是很危险的事情,一个不慎就会造成程序崩溃,因此对于传入函数的参数进行保护就是必须的了,特别是针对数组. const关键字 const关键字用于将一个变量声明为只读,也就是常量,无法被修改. const int constant = 10;//声明constant为常量的同时对它进行初始化赋值 int const constant = 10;//也可以将const放在int