標籤:類 java 堆棧 this
1.類的構建
a. 屬性
b. 方法
屬性是主人,方法為屬性服務,是僕人。
c. 類的構建粒度
滿足程式的設計需要即可,未涉及的屬性和方法可不加入類的設計。
2.進程介紹
電腦記憶體以進程為單位進行分配。每個進程在邏輯上是隔離的,每個進程都認為自己是這台電腦上的唯一的程式,自己面對是所有的記憶體空間,這種技術叫做進程隔離技術,保證了系統不會因為一個進程的失敗,導致死機。
一個進程可以向作業系統申請記憶體,進程申請到的記憶體一般以兩種格式來使用,一種是棧(stack)的形式,一種是堆(heap)的形式. 一個進程可以多個棧,但只有一個堆,一個棧對應的是一個線程,一個進程至少需要一個線程(thread),即至少有一個棧。
我們目前所編製的程式,就是單進程單線程程式,該程式擁有一個stack和一個堆。
3. 對象的建立和方法調用
Car c=new Car();
1) 使用class loader讀取Car進入代碼區 (code area)
2) 在堆棧中建立引用變數c (Car類型)
3) 在堆中申請記憶體建立裸對象,並初始化this , super以及代碼指標等隱式屬性。
4) 調用構造方法實現對Car對象自有顯式屬性的初始化。
5) 擷取初始化好的Car對象記憶體位址賦予引用變數c.
c.showCarInfo();
1) 通過引用變數c對Car對象發出調用showCarInfo()的指令。
2) Car對象收到指令後,立即訪問其代碼指標,存取碼區中的showCarInfo方法代碼並執行。
4. 層疊構造方法 (cascade constructor)
Student(){
this("mary",12);
}
Student(String name){
this(name,12);
}
Student(String name,int age)
{
this.name=name;
this.age=age;
}
層疊構造方法提供了構造方法的多樣性,為對象的建立者提供了便利。
層疊構造方法集中所有的處理邏輯在全參構造方法,便於集中修改和維護。
在這裡要注意的是在構造方法的互調用過程中,必須用this來替代構造方法名,不能直呼類名。
5.執行個體變數和類變數
執行個體(instance)就是對象的意思,更加書面化一些。
執行個體變數也叫做執行個體屬性,每個執行個體都有一份拷貝,在建立裸對象的過程中,執行個體變數的空間就會被開闢,在建構函式中,執行個體變數的空間會被初始化。
Ex: int count;
類變數屬於類本身,也就是說其屬於模板(模具), 類變數不在對象中,所有的對象都可以訪問類變數,類變數被所有的類對象共用。
在類載入的過程中,將在“靜態區“中建立類對象。
Ex: static int count;
1.包(package)的概念
一個好的類名,大家都愛使用,那麼在相同類名的情況下,將很難區分類的主人, 所以我們必須給類起一個範圍限定(歸屬), JAVA中是通過包的機制來解決的。
案例:
張三寫的學生類 zhangsan. Student
李四寫的學生類 lisi.Student
王五編寫了一個程式使用到了上述兩個學生類:
zhangsan.Student s=new zhangsan.Student();
包是一種邏輯結構,是一個類的歸屬標誌,同一個包中不能出現雷同的類名。
包在物理上是如何?的?是通過磁碟目錄來表示的。
包名也有可能出現雷同的現象,為了避免這種情況的發生,我們一般使用單位的網域名稱倒裝來作為包名,因為網域名稱不會出現重複,一個網域名稱作為包名將可能在磁碟上建立多個層級目錄。
為了避免你所編寫的類,在後續的系統中出現使用上問題,請不要書寫無包類/預設包類(default package).
案例:
package edu.fzu.cs; //package關鍵字,說明這個類所屬的包
public class Student {
}
包名必須全部小寫
2. 封裝類(wrapper)
任何基本類型:byte,int , float ,double, boolean,char (16bits) ….. (沒有無符號資料類型)
Char: utf-8 國際化編碼
在JAVA中都有一個類類型與其對應。
Int à java.lang.Integer (java.lang java語言套件, lang=language,
java.lang包中的所有的類在任何JAVA程式中都由編譯器預設匯入,文法是:
import java.lang.*;
由於lang包裡頭的類使用極度頻繁,是語言擴充和服務類,為降低程式員的匯入負擔,該包下的所有類由編譯器協助匯入,使用者無需手動匯入。
)
封裝類的主要作用:
a) int à Integer
b) float à Float
c) double à Double
d) boolean à Boolean
e) char à Character
1. 彌補基本類型的語意缺失
基本類型無法表示:“沒有”
float mark; 0
Float mark 0 , null
2. 為基本類型提供服務
System.out.println(Integer.toBinaryString(100));
System.out.println(Integer.toHexString(100));
System.out.println(Integer.parseInt("12")+1);
類類型建立在堆中,空間消耗很低。
裝箱(inbox)和拆箱(outbox)
代表了類類型和基本類型之間的轉換行為。
手動版本:
Integer b = new Integer(10);
Int a = b.intValue;
自動版本:
Integer b=30; à Integer b=new Integer(30);
Int a=b; à int a =b.intValue();
因為基本類型和類類型之間的換轉操作頻繁,SUN公司在高版本的JDK中提供了自動裝箱和拆箱操作,由編譯器協助你書寫轉碼。
在JDK5以上版本才支援自動裝箱和拆箱操作。
3. String類瞭解
String s=new String("abc");
String m=new String("abc");
通過new String()文法將告訴編譯器建立新對象,所以這裡建立兩個字串對象。
System.out.println(s==m);
String a="xyz";
String b="xyz";
System.out.println(a==b);
為了相容C開發人員的習慣,SUN也允許不寫new String,而字串賦值。
當”xyz”這個字串對象在記憶體中不存在的時候,系統將建立一個字串對象,當已經存在的時候,系統將複用這個對象。
字串的不變性(immutable)
任何字串對象一旦被建立,就不能被更改,通過引用變數導致字串的修改,都將導致新字串對象的建立。
a=a+"mn";
System.out.println(a==b);
大量的字串相加操作會產生大量的字串對象,比如:
String a=”superstar”;
a=a+”m”;
如果有涉及到較多的字串相加操作,請使用StringBuffer類。
String s=" this is a book! ";
System.out.println(s.length()); //求字串長度
System.out.println(s.trim().length()); //去除頭尾空格
System.out.println(s.toUpperCase());
System.out.println("aBcD".toLowerCase());
System.out.println(s.indexOf(‘s‘)); //找出s這個字元在字串中首次出現的位置
System.out.println(s.lastIndexOf(‘s‘));//找出s這個字元在字串中最後一次出現的位置
System.out.println(s.indexOf("book")); //找出子串出現的位置
System.out.println(s.indexOf("world!"));
System.out.println(s.toCharArray()[3]);
System.out.println(s.charAt(3));
System.out.println(s.concat("hello,world!")); //字串相加
System.out.println("abc".compareTo("bca")); //-1,0,1
System.out.println("abc".compareTo("abc")); //-1,0,1
System.out.println("cbc".compareTo("bca")); //-1,0,1
System.out.println("Abc".compareToIgnoreCase("aBc"));
System.out.println(s.contains("book"));
System.out.println(s.endsWith("! "));
System.out.println(s.isEmpty()); //是否為空白
System.out.println(s.replace(‘s‘, ‘m‘));
System.out.println(s.valueOf(1));
System.out.println(1+"");
System.out.println("abcdefg".substring(3));
System.out.println("abcdefg".substring(3,6));
key: 進程 & 線程
進程是一個邏輯單位,線程類似一個物理單位,進程像班級,線程像學生,一般班級出行申請經費,都是以班級的名字,所以這裡表示由
進程進行申請,作業系統只會給進程分配空間,一個進程至少包含一個線程,進程申請了資源,如同班級申請了班費,班費800元,給每個學生平分500元,這500元叫棧,剩下300公用的叫堆- -
程式猿通過調用棧內的引用變數,對類對象進行發送訊號,類對象收到訊號後,使用對象的代碼指標調用相對應的代碼,存取碼的時候有些情況下需要用到類對象的屬性內容,於是出現了this指標,this指標的作用是方便代碼層更準確的定位到所需對象的屬性資料
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Java StuNote 3