定義類: 訪問修飾符 class 類名{ } 訪問修飾符如:public 、priate是可選的 class是聲明類的關鍵字 按照命名規範,類名首字母大寫 例:創建“人”類,關鍵代碼: public class Person{ } ********************************** ...
定義類: 訪問修飾符 class 類名{ } 訪問修飾符如:public 、priate是可選的 class是聲明類的關鍵字 按照命名規範,類名首字母大寫 例:創建“人”類,關鍵代碼: public class Person{ } ********************************************************** 定義屬性: 訪問修飾符 數據類型 屬性名; 訪問修飾符士可選的 除了訪問修飾符之外,其他的語法和聲明變數是一致的 例:創建“人”類,名為“人”類添加相應屬性,關鍵代碼: public class Person{ public String name; public String gender; public int age; } ********************************************************** 定義方法: 訪問修飾符 返回類型 方法名稱(參數類型 參數名1,參數類型 參數名2,……){ } 訪問修飾符是可選的 返回類型可以是void,在定義方法時,返回類型為void時,表明沒有返回值,方法體中不必使用“return”關鍵字返回具體數據,但是可以使用“return”關鍵字退出方法 返回類型不為“void”,那麼在方法體中一定要使用“return”關鍵字返回對應類型的結果,否則程式會有編譯錯誤 小括弧中的“參數類型 參數名1,參數類型 參數名2,……”稱為參數列表 當需要在方法執行的時候為方法傳遞參數時才需要參數列表,如果不需要傳遞參數時就可以省略,不過小括弧不可以省略,傳遞多個參數時,以半形的括弧進行分隔 例:在“人”類中定義方法,描述人工作的行為,關鍵代碼: public class Person{ public String name; public String gender; public int age; public void work( ){ System.out.println(this.name+"的工作理念:為夢想而努力奮鬥); } } ********************************************************** 創建和使用對象: 1、創建對象 類名 對象名 = new 類名(); new 是關鍵字 左邊的類名為對象的數據類型 右邊的類名()稱為類的構造方法 例:創建Person類的對象,關鍵代碼: Person lilei = new Person( ); 2、使用對象 對象名 . 屬性 //引用對象的屬性 對象名 . 方法名 //引用對象的方法 例:對象屬性賦值並調用方法 public static void main(String[] args){ Person lilei = new Person( ); lilei.name = "李雷"; lilei.gender = "男"; lilei.age = 22; lilei.work( ); } ********************************************************** 成員方法: 1、帶參數的方法 創建work()方法時定義的參數叫做形式參數,簡稱形參。調用方法時傳入的參數叫做實際參數,簡稱實參。 2、方法重載: 方法名相同,參數列表不同,就形成了方法重載 特點:在同一個類中,方法名相同,參數的個數或類型不同 ********************************************************** 成員變數: 1、成員變數:類中的屬性,直接在類中定義的變數,定義在方法的外部。PS:成員變數可以在聲明時賦初始值,如果沒有賦值,java會給它一個預設值,基本數據類型的值為0,引用類型的值為null 2、局部變數:定義在方法中的變數,一般情況下,在使用前需要賦值,否則會編譯出錯 ********************************************************** 構造方法: 主要作用是進行一些數據的初始化 訪問修飾符 方法名(參數列表){方法體} 構造方法沒有返回值 預設構造方法沒有參數,因此參數列表可選(預設構造無參方法的快捷鍵:Alt+/) 構造方法的方法名與類名相同 如果寫了帶參的構造方法,必須要生成一個無參的構造方法 例:為Person類定義一個構造方法,關鍵代碼: public class Person{ public Person(){ this.name = "李雷"; } } 在一個類中可以定義多個重載的構造方法 this關鍵字是對一個對象的預設引用,每個實例方法內部,都有一個this引用變數,指向調用這個方法的對象 因為this是在對象內部指代自身的引用,所以this只能調用實例變數、實例方法和構造方法。this不能調用類變數和類方法,this也不能調用局部變數。 1)使用this調用成員變數,解決成員變數和局部變數的同名衝突。 2)使用this調用成員方法 3)使用this調用重載的構造方法,只能在構造方法中使用,且必須是構造方法第一條語句 例: public Penguin(String name,String sex){ this.name = name; this.sex = sex; } public Penguin(String name, int health, int love, String sex){ this(name,sex); this.health = health; this.love = love; } ********************************************************** 封裝的步驟: 封裝: 用OOP方式完成變數的聲明、賦值、使用 完成2次(聲明、賦值、使用):1、封裝的類 聲明 賦值 使用 2、封裝類裡面屬性的聲明 賦值 使用 1、修改屬性的可見性 將Person類中的屬性由public修改為private即可。 例:請將Person類的屬性私有化,關鍵代碼: public class Person{ private String name; private String gender; private int age; } 2、設置setter/getter()方法 例:請為Person類中的私有屬性添加setter/getter()方法,關鍵代碼: public class PrivatePerson{ private String name; private String gender; private int age; public String getName(){ return name; } public void setName(String name){ this.name = name; } public String getGender(){ return gender; } public void setGender(String gender){ this.gender = gender; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } } 3、設置屬性的存取限制 此時,屬性仍然沒有限製作用,需要進一步利用條件判斷語句進行限制 例見myeclipse -->practise-->SetPerson ********************************************************** 定義包: package 包名 package是關鍵字 報的聲明必須是java源文件中的第一條非註釋性語句,而且一個源文件只能有一個包聲明語句,設計的包需要與文件系統結構相對應。因此,在命名包時,要遵守以下編碼規範: a、一個唯一的包名首碼通常是全部小寫的ASCII字母,並且是一個頂級功能變數名稱com、edu、gov、net、及org,通常使用組織的網路功能變數名稱的逆序。例如,如果功能變數名稱為javagroup.net,可以聲明包名為“pacage net.javagroup.mypackage" b、包名的後續部分依不同機構各自內部的規範不同而不同。這類命名規範可能以特定目錄名的組成來區分部門、項目、機器或註冊名,如“package net.javagroup.research.powerproject" ********************************************************** 包的使用: 包從大到小寫:網址倒過來 1、聲明包的含義是聲明當前類所處的位置 2、導入包的含義是聲明在當前類中要使用到的其他類所處的位置 //講Person類放入pack1包中 package cn.bdqn.pack1; public class Person{ ……省略代碼 } //將PersonTest類放入pack2包中 //使用Person類時,需要使用import將其導入 package cn.bdqn.pack2; import cn.bdqn.pack1.Person; public class PersonTest{ public static void main(String[] atgs){ ……省略代碼 } } ********************************************************** 類成員的訪問修飾符: 作用域: 同一個類中 同一個包中 子類 任何地方 private 可以 不可以 不可以 不可以 預設修飾符 可以 可以 不可以 不可以 protected 可以 可以 可以 不可以 public 可以 可以 可以 可以 ********************************************************** static關鍵字的修飾屬性: static修飾的屬性稱為靜態變數或者類變數,沒有使用static修飾的屬性稱為實例變數。 例:將Person類的name、gender和age屬性保留,新建一個static修飾的屬性,並調用 ,關鍵代碼: public Person{ public String name; public String gender; public static int age; public static int PERSON_LIVE; //……省略代碼 } //以上為Person類代碼,以下為調用代碼 //……省略代碼 Person hanbing = new Person(); hanbing.name = "韓冰"; hanbing.gender = "女"; hanbing.age = 22; Person.PERSON_LIVE = 1; 實際開發中,static關鍵字修飾屬性的最常用場景就是定義使用final關鍵字修飾的常量。使用final關鍵字修飾常量在整個程式運行時都不能被改變,和具體的對象沒有關係,因此使用static修飾, 如“static final int PERSON_LIVE=1" PS: 1、常量名一般由大寫字母組成 2、聲明常量時一定要賦初值 ********************************************************** static關鍵字的修飾方法: static修飾的方法稱為靜態方法或者類方法,不用static關鍵字修改的方法稱為實例方法。 例:將Person中的showDetails()方法使用static關鍵字修飾,並調用 ,關鍵代碼: public Person{ public String name; public String gender; public static int age; public static void showDetails(String name,String gender,int age){ System.out.println("姓名是:"+name+",性別為:"+gender+",年齡是:"+age); } } //以上為Person類代碼,以下為調用代碼 public class PersonTest{ public static void main(String[] args){ Person liudun = new Person(); Person.showDetails("劉頓","男",23); } } 1、在靜態方法中不能直接訪問實例變數和實例方法。 2、在實例方法中可以直接調用類中定義的靜態變數和靜態方法 ********************************************************** 4種基本行為: 1)訪問修飾符:公共的 私有的 受保護的 預設的 2)返回類型: 有:變數的定義 數據類型 變數名 沒有:void 3)方法名:和類名的規範類似 a、方法名首字母小寫 b、方法名由多個單片語成,從第二個單詞開始,首字母大寫 c、方法名要有意義 4)參數: 有:變數的聲明部分(boolean flag) 沒有:() 5)方法體:作用域{ } a、併列:多個方法可以併列 b、嵌套:方法不能嵌套;可以嵌套流程式控制制 {if ( ) { }} 第一種基本行為:訪問修飾符 沒有返回類型 方法名(沒有){ } 例:public void add( ){ } 第二種基本行為:訪問修飾符 沒有返回類型 方法名(有){ } 例:public void add (int num1,int num2){ } 1、變數聲明的過程:形參 形式上的參數 2、變數賦值的過程:實參 實際上的參數 第三種基本行為:訪問修飾符 有返回類型 方法名(沒有){ } 例:public int add( ){ } 1、關鍵字:return 後面寫的是變數名,返回類型位置寫的是變數的數據類型 2、return後面不能再寫代碼了 第四種基本行為:訪問修飾符 有返回類型 方法名(有){ } 把第二種和第三種合在一起 例:public int add(int num1,int num2){ } ********************************************************** 繼承的語法: 訪問修飾符 class <SubClass> extends <SuperClass>{ } 在java中,繼承通過extends關鍵字實現,其中SubClass稱為子類,SuperClass稱為父類或基類。 訪問修飾符如果是public,那麼該類在整個項目可見。 不寫訪問修飾符,則該類只在當前包可見。 在java中,子類可以從父類中繼承以下內容: 可以繼承public和protected修飾的屬性和方法,不論子類和父類是否在同一個包里 可以繼承預設訪問修飾符修飾的屬性和方法,但是子類和父類必須在同一個包里 無法繼承父類的構造方法 ********************************************************** super使用的語法: 訪問父類構造方法:super(參數) 訪問父類屬性/方法:super.<父類屬性/方法> super只能出現在子類(子類的方法和構造方法)中,而不是其他位置 super用於訪問父類的成員,如父類的屬性、方法、構造方法。 具有訪問許可權的限制,如無法通過super訪問private ********************************************************** 實例化子類對象: 在java中,一個類的構造方法在如下兩種情況中總是會執行: 1、創建該類的對象(實例化) 2、創建該類的子類的對象(子類的實例化) 因此,子類在實例化時,會首先執行其父類的構造方法,然後才執行子類的構造方法。 子類繼承父類時構造方法的調用規則如下: 1、如果子類的構造方法中沒有通過super顯示調用父類的有參構造方法,也沒有通過this顯示調用自身的其他構造方法,則系統會預設先調用父類的無參構造方法。在這種情況下,是否寫super()語句,效果是一樣的。 2、如果子類的構造方法中通過super顯示調用父類的有參構造方法,那麼將執行父類相應的構造方法,而不執行父類無參構造方法。 3、如果子類的構造方法中通過this顯示調用自身的其他構造方法,在相應構造方法中應用以上兩條規則 如果存在多級繼承關係,在創建一個子類對象時,以上規則會多次向更高一級父類應用,一直到執行頂級父類Object類的無參構造方法為止。 ********************************************************** Object類: Object類是所有類的父類。在java中,所有java類都直接或間接的繼承了java.lang.Object類 關鍵代碼: public class Person{ } //兩種寫法等價 public class Person extends Object{ } ********************************************************** Object類的部分方法 方法 說明 toString() 返回當前對象本身的有關信息,按字元串對象返回 equals() 比較兩個對象是否是同一個對象,若是,返回true clone() 生成當前對象的一個副本,並返回 hashCode() 返回該對象的哈希代碼值 getClass() 獲取當前對象所屬的類信息,返回Class對象 ********************************************************** 方法重寫和方法重載的區別: 比較項 位置 方法名 參數表 返回值 訪問修飾符 方法重寫 子類 相同 相同 相同或是其子類 不能比父類更嚴格 方法重載 同類 相同 不相同 無關 無關 ********************************************************** 多態: 例:寵物類Pet,有幾個子類,寵物類定義了看病的方法toHospital(),子類分別重寫看病方法,關鍵代碼: class Pet{ public void toHospital(){ system.out.println(“寵物看病!”) } } class Dog extends Pet{ public void toHostipal(){ system.out.println(“小鳥看病”) } } public class Test{ public static void main(String[] args){ Pet pet; pet = new Dog(); pet.toHospital(); pet = new Bird(); pet.toHospital(); } } 示例中,Pet類一般聲明為抽象方法,因為其本身實例化沒有任何意義,toHopital()方法聲明為抽象類。 抽象類不能被實例化 子類如果不是抽象類,則必須重寫抽象類中的全部抽象方法 abstract修飾符不能和final修飾符一起使用 abstract修飾的抽象方法沒有方法體 private關鍵字不能修飾抽象方法 ********************************************************** 抽象方法: 抽象方法沒有方法體 抽象方法必須在抽象類里 抽象方法必須在子類中被實現,除非子類是抽象類 ********************************************************** 向上轉型的語法: 子類到父類的轉換稱為向上轉型 <父類型><引用變數名> = new <子類型>(); 將一個父類的引用指向一個子類對象,稱為向上轉型,自動進行類型轉換 此時通過父類引用變數調用的方法時子類覆蓋或繼承父類的方法,不是父類的方法 此時通過父類引用變數無法調用子類特有的方法 ********************************************************** 向下轉型的語法: <子類型><引用變數名> = (<子類型>)<父類型的引用變數> ********************************************************** instanceof運算符: 用於判斷一個對象是否屬於一個類 在向下轉型的過程中,如果沒有轉換為真實子類類型,會出現類型轉換異常 例:判斷寵物類型,關鍵代碼: public class Test{ public static void main(String[] args){ Pet pet = new Bird(); pet.toHospital(); if(pet instanceof Dog){ Dog dog = (Dog) pet; dog.catchingFlyDisc(); }else if(pet instanceof Bird){ Bird biird = (Bird) pet; bird.fly(); } } } 使用instanceof時,對象的類型必須和instanceof後面的參數所指定的類在繼承上有上下級關係,否則會出現編譯錯誤。 ********************************************************** 多態的應用: 1、使用父類作為方法的形參 例:一個主人類,在該類中定義控制動物叫的方法。 關鍵代碼: class Host{ public void letCry(Animal animal){ animal.cry(); } } public class Test{ public static void main (String[] args){ Host host = new Host; Animal animal; animal = new Dog(); host.letCry(animal); animal = new Cat(); host.letCry(animal); animal = new Duck(); host.letCry(animal); } } 2、使用父類作為方法的返回值 使用父類作為方法的返回值,也是Java中實現和使用多態的主要方式 例:主人送出三種動物,送出的動物可以叫。 關鍵代碼: class Host{ public Animal donateAnimal(String type){ Animal animal; if(type=="dog"){ animal = new Dog(); }else if(type=="cat"){ animal = new Cat(); }else{ animal = new Duck(); } return animal; } } public class Test{ public static void main(String[] args){ Host host = new Host; Animal animal; animal = host.donateAnimal("dog"); animal.cry(); animal = host.donateAnimal("cat"); animal.cry(); } }