使用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
金麟岂是池中物,一遇风云便化龙!
欢迎与我交流技术问题
最新文章
- Firebug 学习使用教程
- CSS2中的定位属性
- 利用 PortableBasemapServer 发布地图服务
- Spring第十篇—举例实现AOP
- c#中的常用ToString()方法总结
- Flex “跑马灯”效果(自定义“跑马灯”控件)
- hdu 4294 数学分析+搜索
- TensorFlow 深度学习笔记 Stochastic Optimization
- hdu 3917 (最大权闭合图)
- python基础之实现sql增删改查
- web安全之SQL注入
- HDU - 5521 Meeting (Dijkstra)
- python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原
- The folder can’t be opened because you don’t have permission to see its contents.
- Unity3D学习笔记(三十二):Xlua(2)
- jqGrid pivot获取所有行包括小计数据及原码分析
- vue2.0插件
- MYsql系统函数和联合查询
- [XML123] XSLT
- Linux学习笔记(第七章)
热门文章
- 让IE8一下兼容CSS3选择器
- R &; and &;&;
- ubuntu下jps命令无效
- unittest详解(二) 跳过用例的执行(skip)
- [Pytorch笔记] scatter_
- oracle 获取时间
- Mongo rs
- json转换时 java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException
- springboot+mybatis 使用事务
- 第十四周课程总结 &; 实验报告