【JAVA基礎】一個案例搞懂類、物件、多載、封裝、繼承、多型、覆寫、抽象和介面概念及區別上 篇0 前言初學JAVA時,總會對一些概念一知半解,相互混淆,不明其設計的用意,如類、物件、多載、封裝、繼承、多型、覆寫、抽象類、介面概念。為便于理解和鞏固,本文將基于一個案例及其變形,展現各個概念的定義、設計用意、使用規范和注意事項。長文警告,建議先收藏后閱讀!為控制篇幅,本文將分上中下三篇講解以上概念。上篇:講解類、物件、構造器、多載和封裝概念。中篇:講解繼承、覆寫和多型概念。下篇:講解抽象和介面概念,以及一個綜合練習。1 類(Class)、物件(Object)和構造器(Constructor)1.1 案例要求設計一個矩形的面積計算器,輸入為矩形的高(height)和寬(width),輸出為矩形的面積(area)。1.2 代碼對JAVA的語法有最基本的了解后可以寫出如下代碼:class Rectangle{ //創建矩形類 public double height; //定義類的成員變數 public double width; public Rectangle() { //定義無參構造器--可省略 } public void calcuArea() { //定義類的方法--面積計算 System.out.println("面積為:"+height*width); }}public class Test{ public static void main(String[] args) { Rectangle rec=new Rectangle(); //創建矩形物件--呼叫構造器 rec.height=1; //高度賦值 rec.width=2; //寬度賦值 rec.calcuArea(); //呼叫面積計算方法 }}1.3 代碼分析以上代碼包含以下概念:1、類(Class):類是構造物件的模板或藍圖,其由成員變數和方法構成,前者記錄資料,后者記錄資料的操作程序。2、物件(Object):物件是類的實體化,一個類可以有多個物件。3、構造器(Constructor):構造器是一種特殊的方法,用于物件實體化時的初始化操作。注意:構造器總是和關鍵字“new”一起使用。構造器的方法名必須和類名一致!任意一個類都包含至少一個構造器,當沒有自定義構造器時,編譯器會自動設定為無參構造器;但如果自定義了有參構造器,并需要呼叫無參構造器時,就必須自己手動寫。構造器中,this()用于呼叫同一類中的其他構造方法;super()用于呼叫父類的構造方法。都必須位于構造方法中的第一行,且兩者不能同時存在。思考:以上代碼雖然實作了基本功能,但其功能不夠完善,比如當用戶輸入的高度和寬度為字串時,代碼就會報錯,那怎么才能在不給用戶輸入添加麻煩的情況下實作功能呢?2 多載(Overload)2.1 案例要求設計一個矩形的面積計算器,輸入為矩形的高和寬(數字或者字串輸入,假定用戶輸入的字串都是數值型字串),輸出為矩形的面積。2.2 代碼class Rectangle{ public double height; public double width; //定義無參構造器--可省略 public Rectangle() { } //定義有參構造器1 public Rectangle(double height,double width) { this.height=height; //this指代當前物件,用于區分方法中的形參 this.weight=width; } //定義有參構造器2 public Rectangle(String height,String width) { this.height=Double.valueOf(height); this.weight=Double.valueOf(width); } public void calcuArea() { System.out.println("面積為:"+height*width); }}public class Test{ public static void main(String[] args) { Rectangle rec=new Rectangle(1,2); //創建矩形物件--呼叫構造器1 rec.calcuArea(); //呼叫面積計算方法 Rectangle rec1=new Rectangle("1","2"); //創建矩形物件--呼叫構造器2 rec1.calcuArea(); //呼叫面積計算方法 }}2.3 代碼分析以上代碼包含以下概念:多載(Overload):指類中多個方法具有相同的名字,但引數型別或回傳型別不同的現象。多載的設定是為了方便用戶操作,以相同的方法名實作特定的功能,同時匹配不同的引數型別以滿足功能的擴展性和需求的多樣性。在上面的代碼中我們實作了構造器方法的多載,完美解決了用戶輸入多樣性的問題,但多載并不局限于構造器方法,它可以適用于類中的任何方法。注意:不允許方法名和引數型別相同,但回傳型別不同的情況出現,因為程式無法判斷回傳哪一個。方法的形參型別相同但順序不同也構成多載,如add(double a,int b)和add(int a,double b)。思考:以上代碼雖然解決了之前提出的問題,但是仍存在一個巨大的安全隱患,即用戶可以直接通過“rec.height”和“rec.width”對矩形的高和寬賦值,這會導致兩個我們不愿意看到的情景。一是,當用戶輸入非常規數值(比如-1)時,計算的結果是沒有意義的;二是,后期更改程式時難以維護,比如我們后期要將height的變數型別改為String型別,那么就必須更改每一處height賦值的地方(如代碼1.2)。那么,如何改進呢?3 封裝(Encapsulation)3.1 案例要求設計一個矩形的面積計算器,輸入為矩形的高和寬(數值輸入),且數值都應大于零,輸出為矩形的面積。同時要避免2.3中所述的問題。3.2 代碼class Rectangle{ private double height; //私有化實體欄位 private double width; public void setHeight(double height) { //定義更改器方法 if (height<0) { this.height =0; } else { this.height = height; } } public void setWidth(double width) { if (width<0) { this.width =0; } else { this.width = width; } } public double getHeight() { //定義訪問器方法 return height; } public double getWidth() { return width; } public void calcuArea() { System.out.println("面積為:"+height*width); }}public class Test{ public static void main(String[] args) { Rectangle rec=new Rectangle(); rec.setHeight(-1); //設定高 rec.setWidth(2); //設定寬 rec.calcuArea(); //讀取高和寬 System.out.println("高為:"+rec.getHeight()+" 寬為:"+rec.getWidth()); }}3.3 代碼分析以上代碼包含以下概念:封裝(Encapsulation):通過私有化類的成員變數,并創建相應的公有化的更改器(即設定成員變數的獨立方法,如setHeight)和訪問器(即讀取成員變數的獨立方法,如getHeight)實作對成員變數的封裝。設計用意:成員變數私有化的設計,使用戶無法通過“rec.height”和“rec.width”對矩形的高和寬賦值與讀取。更改器和訪問器公有化的設計,使用戶可以隨意呼叫,實作對成員變數的賦值與讀取。在更改器中我們可以設定數值規范,避免因用戶的錯誤輸入所帶來的問題。在后期除錯中,我們只需要改寫類的成員變數型別及相應的更改器便可,無需修改每個實體化物件的相關代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/284782.html
標籤:Java相關
上一篇:支付寶掃碼登錄
