JAVA面向物件程式設計——描述一個人類(有姓名、年齡、生日等屬性),並繼承出子類
阿新 • • 發佈:2018-12-18
前言: 面向物件這個概念在很多語言中都有接觸過,尤其在c++中這個概念就是整個語言的核心。那什麼是面向物件?也許我們對它都有個似懂非懂的概念,但無法完全清晰的理解。本文先大概描述面向物件的概念,再通過一個例子來和大家一起認識學習java面向物件。
一、面向物件概述
面向物件是一種使用封裝、繼承、多型、抽象等思想進行軟體的分析和開發的方法,而java就是一門面向物件程式設計的語言。
1. 物件和類
要了解物件要先知道類,引用一句書本的概念:類用於描述客觀世界裡某一類物件的共同特徵,而物件則是類的具體存在。
- 物件用計算機語言對問題域中事物的描述,物件通過“屬性(attribute)”和”方法
- 屬性用於描述物件靜態特性(結構特性)的一個數據項。如描述一個人可用姓名、年齡、身份證號等屬性。
- 方法用於描述物件動態特性(行為特性)的一個操作系列。如每個人都具有學習、睡覺等行為特性。
- 類是用於描述同一型別的物件的一個抽象概念,類中定義了這一類物件所因具有的靜態和動態屬性。類可以看成一類物件的模板,物件可以看成該類的一個具體例項。
總之,把一類事物的靜態屬性和動態可以執行的操作組合在一起所得到的這個概念就是類 ,類的一個個體就是物件,物件是具體的,實實在在的事物 。
2. 面向物件的三大特徵
- 封裝 封裝就是將實體的屬性和行為包裝成一個具體的物件,並控制在程式中對其屬性的讀取、修改。並僅對外公開介面也就是方法,以隱藏物件的屬性和實現細節的目的。
- 繼承 繼承就是從已有的類和介面中派生出一個新的類和介面,並根據繼承規則能從父類和介面中吸收一些屬性和行為作為己用,還可以能通過自定義一些自己的屬性和方法來擴充套件新的能力。
- 多型 所謂多型就是指一個類例項的相同方法在不同情形有不同表現形式。多型機制使具有不同內部結構的物件可以共享相同的外部介面。
二、java面向物件程式設計
概念是較為抽象的,在此舉出一個案例更好的理解面向物件思想。
1. 完成一個java application 應用程式,描述一個人類。要求如下:
- 要求此人類必須包含有人的姓名、性別、出生日期等基本屬性(變數)。
- 要求此人類描述吃飯的方法(函式)和描述睡覺的方法(函式)。例如睡覺方法的執行體為一個 System.out.println() 函式,此函式輸出一段例如“ xx(姓名)往床上躺倒,不久就睡著了……”之類的描述睡覺的文字。
- 要求此人類的建構函式要具有無引數的建構函式,以及帶有姓名、性別、出生日期等引數的建構函式,並在建構函式中輸出一段描述xx(姓名)出生的文字。
- 例項化出張三和李四兩個人類物件(變數),併為之賦初值。
- 呼叫張三、李四等人類物件的各種屬性(類成員變數)和方法(函式)。
- 在上述人類的基礎上派生一個繼承自人類的新的職工類,加入職工號等職工特有的屬性,加入上班、出差等方法,並例項化一個或幾個職工類物件,完成這些職工類物件的各種屬性和方法的呼叫。
2. 實現程式碼
//先寫person類,定義屬性、方法
//在主函式中輸出一個人物資訊
//在person類之後繼承出一個worker類,定義worker的屬性、方法,同時用super函式繼承父類屬性
//在主函式中輸出一個職工資訊
class person //自定義"人"類
{
//定義成員變數,設定屬性的私有訪問許可權
String name;
String sex;
int age;
String birth;
String position;
String company;
//無參建構函式
public person()
{
//直接給成員變數賦值
//也可在主函式中按人物1方式呼叫以下有參建構函式賦值,則此部分省略
name="李四";
sex="女";
age=37;
birth="8月17";
position="資料維護工程師";
company="阿里巴巴";
System.out.println("姓名:"+name+"\n"
+"性別:"+sex+"\n"
+"年齡:"+age+"\n"
+"生日:"+birth+"\n");
}
//有參建構函式
public person(String name,String sex,int age,String birth,String position,String company)
{
//將區域性變數的值傳遞給成員變數
this.name=name;
this.sex=sex;
this.age=age;
this.birth=birth;
this.position=position;
this.company=company;
System.out.println("=======================");
System.out.println("姓名:"+name+"\n"
+"性別:"+sex+"\n"
+"年齡:"+age+"\n"
+"生日:"+birth);
}
//定義描述工作的方法(無參)
public void work()
{
System.out.println(name+"就職於"+company+",她的技術方向是"+position
+",她每天認真工作。\n");
}
//實現方法過載
public void work (int workage)
{
System.out.println(name+"就職於"+company+",她的技術方向是"+position
+",她每天認真工作,已經在"+company+"工作了"+workage+"年。\n");
}
//描述睡覺的方法
public void sleep()
{
System.out.println("她在"+birth+"這天慶祝生日,回家倒頭就睡,很快就睡著了。\n");
}
}
//在上述人類(person)的基礎上派生一個繼承自人類的新的職工類(woker)
class woker extends person
{
String id;
public woker()
{
}
public woker(String name,String sex,int age,String birth,String position,String company,String id)
{
super(name,sex,age,birth,position,company);//super函式繼承父類的建構函式
//super.work(3);
//super.sleep();
//super.work();
this.id=id;
/*System.out.println("姓名:"+name+"\n"
+"性別:"+sex+"\n"
+"年齡:"+age+"\n"
+"生日:"+birth+"\n"
+"職工號:"+id);*/
System.out.println("職工號:"+id+"\n");
}
//定義描述出差的方法
public void evection(int days)
{
System.out.println("第二天"+name+"被"+company+"安排出差"+days+"天。");
}
}
//建立公共類(注意與class person的區別)
public class realperson
{
public static void main(String[] args)
{
person person1=new person("張三","女",35,"10月1日","開發工程師","騰訊");//採用帶參構造方法建立物件
person1.work();//呼叫不帶參的work方法
person1.work(5);//呼叫過載的work方法
person1.sleep();//呼叫sleep方法
System.out.println("=======================");
//人物2自動呼叫無參建構函式(沒有對其引數進行賦值時),其引數在函式中直接賦值,
person person2=new person();
person2.work();
person2.work(10);//呼叫過載的work方法
person2.sleep();
System.out.println("=======================");
//人物3呼叫繼承下來的woker類
woker person3=new woker("小小","女",25,"10月8日","軟體開發工程師","華為","110069");
//woker person3=new woker();
person3.work();//呼叫父類work方法
person3.work(3);//呼叫父類過載的work方法
person3.sleep();//呼叫父類sleep方法
person3.evection(3);//呼叫evection方法
}
}
3. 編譯執行結果:
editplus編輯器下: 編譯:javac 檔名.java 執行:java 檔名