Java基礎

Java基礎

之前看的Java核心技術的筆記,記錄一些Java基礎注意點:

數據

1.Java大小寫敏感,空格多少不影響句子。
2.一個class文件只能有一個public類,且文件名與該public類類名相同;類名只能以字母開頭,其後跟字符和數字任意組合(不能使用關鍵字);標準命名規範(只是個標準):大寫字母開頭,若名字由多個單詞組合,則每一個單詞第一個字母大寫(駱駝命名法)。
3.Java是強類型語言,即要爲每一個變量聲明類型。
4.Java基本類型在任何計算機任何操作系統佔用大小都不變,整型是精確值類型,浮點型是近似值類型。
5.注意'A'與"A"的區別,前者是字符,後者是字符串
6.在Java中,整型值與布爾型值不能相互轉換。在C++中,值0相當於false,非0值相當於true,在Java中則不是這樣的。即在Java中不能這樣:

int a;
//...
if(a)...//這裏a不能做判斷條件,因爲整型不能轉換爲布爾型,在C++是可以的,自動轉換

7.變量
1).判斷Java中的“字母”:可以使用Character類的isJavaIdentifierStart和isJavaIdentifierPart方法進行檢測。$是Java字母,但不要使用它。
2).Java不區分變量的聲明和定義。變量聲明瞭使用前必須初始化,否則會報錯。(C++對於基本類型則不會,靜態的是默認值,動態的是隨機值?)
3).常量,final修飾,只能在初始化的時候被賦值,通常常量名均用大寫。類常量:static final修飾。static:這個類的特性,非某個實例所有若再加上public修飾,則其他類也可以使用,通過ClassName.value使用。

String str = new String("123");//創建了幾個對象?
//分析:
//先去常量池查找是否有"abc"對象,如果沒有,則在常量池創建此字符串對象(如果有則
//省略該步驟),然後再在堆中創建一個常量池此"adc"對象的拷貝對象,所以,常量池中
//沒有"abc"字符串,則創建了兩個對象,否則,就只是創建了一個

8.運算符
1).整數除整數結果還是整數,若其中有一個非整數,則結果爲浮點數。
2).整數被0除產生一個異常,但是,浮點數被0除會得到無窮大或NaN。
3).自增自減運算符,儘量不要在其他表達式中嵌套。
4).關係運算符和boolean運算符:==、!=、>、<、>=、<=、!、&&、||(短路運算)。
5).位運算符:&(與)、|(或)、^(異或)、~(非)、>>(右移,用符號位填充高位)、<<(左移);>>>(用0填充高位,C++沒有此),沒有<<<運算符,對於移位運算右側的參數,需要進行模32運算(除非左邊的操作數是long類型,此時,則進行模64運算),例如1<<35與1<<3是相同的。
6).強制類型轉換:丟失精度

double d=9.97;
int x=(int)d;//這樣結果x=9;只取整數位
//若想獲得舍入值,則需要使用Math的round方法:
int x=(int)Math.round(d);//這時結果x=10;round返回的是long類型,如果值超過int範圍,強轉還是會損失精度

類與對象

1.基本
1).由類構造對象的過程稱爲類的實例化(所以,有時也稱類的對象爲類的實例)
2).對象中的數據稱爲實例域(instance field),每個對象都有自己一組特定的實例域,這些值的集合就是這個對象當前的狀態(state)。無論何時只要向對象發送一個消息,他的狀態就有可能改變
3).對象的三個主要特性:
(1).對象的行爲(behavior):可以對對象施加哪些操作,或可以對對象施加哪些方法?
(2).對象的狀態(state):當施加方法時,對象如何響應?
(3).對象的標識(identity):如何辨別具有相同行爲與狀態的不同對象?
4).設計類>>>>>向類添加方法:描述類“外觀”>>>>>描述類“行爲”
5).類之間的關係:常見
(1).依賴(“uses-a”):最明顯常見的一種關係,A類需要B類(設計時儘可能較少該關係,讓類的耦合度低)
(2).聚合(“has-a”):具體且易於理解,A類對象包含B類對象
(3).繼承(“is-a”)。
6).C++類的方法可以在類外定義,也可以在類內定義(類內定義自動成爲內聯方法);Java則必須在類內定義(是不是內聯方法由JVM決定)。
2.方法參數
1).Java所有的方法參數在方法內使用的是參數的拷貝!可能是值拷貝,可能是引用拷貝。(Java爲每一個傳進來的參數拷貝一個對象,方法內使用的就是這個對象)所以,傳遞進去的如果是值,則其值是不會變的,變的只是方法內的那個拷貝對象,與傳遞的參數無關;同樣的,如果傳遞的是引用,實參指向是不會改變的,但是可以改變其指向的內容(可以改變引用對象的狀態),相當於說,Java的方法參數全是final的!
注意:C++則可以通過&符號修改參數的指向
3.對象的構造:僅當類沒有提供構造函數,系統纔會提供一個默認的無參的構造函數
1).重載:任何方法都可重載:參數個數、類型其中一樣不同就可,返回值不同沒用。(Java不許重載運算符)
重寫(方法覆蓋)與重載區別:
(1).重寫必須繼承,重載不用。
(2).重寫的方法名,參數數目相同,參數類型兼容,重載的方法名相同,參數列表不同。
(3).重寫的方法修飾符大於等於父類的方法,重載和修飾符無關。
(4).重寫不可以拋出父類沒有拋出的一般異常,可以拋出運行時異常
2).一般的,最好在構造器中顯示的給域初始化。局部變量必須顯示初始化後才能用,而域則可以不用(會使用給類型的默認值,不過最好是顯示
初始化,否則的話,影響可讀性,這是二者最主要的不同點)

//C++註釋:C++不能直接初始化類的實例域(既不能在聲明處初始化),必須在構造器中才
//行,但有一個特殊的初始化器列表:
        Employee::Employee(String n,double s,int y,int m,int d):name(n),salary(s),hireDay(y,m,d){}
//Java沒並要有這,因爲Java對象沒有子對象(駐留在另一個對象中的對象,在一個類的
//定義中,聲明另一個類的對象來作爲成員變量。),只有指向其他對象的指針(引用)

3).Java可以利用this,在一個構造器中調用另外一個構造器;而C++則不能,必須抽取出公共初始化代碼編寫成一個獨立的方法。
4).初始化塊:位於類中一個獨立的塊:

class A{
    private int a;
    {
        //初始化塊
    }
    public int getA(){}
}
    只要構造類的對象(構造實例)就會執行初始化塊;無論使用哪個構造器,初始化塊都會
    執行,而且是先執行,後才執行構造器中的語句

5).某些對象使用了內存之外的其他資源,例如,文件或使用了系統資源的另一個對象的句柄,這種情況,JVM是不會自動回收垃圾對象的,可以爲任一個類添加finalize方法,finalize方法將在垃圾回收器清除對象之前調用。
4.包:只能用*導入一個包,即只能這樣:import java.util.*;不能import java.*或import java.*.*;
1).import不僅可以導入類或一個包,也可以導入靜態域和靜態方法:

import static java.lang.System.*;//這樣就可以直接:out.println();

繼承

Java只有公有繼承,沒有C++的私有繼承和保護繼承
1.子類不能直接調用超類的私有域:

class A{
        private int a;
        public int getA(){
            return this.a;
        }
    }
    class B extends A{
        private int x;
        //要覆蓋超類的getA方法
        public int getA(){
            // return a+x;   error,不能直接訪問a,雖然B類繼承了A類的私有域a
            // return getA()+x; error,也不能這樣,這樣就成了無限遞歸了
            return super.getA()+x;//正確,super不是一個對象引用,只是一個指示編譯器調用超類方法的特殊關鍵字,和this不一樣
            //C++調用超類方法:A::getA()
        }
        //另外,注意,使用super調用超類構造器必須是子類構造器的第一條語句
    }

2.多繼承:
Java是沒有多繼承的,只有單繼承,即一個子類只能有一個超類。
單繼承:管理簡單,不會出現邏輯錯誤以及多繼承自身的缺陷,另一方面,Java使用了接口,一個類可以實現多個接口,從而在另一個更合理的角度來實現純粹的多重繼承。
類之間的繼承(extends)只能單繼承,但能實現(implements)多個接口;接口之間能繼承(extends)多個接口,只需要用逗號分開即可,但是如果真的必須需要使用這樣複雜的機制,務必注意方法重名導致的問題。
3.另外要注意,數組引用與一般對象引用的不同:

B b=new B();
    A a=b;
    a=new A();//完全可以
    //但是,數組就不一樣了:
    B[] b=new B[10];
    A[] a=b;//這個時候,完全可以,向下引用(向上賦值)
    a[0]=new A();//錯誤
    a=new A[10];//正確,此時,a[0]=new A();是可以的
也就是說,對於數組來說,當數組引用(這裏就是a)指向了某一個類型的數組,就只能存儲這
個類型的數據(或這個類型的子類)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章