【JAVA】面向物件程式—描述物件(修改補充)
阿新 • • 發佈:2018-12-18
前言
上一篇文章主要介紹了有關面向物件的知識與程式設計,這篇短小的文章主要是針對面向物件的一個補充。
知識點:
類的主方法
主方法是類的入口點,它定義了程式從何處開始以及提供對程式流向的控制,在java中,程式設計都是通過主方法來執行程式。
public static main(String[] args){
//方法體
}
在主方法的定義中,我們可以看到其具有以下特徵:
- 主方法是靜態的,如若要直接從主方法中呼叫其他的方法,那麼該方法也必須是靜態的。
- 主方法是沒有返回值的 。
- 主方法形參為陣列,其中args[0]~args[n]代表著程式的第一個引數到第n個引數,可以用args.length來獲取引數的個數。
類的建構函式
除了上次文章當中說到的成員方法之外,還存在一種特殊的方法,那就是構造方法,物件的建立就是通過構造方法來完成的。沒當類例項一個物件時,類都會呼叫構造方法。
public book(){
....//構造方法體
}
構造方法的特點:
- 建構函式沒有返回值。(與普通的沒有返回值的方法不同。普通無返回值的方法使用public void methodEx()這種形式定義,但是構造方法並不需要使用void關鍵字就行修飾 )
- 構造方法的名稱要與本類的名稱相同。
- 構造方法中可以為成員變數賦值,當例項化一個本類物件時,相應成員變數也將被初始化。
- 類中假如沒有明確定義構造方法,那麼編譯器會自動建立一個不帶引數的預設構造方法。
繼承
- 表達方式:extend 繼承
- 繼承:父類私有的無法繼承,建構函式無法繼承。 在記憶體空間劃分父類的儲存空間,再疊加子類的屬性空間。
- 繼承的特點:1、程式碼的可重用性 2、父類的屬性和方法可用於子類 3、設計應用程式變得更加簡單 4、子類可以拓展父類的屬性和方法。
- 單繼承與多繼承: 某些OOP語言(例如C++)允許子類有多個父類,但在Java中這是不允許的,在Java中,一個類只能有一個父類。 所有的根類都是object。具有相同的屬性,面向物件程式設計中,可以通過擴充套件一個 已有的類,並繼承該類的屬性和行為,來建立一個新的類, 這種方式稱為繼承(Inheritance)。 繼承裡面是類和類繼承,不是物件和物件繼承.
- 繼承:繼承是通過關鍵字extends體現的。
繼承的格式:
class 類名1 extends 類名2{
}
- 繼承要注意的事項:
- 千萬不要為了減少重複程式碼而去繼承,只有真正存在著繼承關係的時候才去繼承。
- 父類私有的成員不能被繼承。
- 父類的建構函式不能被繼承。
- 建立子類物件時預設會先呼叫父類無參的建構函式。
- super關鍵字:
1.可以用在類方法和物件方法中。
2.在物件方法中可以使用super 關鍵字,呼叫當前物件從父類繼承過來的物件方法。
3.在類方法中 super關鍵字可以呼叫當前類從父類繼承過來的方法(類方法也能被子類繼承,父類中的類方法可以使用父類名來呼叫,也可以使用子類名呼叫。再子類的類方法中,也可以用super來呼叫複用的類方法)
子類從父類繼承:相當於模板中擁有父類莫看中的所有的成員。建立以各子類物件,仍然是根據模板來建立,子類物件中既有子類的成員,也有父類的成員
super 特指這個方法是從父類繼承過來的/super是指當前類或者物件的這個方法是從父類繼承過來的
工程訓練(改進)
任務要求:
- 完成一個java application 應用程式,描述一個人類。要求如下:
- 要求此人類必須包含有人的姓名、性別、出生日期等基本屬性(變數)。
- 要求此人類描述吃飯的方法(函式)和描述睡覺的方法(函式)。例如睡覺方法的執行體為一個 System.out.println() 函式,此函式輸出一段例如“ xx(姓名)往床上躺倒,不久就睡著了……”之類的描述睡覺的文字。
- 要求此人類的建構函式要具有無引數的建構函式,以及帶有姓名、性別、出生日期等引數的建構函式,並在建構函式中輸出一段描述xx(姓名)出生的文字。
- 例項化出張三和李四兩個人類物件(變數),併為之賦初值。
- 呼叫張三、李四等人類物件的各種屬性(類成員變數)和方法(函式)。
- 在上述人類的基礎上派生一個**
繼承
自人類的新的學生類**,加入學號等學生特有的屬性,加入上課、考試等方法,並例項化一個或幾個學生類物件,完成這些學生類物件的各種屬性和方法的呼叫。 - 以上定義中,各種類的屬性、方法等鼓勵標新立異,儘量達到可以描述真實的人類和學生等。
實現程式碼:
class Humanity //建立Humanity物件
{
public String name; //宣告公有欄位name,此時name為類的屬性,下面通過公有方法進行訪問
public String sex; //宣告性別變數sex
public int age; //宣告公共欄位age
public int id; //宣告人物學號變數
public String birth; //宣告人物生日變數
public String getName() //返回物件的資訊描述
{
return name;
}
public void setName(String name) { //設定名稱
this.name = name;
}
public void eat() //定義無引數的eat方法
{
System.out.println("他是個純南方人,特別愛吃米飯");
}
public void eat(String s) //定義帶引數的eat方法,實現方法過載
{
System.out.println("他是一個地道的北方人,非常喜歡吃"+s);
}
public void sleep() { //定義無引數的sleep方法
System.out.println("張三偶爾熬夜,晚上思考能力很發達,所以睡眠時間不太好。");
}
public void sleep(String t) { //定義帶引數的sleep方法,實現方法過載
System.out.println("李四有良好的休息習慣,只要往"+t+"躺倒,不久就會睡著了……");
}
public Humanity() //定義無參建構函式,注意無返回值定義,方法與類同名
{
}
public Humanity(int age,int id,String sex,String name,String birth)
{ //重寫一個帶引數建構函式,注意無返回值定義,方法與類同名
this.age = age; //前一個age為物件的欄位,由this指定,後一個age為函式形參
this.id = id; //前一個id為物件的欄位,由this指定,後一個age為函式形參
this.sex = sex; //前一個sex為物件的欄位,由this指定,後一個age為函式形參
this.name = name; //前一個name為物件的屬性,由this指定,因為在本類中可直接訪問,後一個name為函式形參
this.birth = birth; //前一個birth為物件的欄位,由this指定,後一個birth為函式形參
}
//public Humanity(int age,int id,String sex,String name) //定義無參建構函式,注意無返回值定義,方法與類同名
//{
//this.age = age; //前一個age為物件的欄位,由this指定,後一個age為函式形參
//this.id = id;
//this.sex = sex;
//this.name = name;
//}
}
//建立一個Teacher子類(用extends)
class Teacher extends Humanity {
Teacher(int age,int id,String sex,String name,String birth) {
super(age, id, sex, name, birth); // 使用super()呼叫Humanity的建構函式
}
public void study() //定義無引數的study方法
{
System.out.println("他要求學生每天好好學習,按時上課");
}
public void study(String r) //定義帶引數的study方法,實現方法過載
{
System.out.println("還建議學生在空閒時間多看"+r);
}
public void exam() //定義無引數的exam方法
{
System.out.println("無論任何考試,都要做一個誠信的人!");
}
public void exam(String q) //定義帶引數的exam方法,實現方法過載
{
System.out.println("考試檢測方面,不允許使用"+q+"作弊");
}
}
public class Example3
{
public static void main(String[] args) //主方法呼叫
{
Humanity Humanity1 = new Humanity(); //呼叫類的無參建構函式
Humanity1.age = 22; //給物件的公有欄位直接賦值
Humanity1.id =201801234; //給物件的公有欄位直接賦值
Humanity1.setName("張三"); //給物件的公有欄位直接賦值
Humanity1.sex = "男" ; //給物件的公有欄位直接賦值
Humanity1.birth = "1996年5月8日" ; //必須使用公共方法才能給物件的屬性賦值
System.out.println("從前有個"+Humanity1.sex+"生叫"+Humanity1.getName()+",他出生於"+ Humanity1.birth+",今年"+Humanity1.age+ "歲,學號是"+Humanity1.id);
Humanity1.eat(); //呼叫物件的無參方法
Humanity1.sleep(); //呼叫物件的無參方法
System.out.println("\n"); //空行
Humanity Humanity2 = new Humanity(23,201804321,"男","李四","1995年6月9日");//呼叫類的有參建構函式
System.out.println("他有個"+Humanity2.sex+"同學叫" + Humanity2.getName() + ",學號為"+Humanity2.id + ",今年" + Humanity2.age+ "歲了,生日是"+Humanity2.birth);
Humanity2.eat("饅頭"); //呼叫物件的有參方法
Humanity2.sleep("床上"); //呼叫物件的有參方法
System.out.println("\n"); //空行
Teacher Humanity3 = new Teacher(35,200906789,"男","杜", "1983年");
//Humanity3.age = 35; //給物件的公有欄位直接賦值
//Humanity3.id =200906789; //給物件的公有欄位直接賦值
//Humanity3.sex = "男" ; //給物件的公有欄位直接賦值
Humanity3.setName("杜"); //給物件的公有欄位直接賦值
System.out.println("他倆有一位"+Humanity3.age+"歲的"+Humanity3.sex+"導師,叫"+Humanity3.getName()+"老師,學工號:"+ Humanity3.id);
//System.out.println(Humanity3.getName());
Humanity3.study(); //呼叫物件的無參方法
Humanity3.study("科技類文章"); //呼叫物件的有參方法
Humanity3.exam("通訊裝置"); //呼叫物件的有參方法
Humanity3.exam(); //呼叫物件的無參方法
//System.out.println();
}
}
效果:
多多改進,多多請教,the way!