標籤:java 基礎知識
java使用類來構造自己的資料類型,類其實就是對一類資料和行為的資料封裝;可以達到低耦合功能;
java
注意啦:用類也是我們為了定義自己資料類型的一種方法,所以結構體,共用體也是一樣的;都是為了處理資料而用的方法!
類的存放問題: java原始碼檔案是以類為中心的,一個類的定義源碼必須只在一個源檔案實現;一個“檔案名稱.java”檔案名稱必須與檔案中用public class 修飾的類名一致,java文法還規定一個源檔案中必須有且只能只有一個public類,public是一個存取修飾詞,public的意思是我這個類可以供別的類使用,在任何地方。
從資料類型的角度看待類就有全新的認識:類是通過將別的資料類型封裝到自己類裡面作為自己的屬性,代表一種全新的複雜資料類型。
類的構造方法:
方法名和類名是一樣的
構造方法在建立對象的時候會java平台自動調用構造方法
構造方法沒有傳回值
類變數和類方法
類變數是該類的所有對象共用的變數,該類的任何一個對象訪問它時候,取到的都是同一個記憶體位址的值; 同樣任何一個該類的對象去修改它時,修改的也是同一個變數。類變數可以被對象的普通方法(非靜態方法)去維護;
類變數是與類有關的公有屬性
執行個體變數是屬於每個對象個體的屬性
類變數可以通過類名.類變數名直接存取
定義文法
存取修飾詞 static 資料類型 變數名
訪問類變數方式
類名.類變數名 或者 對象名.類變數名(不提倡)
程式有代碼區和棧區
類方法
類方法定義形式
存取修飾詞 static 傳回值類型 函數名(參數列表)
類方法中不能訪問非靜態變數,
public static int getTotalFee()
{
age++; //對象屬性,非靜態變數
return totalFee;
}
但是普通方法可以訪問靜態變數(類變數)和對象屬性(成員變數)
調用方式
通過類名.類方法名直接存取;
類方法屬於與類相關的,公用的方法
執行個體方法屬於每個對象個體的方法
java中預設遵守的規則:類變數用類方法去維護;
方法重載
1、方法一樣
2、需要參數類型,參數數量,參數順序至少有一項不同
3、參數傳回值和方法修飾符可以不同,但是不能作為判定重載的依據:
比如兩個函數,參數類型,數量,或順序都是一致的,方法名一樣;單純的只是傳回值不同或者方法修飾符不同那麼這樣不構成方法重載。編譯器是會報錯的
方法覆蓋
方法覆蓋是指子類有個方法和父類的某個方法在 傳回值類型 + 方法名 +參數列表 一樣;那麼就說子類的方法覆蓋了父類的這個方法。
類的繼承可以做到代碼的複用,但是也有一個問題,類中實現同一個功能的方法,父類和子類實現形式是不一樣的;如果單純地繼承不能做到個人化。
方法覆蓋是對父類方法在子類中重新實現;以在子類中調用該方法後直接調用子類方法而不去調用父類方法。方法覆蓋需要 存取修飾詞 + 傳回型別 +方法名 +參數列表都一樣;
總的來說方法覆蓋有兩點
1、子類方法的傳回型別,方法名,參數列表要和父類的方法在這些方面完全一樣
2、子類方法不能縮小父類方法的存取權限
Java命名規範
局部變數名(Local Variable Name)
1、局部變數名一般包含多個單詞,一般不包含動詞;第一個單詞首字母小寫 ;如myCar
2、變數名能突出變數作用,則應該突出變數類型;比如Car類型變數的引用,可以命名為car
3、數組名最好後面加 s,表示多
4、對於 boolean類型變數習慣以is開頭
成員變數(Member Variable Name)
習慣上在變數名前加 m字母表示成員變數。表示member
類名 (Class Name)
類名習慣上有一個或幾個單片語成,每個單詞的首字母都大寫
方法名 (method Name)
方法名表示該方法的功能,一般以動詞開頭,第一個單詞的首字母小寫:
參數名(parameter Name)
參數命名規則和局部變數命名規則差不多,但是為了區分一個變數是不是參數,可以給參數名前面加上一個p首碼,這個p代表parameter
包名(package Name)
包名一般是小寫
包名一般用一個單詞構成,它的全限定名應該可以表達包中類的作用,例如common包最好放在叫car包中,這樣全限定名car.common就能夠表示出common包存放的是普通汽車類
抽象類別和介面
抽象類別:解決父類方法的不確定性,比如父類的一個方法執行個體,但是子類對該方法又有不一樣的實現方式,需要方法覆蓋了。那麼父類的該方法就永遠也不會調用。這時候我們可以用abstract修飾父類方法,那麼這個方法就是抽象方法;如果用abstract修飾該類,那麼該類就叫抽象類別。
抽象類別是java裡面比較重要的類,
注意事項
1、用abstract修飾的類那麼該類就是抽象類別
2、用abstract修飾的方法,那麼這個方法就是一個抽象方法,這個抽象方法的實現必須在子類裡面實現,不能在父類定義抽象方法進行方法實現。同時必須實現。
3、抽象方法在實際編程中用的不多,但是面試問的較多:
4、抽象類別不能執行個體化
Animal a =new Animal(); //這樣是錯的
5、抽象類別可以有沒有用abstract修飾的方法
6、一旦類包含了用abstract修飾符修飾了方法,則這個類必須聲明為abstract類
7、 抽象類別裡面的抽象方法不能有主體:比如
abstract public void cry() {}
這樣是錯誤的。
當一個類繼承的父類是抽象類別的話,那麼需要我們將父類裡面的所有抽象方法全部實現
abstract class Animal{ String name; int age; abstract public void cry();}class Cat extends Animal{ public void cry() { }}
介面:
先舉例說明:
現實生活中的usb介面插槽:我們不用擔心任何一個裝置的usb介面和電腦連不上,因為usb插槽裝置廠商和外設裝置廠商遵守了一個共同的協議,比如usb尺寸,排線等;但是裝置內部又是不一樣。
使用背景:java是單繼承的物件導向程式設計語言,而類實現介面編程可以實現多個介面,這在一定程度上呢彌補了類擴充的局限。
定義:
介面就是給出一些沒有內容的方法,封裝在一起,到某個類要使用的時候,然後再根據具體情況把這些方法實現出來。
文法:
class 類名 implements 介面{ 實現所有介面方法; 變數;}
一個重要的原則:是當一個類實現了一個介面,就要求該類實現這個介面的所有方法,
小結:介面是相比抽象類別是更抽象的類,抽象類別可以有方法體(比如沒有用abstract修飾的方法有方法體),但是介面的所有方法都沒有方法體,介面實現了程式設計的多態和高內聚和低耦合的設計思想。
介面的注意事項
介面不能執行個體化;如Usb usb = new Usb();所有這些對介面執行個體化都是錯誤的,因為介面是一些沒有內容的方法的封裝。
介面中所有的方法都不能有方法主體,比如這樣的 public void KK() { } 這些都是錯的。
一個類可以實現多個介面,
介面中可以使用變數,關於介面中的變數有兩點需要說明:、
介面中的變數本質上都是static的,
在java實際開發中,經常把用到的變數定義在介面中,作為全域變數使用。訪問形式:介面名.變數名
一個介面不能繼承類,但是可以繼承其他的介面
抽象類別和介面對比
不同:
抽象類別可以有函數主體 的方法,但是如果方法用abstract修飾了的話,那麼不能有方法體。
介面中所有的都不能有實現的主體,
相同:
用abstract修飾的方法,以及介面裡面的方法必須在子類或者實現介面類中實現
繼承和實現介面對比
java裡面是單繼承的,也就是說一個類只能繼承一個父類,這樣的機制可以保證類的純潔性,比C++裡面的多繼承機制簡單,問題就是對子類功能擴充有一定影響;但是實現介面是可以實現多個介面的,一定程度是彌補了子類擴充的缺陷。
還有一點是繼承是層級式的,倘若類1發生變化,那麼類1下面的其他類都將受到影響,而介面可以避免這個問題,因為介面只對實現介面的類有作用,當然如果實現介面的類被其他子類繼承了,那麼實現介面類實現的介面方法在子類也是可以用的。比如在類1我實現了一個介面,那麼類 2 3 4 5 都可以我類1實現的介面類方法;
final
final可以修飾變數和方法
使用final修飾的變數,必須在建立/聲明的時候賦初值,並且是確定的;賦值後不能在更改。
對於用final修飾的參考型別變數,java也是要求必須在聲明時給予初始值。
final修飾的變數叫常量,final變數名命名
XXX_XXX_ZZZ
可能使用情境
當不希望父類的某個方法被子類覆蓋時候,用final修飾該方法
當不希望類中變數被修改,用final修飾,同時必須初始化
當不希望該類被繼承 final class Akk{ }
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
java類的認識