Java程式設計思想(一) —— 一切都是物件及記憶體分配
阿新 • • 發佈:2018-12-25
《Java程式設計思想》 作者:Bruce Eckel
雖然這本書是經典,但是對於一個入門java,又沒有其他程式設計經驗的人來講,實在難以看懂,前前後後看了三遍。
第一次什麼都不懂的時候硬著頭皮看,沒看完,看了前面忘了後面,中間很多看不懂。第二次的時候,看懂了很多,但是不知道經典在何處。
第三次,是自己用了這門語言一年後,知道所謂的經典是什麼,java的特性都在這裡,這書不是從基礎的JDK怎麼裝開始講起。,大部頭的一本書,現代人的話很少去翻了,其實可以當參考書,看哪一部分忘了,直接溫故即可。一次在學校看到第四版英文版的,硬著頭皮看,看著看著就看不懂了,英語重要就在這裡。
一切都是物件。
我的一位朋友以前的簽名是,我一直都在面向物件,可是現在連一個物件都沒有。
(一)類引用
假如有一個類 電視機類 class TV;
TV control , control是一個引用(reference),其實重新看C之後發現這引用就跟指標一樣,少了個星號而已。
物件的建立用new。
同時,我在看資料結構書時候,注意到了初始化的問題。
(二)記憶體分配
這東西放哪裡呢,那還是要像C一樣看記憶體分配。
1) 暫存器 。 最快的儲存區,處理器內部,根據需求分配,不能自己控制,但是C/C++可以用register。
2)棧(原文堆疊,其實應該翻譯成棧更合適,和堆區分開來,因為英文的stack就是堆疊的意思)。 位於通用RAM(Random Access Machine,隨機訪問儲存區,在作業系統,微機原理等計算機的基本組成中都有提到),速度僅次於暫存器。存放基本變數和引用,存在棧中的資料可以共享。但是,棧中的資料大小和生存週期必須確定,這是缺點。
棧存的一個是基本的資料型別,int i = 1; 其實i是一個指向int型別的引用。1存在棧中,i指向1的地址(作用和指標一個樣),如果此時有int j = 1; 由於共享性,就不會再開闢
一個新的1的地址。直接讓i和j指向同一個地址。
棧也儲存物件的引用。
3)堆。存放所有的java物件。
4)常量儲存。常量(注意常量和變數,int i =1是變數),字串,靜態區的東西儲存在此。
5)非RAM儲存。
再來看看一個有趣的物件equals和==問題。
(三)作用域問題
{}作用域裡決定了變數的宣告週期,變數用於作用域之前,所以有時會犯一些低階錯誤,在作用域之外又再次使用該變數。就會出現can not be resolved,無法解析的問題了。
(四)第一個HelloWorld程式
程式的開頭,要用import語句引入程式所需要的類,java.lang是預設匯入進每個java檔案的,之前一直奇怪lang是什麼——language。
(五)編碼風格
類名用駝峰標識,首字母大寫。幾個單詞的話就每個單詞的首字母大寫。
另外加上上次在Google看到的程式設計風格,
if else while 等語句的使用時,即使是空語句,也要加上{},更容易看。
附加:
為什麼只能有 一個public class,
轉自:
http://www.answers.com/Q/Why_one_public_class_in_one_source_file_in_java
A file with .java extension when compiled. The Compiler looks for a unique class file that's declared public. A file cannot have more than one name Similarly in a java file there cannot be more than one public class that is used to uniquely identify the file name but if you try declaring two public class then the compiler throws an error.
編譯器只會尋找宣告為public的class,有多個會報錯,設計的問題。
第一章的是總體的分析,一些簡單的基礎入門。有基礎的看過去不會難。
雖然這本書是經典,但是對於一個入門java,又沒有其他程式設計經驗的人來講,實在難以看懂,前前後後看了三遍。
第一次什麼都不懂的時候硬著頭皮看,沒看完,看了前面忘了後面,中間很多看不懂。第二次的時候,看懂了很多,但是不知道經典在何處。
第三次,是自己用了這門語言一年後,知道所謂的經典是什麼,java的特性都在這裡,這書不是從基礎的JDK怎麼裝開始講起。,大部頭的一本書,現代人的話很少去翻了,其實可以當參考書,看哪一部分忘了,直接溫故即可。一次在學校看到第四版英文版的,硬著頭皮看,看著看著就看不懂了,英語重要就在這裡。
一切都是物件。
我的一位朋友以前的簽名是,我一直都在面向物件,可是現在連一個物件都沒有。
(一)類引用
假如有一個類 電視機類 class TV;
class TV{
int length; //欄位,也叫資料成員
int point(){ //方法,也叫成員函式
return 1;
}
}
TV control , control是一個引用(reference),其實重新看C之後發現這引用就跟指標一樣,少了個星號而已。
物件的建立用new。
TV Ccontrol = new TV();
同時,我在看資料結構書時候,注意到了初始化的問題。
TV Control;
此時的Control是物件的一個引用,不是物件本身,但是在賦值成某物件,即上面的初始化之前,其實是儲存為null的特殊物件的引用。這也回答了,為什麼你每次使用物件的時候,IDE會提示物件的未初始化。(二)記憶體分配
這東西放哪裡呢,那還是要像C一樣看記憶體分配。
1) 暫存器 。 最快的儲存區,處理器內部,根據需求分配,不能自己控制,但是C/C++可以用register。
2)棧(原文堆疊,其實應該翻譯成棧更合適,和堆區分開來,因為英文的stack就是堆疊的意思)。 位於通用RAM(Random Access Machine,隨機訪問儲存區,在作業系統,微機原理等計算機的基本組成中都有提到),速度僅次於暫存器。存放基本變數和引用,存在棧中的資料可以共享。但是,棧中的資料大小和生存週期必須確定,這是缺點。
棧存的一個是基本的資料型別,int i = 1; 其實i是一個指向int型別的引用。1存在棧中,i指向1的地址(作用和指標一個樣),如果此時有int j = 1; 由於共享性,就不會再開闢
一個新的1的地址。直接讓i和j指向同一個地址。
棧也儲存物件的引用。
3)堆。存放所有的java物件。
4)常量儲存。常量(注意常量和變數,int i =1是變數),字串,靜態區的東西儲存在此。
5)非RAM儲存。
再來看看一個有趣的物件equals和==問題。
TV Control;
//與C++不同的是,C++實際上建立了這個物件,留出了所需要的空間,而java只是建立某一個物件的儲存地址的空間。
Control = new TV();
TV AnotherControl = Control;
//C++將所有的資料拷貝到Another中,而java只是把地址複製過去。
//所以兩者是否==(java中實際上判斷引用是否一致,即物件是否相同),既然地址一致,同一個物件,答案為ture。c++卻用==來判斷物件的資料是否相同,而java用的是equals,一般重寫。
(三)作用域問題
{}作用域裡決定了變數的宣告週期,變數用於作用域之前,所以有時會犯一些低階錯誤,在作用域之外又再次使用該變數。就會出現can not be resolved,無法解析的問題了。
(四)第一個HelloWorld程式
程式的開頭,要用import語句引入程式所需要的類,java.lang是預設匯入進每個java檔案的,之前一直奇怪lang是什麼——language。
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
其實java也沒有那麼強大,看,簡簡單單的HelloWorld要寫這麼一堆不相關的東西。所以,還是根據需要選擇你使用的語言。(五)編碼風格
類名用駝峰標識,首字母大寫。幾個單詞的話就每個單詞的首字母大寫。
另外加上上次在Google看到的程式設計風格,
if else while 等語句的使用時,即使是空語句,也要加上{},更容易看。
附加:
為什麼只能有 一個public class,
轉自:
http://www.answers.com/Q/Why_one_public_class_in_one_source_file_in_java
A file with .java extension when compiled. The Compiler looks for a unique class file that's declared public. A file cannot have more than one name Similarly in a java file there cannot be more than one public class that is used to uniquely identify the file name but if you try declaring two public class then the compiler throws an error.
編譯器只會尋找宣告為public的class,有多個會報錯,設計的問題。
第一章的是總體的分析,一些簡單的基礎入門。有基礎的看過去不會難。