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{ }