使用new關鍵字建立對象數組(C#,C++,Java)

今天遇到一個題目java

分析下面的代碼,判斷代碼是否有誤。ios

 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 }

 

咱們接着運行
仍然報錯,並且並未輸出構造函數內的內容spa

到這裏,已經很明顯了,使用new建立對象數組時,不會真的建立對象!
固然,以上只是C#中的結論
咱們接下來換C++debug

 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!3d

 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關鍵字建立對象數組時,也是不會建立對象的code

總結:
在面嚮對象語言中,new關鍵字基本都是隻開闢空間,不建立對象的。而C++做爲非純面嚮對象語言,在設計方面與面嚮對象語言仍是有很大的不一樣。
----------------------------------------------------------------------------
你們好,我是ABKing

金麟豈是池中物,一遇風雲便化龍!歡迎與我交流技術問題

相關文章
相關標籤/搜索