Java基礎-OOP特性之封裝、繼承、多態、抽象

来源:http://www.cnblogs.com/qixiawentang/archive/2016/05/05/5463166.html
-Advertisement-
Play Games

全文純手打,不喜勿噴~ OOP封裝 //封裝一個類:用來管理普通人的特性和行為 //1、類的概念:人類在認識客觀世界時,發現某些事物具有共同特性,共同結構,共同行為。 // 為了方便,我們就將它們集合起來,並抽象出一個概念類管理它們,這個概念就是類。 //2、類的組成:標準類由:實例變數、構造器、設 ...


全文純手打,碼字不易,且碼且珍惜~

--------------------------------------------OOP封裝--------------------------------------------

//封裝一個類:用來管理普通人的特性和行為

//1、類的概念:人類在認識客觀世界時,發現某些事物具有共同特性,共同結構,共同行為。

//  為了方便,我們就將它們集合起來,並抽象出一個概念類管理它們,這個概念就是類。

//2、類的組成:標準類由:實例變數、構造器、設定器、訪問器和功能方法五個部分組成

//3、類的使用:先構造對象(new+構造器),再通過對象的方法來完成業務(對象名。方法名)

class Person{

  //人的屬性(域、欄位、實例變數、成員變數)

  private String name;//姓名

  private boolean sex;//ture為男,false為女

  private Date birthday;//生日

  //構造器(1、方法名和類名相同 2、沒有返回值)

  public Person(){

  }

  public Person(String name,boolean sex,Date birthday){

    this.name=name;

    this.sex=sex;

    this.birthday=birthday;

  }

  //設定器:用來為對象設置或改變屬性的值

  public void setName(String name){

    this.name=name;

  }

  public void setSex(boolean sex){

    this.sex=sex;

  }

  public void setBirthday(Date birthday){

    this.birthday=birthday;

  }

  //訪問器:用來獲取對象的屬性值

  public String getName(){

    return name;

  }

  public boolean getSex(){

    return sex;

  }

  public Date getBirthday(){

    return birthday;

  }

  //功能方法:為了完成業務而設計的方法

  //返回運算結果,實現簡單的加法運算

  public int add(int x,int y){

    return x+y;

  }

  //返回輸出信息,重寫了父類的方法,這個方法是預設且自動調用的

  public String toString(){

    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");

    String str=sdf.format(birthday);

    return "姓名:"+name+"\t性別"+(sex?"男":"女")+"\t生日"+str;

  }

}

//變數的概念:電腦記憶體中的一個存儲單元,它的值可以隨著程式的運行發生改變

//數據類型:基本類型(存儲數據本身)、引用類型(存儲指向對象的地址)

//Java Application 用來完成業務的類

public class PersonTest{

  public static void main(String[] args){

    //局部變數:方法或語句塊中定義的變數

    String name="劉德華";

    boolean sex=true;

    int age=20;

    //對象變數p1 p2

    Person p1=null;

    p1=new Person();

    person p2=new Person();

    //實現業務:加法運算

    int a=100;

    int b=200;

    int re=p1.add(a,b);

    System.out.println(a+"+"+b+"="+re);

    //實現業務:修改屬性

    p1.setName(name);

    p1.setSex(sex);

    p1.setBirthday(new Date());

    System.out.println(p1);

    //以下現實對繼承類Student的代碼的測試

    Student stu=new Student();

    re=stu.add(50,100);

    System.out.println(re);

  }

}

 

--------------------------------------------OOP繼承--------------------------------------------

//學生是一種普通人,學生有普通人派生而來,成為一種特殊的普通人

//從學生身上可以看到普通人的所有特性,也可以看到只屬於學生不屬於普通人的特性

//使用繼承,讓子類在編寫時的效率更高了,因為子類與父類分共性不用寫了

//使用繼承,讓父類分代碼極大地提高了重用性

public class Student extends Person{

  //子類的個性

  private String school;

  private int score;

  //子類的構造器

  public Student(){

  }

  public Student(String name,boolean sex,Date birthday,String school,int score){

    super(name,sex,birthday);//藉助父類的構造器

    this.school=school;

    this.score=score;

  }

  //設定器、訪問器代碼略過

  //功能方法:

  //重寫(覆蓋)父類的方法add(),大部分情況下方法頭不變

  //為什麼要重寫?因為現有的業務父類完成的不夠好,達不到我們的業務要求。

  public int add(int x,int y){//此行是方法頭

    //業務要求輸出:下麵這行信息,父類的add方法不行,所以調用子類來運算和輸出

    System.out.println("程式調用了Student類(子類)去完成加法運算");

    return x+y;

  }

}

 

--------------------------------------------OOP多態--------------------------------------------

//經典題型:不同圖形計算面積

//什麼是多態:同一類的對象   接受相同的信息   做出不同的反應

//抽象的平面圖形類,裡面含有抽象方法area();抽象類不能被實例化,但它的子類可以。

abstract class Shape{

  private String type;

  //構造器

  public Shape(){}

  public Shape(String type){

    this.type=type;

  }

  //設定器、訪問器代碼略過

  //功能方法:

  //求平面圖形的面積:由於不知道求什麼圖形,從而面積無法具體實現;所以使用抽象方法

  public abstract double area();

  //重寫父類toString()方法,來滿足現在的業務需求

  @Override

  public String toString(){

    return "圖形是:"+type;

  }

}//shape類結束

 

//子類-圓,圓是平面圖形之一

class Circle extends Shape{

  //子類的個性

  private double r;

  //圓的構造器

  public Circle(String type,double r){

    super(type);

    this.r=r;

  }

  //設定器、訪問器代碼略過

  //功能方法:

  //可以通過重寫父類代碼,來滿足新的業務需求

  @Override

  public double area(){

    return Math.PI*Math.pow(r,2);

  }

  @Override

  public String toString(){

    return super.toString+"\t 它的半徑是:"+r+" 它的面積是"+this.area();

  }

}//Circle類結束

 

//子類-矩形

class Rectangle extends Shape{

  //個性

  private int length;

  private int wide;

  //構造器

  public Rectangle(String type,int length,int wide){

    super(type);

    this.length=length;

    this.wide=wide;

  }

  //設定器、訪問器代碼略過

  //功能方法:

  public double area(){

    return length*wide;

  }

  public String toString(){

    return super.toString+",長度為:"+length+",寬度為:"+wide+",面積為"+this.area();

  }

}//Rectangle類結束

//Java Application 業務測試類、業務實現類、體現多態的類;

public class ShapeTest{

  public static void main(String[] args){

    //第一種方式:簡單的多態

    Shape s1=new Circle("圓",5.5);

    Shape s2=new Rectangle("矩形",12,30);

    s1.area();//簡單多態

    s2.area();//簡單多態

    //第二種方式:多個圖形,指定大小

    Circle c1=new Circle("圓",4.5);

    Circle c1=new Circle("圓",5.5);

    Rectangle r1=new Rectangle("矩形",12,30);

    Rectangle r1=new Rectangle("矩形",22,35);

    Shape[] s={c1,c2,r1,r2};

    for(Shape sp:s){

      System.out.println(sp);//多態

    }

    //擴展,動態綁定

    //動態綁定的前提:

    //1、多個子類來源於同一個父類

    //2、子類重寫了父類的方法

    //3、父類的對象變數指向了不同的子類對象

    //4、父類的對象變數調用了子類重寫後的方法

    int i=(int)(s.length*Math.random());

    for(Shape sp:s){

      System.out.println(s[i].toString);//動態取得圖形

    }

    //第三種方式:隨機產生隨機個隨機圖形,顯示出來,並計算它們的總面積

    int n=(int)(10*Math.random())+1;//隨機個數

    s=new Shape[n];//存放n個圖形的數組

    for(int i=0;i<s.length;i++){

      s[i]=randShape();//隨機產出圖形,並放進數組裡

    }

    double areas=totalAreas(s);//求總面積

    System.out.println("以上所有圖形的總面積是:"+areas);

  }

  public static Shape randShape(){

    int n=(int)(2*Math.random());//隨機取值0或1

    Shape sp=null;

    swith(n){

      case 0: 

        sp=new("圓",Math.round(100*Math.random()+1)/10.0;//隨機半徑,保留隨機數一位小數

        break;

      case 1:

        sp=new("矩形",Math.random()*20+1,Math.random()*50+1);//隨機長和寬

        break;

      default:

        sp=null;

    }

    return sp;

  }

  public static double totalAreas(Shape[] s){//計算總面積

    double sum=0;

    for(Shape sp:s){

      System.out.println(sp);

      sum+=sp.area();

    }

    return sum;

  }

}//ShapeTest類結束

//要習慣將程式(功能、代碼)模塊化

//OOP四大特性:封裝、繼承、多態、抽象

//OOP的核心:封裝一個類,把數據抽象出來,再把方法抽象出來,構成一個整體

//封裝:為了提高安全性、重用性

//繼承:為了提高重用性、子類生成的效率

//多態:為了實現統一管理(統一性)、高效性

//抽象:為了提高效率、簡化業務邏輯


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在開發中你是否遇到過當使用一個涉及到Cookie操作的網站或者管理系統時,IE 6、7、8、9下都跑的好好的,唯獨到了IE10、11這些高版本瀏覽器就不行了?那麼,我們就來看看,這個問題的前因後果。 先說下之前的2次使用場景: 第一次是在某頁面中,先存Cookie,然後再入庫記錄相關數據,但是發佈到 ...
  • 我們經常會在後臺定義一個變數,然後在用<%=變數名%>這種方式去獲取,但是有時候<head></head>裡面獲取變數的時候,有時候會獲取不到是怎麼回事呢 前臺: <head runat="server"> <%=test%> </head> 後臺: public partial class Org ...
  • 我 們知道並行編程模型兩種:一種是基於消息式的,第二種是基於共用記憶體式的。 前段時間項目中遇到了第二種 使用多線程開發並行程式共用資源的問題 ,今天以實際案例出發對.net里的共用記憶體式的線程同步機製做個總結,由於某些類庫的應用屬於基礎,所以本次不對基本使用做出講解,基本使用 MSDN是最好的教程。 ...
  • 用 Entity Framework 進行 增,刪,改。都是基於Model進行的,且Model都是有狀態追蹤的。這樣Entity Framework才能正常增,刪,改。 有時候,要根據某個欄位,批量更新或者刪除數據,用Entity Framework就會顯得很是繁瑣,且不高效。 Entity Fra ...
  • UDP特點: 面向無連接,把數據打包發過去,收不收得到我不管 數據大小有限制,一次不能超過64k,可以分成多個包 這是個不可靠的協議 速度很快 視頻直播,凌波客戶端,feiQ都是UDP協議 TCP特點: 面向連接,對方必須在 三次握手完成連接,我:在嗎;你:我在;我:我知道了 大數據量傳輸 速度稍慢 ...
  • 網路通信的步驟, 1.找到對方的ip 2.數據發送到對方指定的應用程式上,為了標識這些應用程式,用數字進行標識,這個數字就是埠 3.定義通信規則,這個規則就稱為協議 國際組織定義了通用協議 TCP/IP 網路模型 OSI參考模型 網路分成7層,應用層 ==> 表示層 ==> 會話層 ==> 傳輸層 ...
  • 今天我們來介紹一下C語言操作資料庫的方法,這裡我們使用的是ODBC方式。環境是WIN7+VC6。其他環境也差不多,具體情況具體分析。 首先是環境的配置以及數據源的添加。這裡就不去解釋了,相關資料網上有很多。需要註意的是這裡不可以直接使用控制面板中的ODBC,我們需要打開C:\Windows\SysW ...
  • import java.util.ArrayList;import java.util.Scanner; /* * 題目描述: * 讀入數據string[ ],然後讀入一個短字元串。要求查找string[ ]中和短字元串的所有匹配,輸出行號、匹配字元串。 * 匹配時不區分大小寫,並且可以有一個用中括 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...