1. 程式人生 > >【JAVA】面向物件程式—描述物件(修改補充)

【JAVA】面向物件程式—描述物件(修改補充)

前言

上一篇文章主要介紹了有關面向物件的知識與程式設計,這篇短小的文章主要是針對面向物件的一個補充。

知識點:

類的主方法

主方法是類的入口點,它定義了程式從何處開始以及提供對程式流向的控制,在java中,程式設計都是通過主方法來執行程式。

public static main(String[] args){
      //方法體
}

在主方法的定義中,我們可以看到其具有以下特徵:

  1. 主方法是靜態的,如若要直接從主方法中呼叫其他的方法,那麼該方法也必須是靜態的。
  2. 主方法是沒有返回值的 。
  3. 主方法形參為陣列,其中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{

}
  • 繼承要注意的事項:
  1. 千萬不要為了減少重複程式碼而去繼承,只有真正存在著繼承關係的時候才去繼承。
  2. 父類私有的成員不能被繼承。
  3. 父類的建構函式不能被繼承。
  4. 建立子類物件時預設會先呼叫父類無參的建構函式。
  • 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();
    }  
}  

效果:

1

多多改進,多多請教,the way!