今天遇到一個題目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
金麟豈是池中物,一遇風雲便化龍!歡迎與我交流技術問題