Java-面向对象进阶2
目錄
一、包
二、權限修飾符
三、final
四、常量
1.常量概述和基本作用
2.常量做信息標志和分類
五、枚舉
1.枚舉的概述
2.枚舉的使用場景演示
六、抽象類
1.抽象類
2.抽象類的應用案例
3.抽象類的特征、注意事項
4.抽象類的應用知識:模板方法模式
?七、接口
1.接口概述、特點
2.接口的基本使用: 被實現
3.接口與接口的關系:多繼承
4.JDK8開始接口新增方法
5.使用接口的注意事項
一、包
什么是包:包是用來分門別類的管理各種不同類的,類似于文件夾、建包利于程序的管理和維護
建包的語法格式:package 公司域名倒寫.技術名稱。包名建議全部英文小寫,且具備意義
導包:相同包下的類可以直接訪問,,不同包下的類必須導包,才可以使用。
導包格式:import 包名.類名
如果這個類中使用不同包下的相同類名,此時默認只能導入一個類的包,另外一個類要使用全名訪問
二、權限修飾符
什么是權限修飾符:用來控制一個成員能被訪問的范圍
可以修飾成員變量,方法,構造器,內部類,不同的權限修飾符修飾的成員能被訪問的范圍會受到限制
權限修飾符的分類和具體作用范圍:四種作用范圍又小到大:private->缺省->protected->public?
自己定義成員(成員變量、方法、構造器)一般需要滿足:1.成員變量一般私有;2.方法一般公開;3.如果該成員只希望本類訪問,使用private修飾;4.如果該成員只希望本類,同一個包下的其他類和子類訪問,使用protected修飾
package com.pikaqiu.d2_modifier;public class Fu {/*** 1.定義私有成員:private 只能本類中訪問*/private void privateMethod(){System.out.println("===private===");}/*** 2.定義缺省修飾的成員:只能本類中、同包下其他類訪問(包訪問權限)*/void method(){System.out.println("===缺省===");}/*** 3.定義protected成員:protected 本類、同包的其他類中、其他包的子類中都可以訪問*/protected void protectedMethod(){System.out.println("===protected===");}/*** 4.定義公共成員:public 本類、同包的其他類中、其他包的子類中、其他包的無關類中都可以訪問*/public void publicMethod(){System.out.println("===public===");}public static void main(String[] args) {Fu f = new Fu();f.privateMethod();f.method();f.protectedMethod();f.publicMethod();} }package com.pikaqiu.d2_modifier;public class Test {public static void main(String[] args) {Fu f = new Fu();//f.privateMethod(); //報錯,非本類私有的無法訪問f.method();f.protectedMethod();f.publicMethod();} }package com.pikaqiu.d2_modifier.picast;import com.pikaqiu.d2_modifier.Fu;public class Test2 {public static void main(String[] args) {Fu f = new Fu();//f.privateMethod(); //報錯,非本類私有的無法訪問//f.method(); //報錯,非本類,不同包無法訪問//f.protectedMethod(); //報錯,非本類、不同包的其他類中、也不是其他包的子類f.publicMethod();} }package com.pikaqiu.d2_modifier.picast;import com.pikaqiu.d2_modifier.Fu;public class Zi extends Fu {public static void main(String[] args) {Zi z = new Zi();z.protectedMethod();z.publicMethod();Fu f = new Fu();//f.protectedMethod();f.publicMethod();} }三、final
final關鍵字是最終的意思,可以修飾(類、方法、變量)
修飾類:表明該類是最終類,不能被繼承;
修飾方法:表明該方法是最終方法,不能被重寫;
修飾變量:表示該變量第一次賦值后,不能再次被賦值(有且僅能被賦值一次)
注意:1.final修飾的變量是基本類型,那么變量存儲的數據值不能發生改變;2.final修飾的變量是引用類型,那么變量存儲的地址值不能發生改變,但是地址指向的對象內容是可以改變的
package com.pikaqiu.d3_final;public class Test {public static void main(String[] args) {//1.修飾類:表明該類是最終類,不能被繼承//2.修飾方法:表明該方法是最終方法,不能被重寫} }class Student extends People{ // @Override // public void eat(){ // System.out.println("學生吃的很多"); // } }class People{public final void eat(){System.out.println("人都要吃東西");} }//final class Animal{ // //} // //class Wolf extends Animal{ // //}package com.pikaqiu.d3_final;public class Test2 {//靜態成員變量(public static final修飾的也稱為常量)public static final String SchoolName = "洛克王國";//實例成員變量(幾乎不用)private final String name = "張三";public static void main(String[] args) {//3.修飾變量:表示該變量第一次賦值后,不能再次被賦值(有且僅能被賦值一次)//變量有兩種:1.局部變量;2.成員變量--實例成員變量和靜態成員變量//局部變量final double rate = 3.14;//rate = 3.19; //錯誤,不能二次賦值buy(0.8);//SchoolName = "hhh"; //錯誤,不能第二次賦值Test2 t = new Test2();System.out.println(t.name);//t.name = "李四"; 錯誤,不能二次賦值//注意:final修飾的變量是引用類型,那么變量存儲的地址值不能發生改變,但是地址指向的對象內容是可以改變的final Teacher t2 = new Teacher("學習");//t2 = null;System.out.println(t2.getHobby());t2.setHobby("運動");System.out.println(t2.getHobby());}public static void buy(final double z){//z = 0.1; //錯誤,形參傳入時已經賦值了} }class Teacher{private String hobby;public Teacher() {}public Teacher(String hobby) {this.hobby = hobby;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;} }四、常量
1.常量概述和基本作用
常量是使用了public static final修飾的成員變量,必須有初始化值,而且執行的過程中其值不能被改變
常量的作用和好處:可以用于做系統的配置信息,方便程序的維護,同時也能提高可讀性
常量的命名規范:英文單詞全部大寫,多個單詞下劃線連接起來
常量的執行原理:1.在編譯階段會進行宏替換,把使用常量的地方全部替換成真實的字面量;2.這樣做的好處是讓使用常量的程序的執行性能與直接使用字面量是一樣的
2.常量做信息標志和分類
好處:代碼可讀性好,實現了軟編碼形式
五、枚舉
1.枚舉的概述
枚舉是Java中的一種特殊類型
枚舉的作用:是為了做信息的標志和信息的分類
定義枚舉的格式:修飾符 enum 枚舉名稱{第一行都是羅列枚舉類實例的名稱}
枚舉的特征:1.枚舉類都是繼承了枚舉類型:java.lang.Enum;2.枚舉都是最終類,不可以被繼承;3.枚舉類的構造器都是私有的,枚舉對外不能創建對象;4.枚舉的第一行默認都是羅列枚舉對象的名稱的;5.枚舉類相當于是多例模式
2.枚舉的使用場景演示
選擇常量做信息標志和分類:雖然可以實現可讀性,但是入參值不受約束,代碼相對不夠嚴謹
枚舉做信息標志和分類:代碼可讀性好,入參約束嚴謹,代碼優雅,是最好的信息分類技術,建議使用
六、抽象類
1.抽象類
在Java中abstract是抽象的意思,可以修飾類、成員方法
abstract修飾類,這個類就是抽象類;abstract修飾方法,這個方法就是抽象方法
注意事項:1.抽象方法只有方法簽名,不能聲明方法體;2.一個類中如果定義了抽象方法,這個類必須聲明成抽象類
抽象類的使用場景:1.抽象類可以理解成不完整的設計圖,一般作為父類,讓子類來繼承;2.當父類知道子類一定要完成某些行為,但是每個子類該行為的實現又不同,于是該父類就把該行為定義成抽象方法的形式,具體實現交給子類去完成,此時這個類就可以聲明為抽象類
繼承抽象類需要注意:一個類如果繼承了抽象類,那么這個類必須重寫完抽象類的全部抽象方法,否則這個類也必須定義成抽象類
package com.pikaqiu.d6_abstract;//抽象類 public abstract class Animal {//抽象方法,不能寫方法體代碼public abstract void run(); }package com.pikaqiu.d6_abstract;public class Dog extends Animal{@Overridepublic void run() {System.out.println("狗跑的很快~~~");} }package com.pikaqiu.d6_abstract;public class Test {public static void main(String[] args) {Dog d = new Dog();d.run();} }2.抽象類的應用案例
package com.pikaqiu.d7_abstract_test;public abstract class Card {private String userName;private double money;//定義一個支付方法,表示卡片可以支付(抽象方法)public abstract void pay(double money2);public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;} }package com.pikaqiu.d7_abstract_test;public class GoldCard extends Card{@Overridepublic void pay(double money2) {System.out.println("您當前消費:" + money2);System.out.println("您卡片當前余額:" + getMoney());double rs = money2 * 0.8;System.out.println("您實際支付:" + rs);//更新余額setMoney(getMoney() - rs);System.out.println("支付后的余額:" + getMoney());} }package com.pikaqiu.d7_abstract_test;public class SilverCard extends Card{@Overridepublic void pay(double money2) {System.out.println("您當前消費:" + money2);System.out.println("您卡片當前余額:" + getMoney());double rs = money2 * 0.85;System.out.println("您實際支付:" + rs);//更新余額setMoney(getMoney() - rs);System.out.println("支付后的余額:" + getMoney());} }package com.pikaqiu.d7_abstract_test;public class Test {public static void main(String[] args) {GoldCard c = new GoldCard();c.setMoney(10000);c.setUserName("皮卡丘");c.pay(300);System.out.println("------------------");SilverCard s = new SilverCard();s.setMoney(5000);s.setUserName("妙蛙種子");s.pay(300);} }3.抽象類的特征、注意事項
1.類有的成員(成員變量、方法、構造器)抽象類都具備
2.抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類
3.一個類如果繼承了抽象類,那么這個類必須重寫完抽象類的全部抽象方法,否則這個類也必須定義成抽象類
4.不能用abstract修飾變量、代碼塊、構造器
最重要的特征:得到了抽象方法,失去了創建對象的能力
抽象類為什么不能創建對象:假設抽象類可以創建對象,但是當該對象調用方法時,該方法連方法體都沒有,很顯然是矛盾的。而且java是很嚴謹的,不完整的設計圖實例化就可能出現問題,為了避免問題,索性直接規定死。
final和abstract是什么關系:互斥關系。abstract定義的抽象類作為模板讓子類繼承,否則沒有意義,final定義的類不能被繼承;抽象方法定義通用功能讓子類重寫,final定義的方法子類不能重寫
4.抽象類的應用知識:模板方法模式
使用場景說明:當系統中出現同一個功能多處在開發,而功能中大部分代碼是一樣的,只有其中部分可能不同的時候
模板方法模式實現步驟:1.把功能定義成一個所謂的模板方法,放在抽象類中,模板方法中只定義通用且確定的代碼;2.模板方法中不能決定的功能定義成抽象方法讓具體子類去實現
模板方法建議使用final修飾:模板方法是給子類直接使用的,不是讓子類重寫的,一旦子類重寫了模板方法,則模板方法就失效了,因此,加上final后可以防止子類重寫了模板方法,這樣更安全、專業。
package com.pikaqiu.d9_abstract_template;public abstract class Student {//聲明模板方法public final void write(){//標題System.out.println("《童年》");//開頭System.out.println("池塘邊的榕樹上");//正文部分(每個子類都要寫,但是每個子類的寫情況不一樣)System.out.println(writeMain());//結尾System.out.println("盼望長大的童年");}public abstract String writeMain(); }package com.pikaqiu.d9_abstract_template;public class StudentChild extends Student{@Overridepublic String writeMain() {return "操場邊的秋千上,還有蝴蝶停在上面";} }package com.pikaqiu.d9_abstract_template;public class StudentMiddle extends Student{@Overridepublic String writeMain() {return "只有知了聲聲叫著夏天";} }package com.pikaqiu.d9_abstract_template;public class Test {public static void main(String[] args) {StudentMiddle s1 = new StudentMiddle();s1.write();System.out.println("--------------------------");StudentChild s2 = new StudentChild();s2.write();} }?七、接口
1.接口概述、特點
接口的格式如下:public interface 接口名{//常量 //抽象方法}
什么是接口:接口是一種規范
package com.pikaqiu.d10_interface;/*** 聲明一個接口:體現一種規范,規范一定是公開的*/ public interface InterfaceDemo {//1.常量//注意:由于接口體現規范思想,規范默認都是公開的,所以代碼層面,public static final可以省略不寫String SCHOOL_NAME = "妖怪學院";//public static final String SCHOOL_NAME = "妖怪學院";//2.抽象方法//注意:由于接口體現規范思想,規范默認都是公開的,所以代碼層面,public abstract可以省略不寫void run();//public abstract void run();void eat();//public abstract void eat(); }2.接口的基本使用: 被實現
接口的用法:接口是用來被類實現的,實現接口的類稱為實現類。實現類可以理解成所謂的子類
格式:修飾符 class 實現類 implements 接口1,接口2,接口3,...{}
注意:1..接口可以被類單實現,也可以被類多實現;2.一個類實現接口,必須重寫完全部接口的全部抽象方法,否則這個類需要定義為抽象類
package com.pikaqiu.d11_implements;public interface SportMan {void run();void competition(); }package com.pikaqiu.d11_implements;public interface Law {void rule(); }package com.pikaqiu.d11_implements;public class PingPongMan implements SportMan,Law{private String name;public PingPongMan(String name){this.name = name;}@Overridepublic void run() {System.out.println(name + "必須跑步訓練");}@Overridepublic void competition() {System.out.println(name + "必須參加比賽");}@Overridepublic void rule() {System.out.println(name + "必須遵紀守法");} }package com.pikaqiu.d11_implements;public class Test {public static void main(String[] args) {PingPongMan p = new PingPongMan("張繼科");p.run();p.competition();p.rule();} }3.接口與接口的關系:多繼承
類和類的關系:單繼承;類和接口的關系:多實現;接口和接口的關系:多繼承,一個接口可以同時繼承多個接口
接口多繼承的作用:規范合并,整合多個接口為同一個接口,便于子類實現
4.JDK8開始接口新增方法
第一種:默認方法
1.類似之前寫的普通實例方法:必須用default修飾;2.默認會public修飾,需要用接口的實現類的對象來調用
第二種:靜態方法
1.默認會public修飾,必須使用static修飾;2.注意:接口的靜態方法必須使用本身的接口名來調用
第三種:私有方法
1.就是私有的實例方法:必須使用private修飾,從JDK1.9才開始有的;2.只能在本類中被其他的默認方法或者私有方法訪問
package com.pikaqiu.d13_interface_jdk8;public interface SportManInter {//1.默認方法//必須default修飾,默認public修飾//這個方法只能過繼給實現類,由實現類的對象調用default void run(){System.out.println("跑的很快~~~"); // go();}//2.靜態方法//必須使用static修飾,默認public修飾//接口的靜態方法,必須使用接口名自己調用static void inAdd(){System.out.println("學習Java新增方法的語法");}//3.私有方法//JDK1.9開始支持//必須在接口內部才能被訪問 // private void go(){ // System.out.println("開始跑~~~"); // } }class PingPongMan implements SportManInter{}class Test{public static void main(String[] args) {PingPongMan p = new PingPongMan();p.run();//p.go();SportManInter.inAdd();//PingPongMan.inAdd();} }5.使用接口的注意事項
1.接口不能創建對象(接口更加徹底的抽象);
2.一個類實現多個接口,多個接口中有同樣的靜態方法不沖突;
3.一個類繼承了父類,同時又實現了接口,父類中和接口中有同名方法,默認用父類的;
4.一個類實現了多個接口,多個接口中存在同名的默認方法,不沖突,這個類重寫該方法即可;
5.一個接口繼承多個接口,是沒有問題的,如果多個接口中存在規范沖突則不能多繼承
總結
以上是生活随笔為你收集整理的Java-面向对象进阶2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于ES查询文档标记来源问题
- 下一篇: 1321:棋盘问题