1. 程式人生 > >對Java面向物件程式設計的知識點(封裝、繼承,多型)進行總結

對Java面向物件程式設計的知識點(封裝、繼承,多型)進行總結

一 封裝

1.面向物件的高階:優化程式設計
   封裝:
     類中如何定義成員變數?
      private   int  num;
     概念
     語法
       3步驟
   繼承:減少冗餘程式碼
      繼承:一個類(子類)繼承另一個類(父類)
     概念
     語法
       extends
      過載??
      final(修飾符)
      static(main方法,static)      
   多型:
       一種事物的多種表現形式
      概念
      語法
        Father fa=new Son();//例項化
        //Son  son=new Son();
    介面:代表能力,一種約定。
       implement interface
    Java語言就是使用面向物件開發出來的。 
      Date      時間
      Calendar  日曆
      Math
      包裝類  Integer Double  Short  Float Boolean
    集合(不同結構不同使用)
    異常 (Exception)
    檔案!IO流
    記憶體(基本資料型別的變數中,引用資料型別的變數中應用)
     int num=9;
     String str="admin";
     Student stu=new Student();
     int[] nums={};
     Student[] stus=new Student[10];
          寫入
    記憶體---------》檔案
        《--------
           讀取
3.封裝
     隱藏成員變數
   1.隱藏成員變數
      將成員變數前加入修飾符private 
      結果:其他類在建立狗的物件的時候,在呼叫成員變數時顯示錯誤。
         The field Dog.name is not visible
    2.建立公有的getter/setter方法
      在此類中建立公有方法
         建立成員變數的賦值方法
           public  void setName(String name1){
           }
           注意:1.方法名稱必須是set+成員變數第一個單詞首字母大寫的成員變數名稱
                 2.方法的引數必須是成員變數的型別
         成員變數的取值方法
            public  String getName(){
               return name;//返回成員變數值 
            }
           注意:1.方法名稱必須是get+成員變數第一個單詞首字母大寫的成員變數名稱
                 2.方法的返回值必須是成員變數的型別(返回的是成員變數裡面的值)
      3.在setter/getter方法中給加入屬性控制 
  4.setter方法的引數名稱和成員變數名稱保持一致。(防止亂起名字)
        this.name=name;
  5.在本類中呼叫自己的成員變數和成員方法的時候,使用this
      this代表當前物件 
  6.特殊方法的第一種。
  
   構造方法:例項化--》建立物件+物件賦成員變數值
  
    Constructor
  
  
    語法
      publlic  類名(){
      
      }
      public Dog(){
      
      }
  
      
     1,建立類的時候都會有一個隱藏的無參構造方法。
     2,建立物件的時候就會調相應的構造方法。
     3,構造方法由於方法名稱相同,因此構造方法的引數定義時注意,
       不要兩個構造方法的傳遞引數一致(順序  型別  個數)。
     4,當你在類中定義有參構造方法,隱藏的無參構造方法失效。
       因此必須在類中顯示定義構造方法
       

     例項化兩種方法
     
     第一種
       Dog dog=new Dog();
       
         dog.setName("");
         dog.setHealth();
         dog.setStrain("");
     第二種
       Dog dog=new Dog("",,"");

二  繼承 
  static{
  
  }

1.繼承初始化順序?
2.方法的過載和重寫?
3.abstract final關鍵字

1.繼承概念
   
   super    代表父類
   this     代表本類
   子類  extends  父類
2.繼承關係初始化順序。
   父類屬性--》父類的構造方法--》子類屬性--》子類的構造方法
   先父後子
   先屬後構

3.方法的過載和重寫?overloading和override區別
  過載 overloading
     規則:同一個類中
           方法名稱相同
           引數列表必須不相同(型別 個數 順序)
           返回值型別和訪問修飾符無關
    構造方法過載
       public Student(){}
       public Student(String name){}
       public Student(String sex){}//錯誤
       public Student(String name,int age){}
    //方法名稱具體意義
  重寫 override
    規則:在繼承關係中體現
           方法名字相同
           引數列表必須相同
           返回值的型別相同或者是其子類
           訪問修飾符不能嚴於父類(父類是protected 子類是protected public )
    方法重寫:相對於繼承而言,子類中對父類已經存在的方法進行區別修改。

4.abstract   抽象類

    1.修飾class後變為抽象類,限制例項化
    2.Pet類定義方法沒有意義
       因此我們可以在Pet類中定義方法為抽象方法,
       抽象方法沒有方法體。
  
  1)修飾類   限制例項化
  2)修飾方法   限制方法的實現,沒有方法體
    
    抽象方法的實現步驟
       1.在父類的方法前新增abstract,去除方法體
       2.在子類中重寫此抽象方法
       
    為什麼使用抽象方法?
     1.父類只是知道子類應該有哪些方法,但是無法準確完成方法具體實現
     2.避免子類設計的隨意性
    總結
       1.父類中編寫抽象方法,子類必須重寫
       2.抽象類中可以有普通方法,也可以有抽象方法
       3.抽象方法必須在抽象類中
       
5.final關鍵字

   修飾類
      此類就不能被繼承
   修飾方法
      此方法不能被重寫
      注意:final和abstract是兩個相反的單詞,絕對不能同時修飾
   修飾變數   
     常量:所有單詞字母全部大寫
        USER_NAME     AMDIN_NAME
        final String ORACLE_PASSWORD="123456";
     int num=9;
     num:變數
     9:常量
     
     永遠都不會被改變的
     成員變數
        修飾成員變數必須宣告的時候就賦值或者在構造方法中初始化
6.Object 上帝類 祖宗類

   Object類是所有類的父類。
   如果一個類沒有使用extends關鍵字標識繼承另一個類,那麼這個類預設繼承Object   
       
    因此自定義的類和底層開發人員的類

         String str="";
         str.equals("");//equals標明並不是在Object類,是String類。因為String子類重寫了Object父類裡的方法

   Object類中的主要方法。
    
     1.equals :比較物件的引用是否指向同一塊記憶體地址。(引用:指向一塊記憶體地址)
       作業:想使用equals判斷兩個物件的屬性是否相同。--》重寫equlas
     2.toString()
         StringBuffer--》toString()--->StringBuffer轉換為String型別
         
         返回的是雜湊碼值(物件地址字串)。(Hash)

      我們直接使用System.out.println(dog);輸出一個物件
      結果就是物件的地址字串也叫雜湊碼值(com.sisp.oop4.object.Dog@659e0bfd)

      
      雜湊碼值:通過雜湊演算法(Hash)生成的一個字串,用來區分我們的物件地址碼。
  
        劉**        210123...
   
        變數名        雜湊碼值

     子類可以重寫toString

      3.getClass()  可以得到此物件的型別
       System.out.println(dog.getClass());
        //class com.sisp.oop4.object.Dog

三 多型

1.面向物件的第三大特性
     多型
     
   生活中的多型
      同一種事物,由於條件不同,則產生不同的結果
         事物的多種表現形態
    程式中多型
      同一個引用型別,使用不同的例項,執行不同的操作
        
        父類的引用  子類的實現
        //使用多型進行例項化
        Pet pet=new Dog();
        Pet pet=new Penguin();
        Pet pet=new Cat();
2.多型發生在繼承關係中
3.多型實現的前提
    
      1.類與類之間存在繼承關係
      2.類與介面之間存在實現關係(之後章節)
4.多型實現的步驟

    1.編寫父類
    2.編寫子類,一定要有子類重寫父類的方法
    3.使用時,就可以使用父類的引用型別,子類的例項!!
      //使用多型進行例項化
        Pet pet=new Dog();
        Pet pet=new Penguin();
        Pet pet=new Cat();
5.多型實現的方式
   1.Pet pet=new Dog();
   2.使用父類作為方法的形參實現多型,
      呼叫具體方法傳入實參作為子類的例項
   3.使用父類作為方法的返回值實現多型,
     定義方法的返回值為父類,呼叫方法的返回值為子類的例項
6.優點:程式的可擴充套件性
  缺點:使用多型進行例項化,例項化的物件只能呼叫子類重寫父類的方法,
        子類特有的方法我們無法呼叫
        
        如何解決弊端?
        
           1.向上型別(自動型別轉換)
             
             Pet pet=new Dog();
           
             好處:隱藏子型別,提供程式碼的可擴充套件型
             弊端:只能呼叫子類重寫父類的方法,子類特有的方法我們無法呼叫
           2.向下型別(強制型別轉換)
              int b=(int)9.8;
           
               Pet pet=new Dog();
                 pet.eat();
                 
               Dog dog=(Dog)pet;
  
                 dog.catchFlyDisc();

             好處:能呼叫子類特有方法
             弊端:向下型別有風險
                    容易發生異常
                    java.lang.ClassCastException(型別轉換異常)
                    
              使用前進行判斷,判斷一個物件是否匹配另一個物件型別
                
                  物件 instanceof  型別(類名)

建立父類

package com.sisp.poly1;

public abstract class Pet {
	
	protected String name;
	protected int health;
	protected int love;
	
	public void setName(String name) {
		this.name = name;
	}
	public void setHealth(int health) {
		this.health = health;
	}
	public String getName() {
		return name;
	}
	public void setLove(int love) {
		this.love = love;
	}
	public int getHealth() {
		return health;
	}
	public int getLove() {
		return love;
	}	
	public Pet() {
	}
	public Pet(String name, int health, int love) {
		this.name = name;
		this.health = health;
		this.love = love;
	}
	//The abstract method eat in type Pet
    //can only be defined by an abstract class
	/**
	 * 吃食
	 */
	public abstract void eat();
}

建立企鵝類

package com.sisp.poly1;

public class Penguin extends Pet{

	private String sex;
	
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Penguin() {
	}
	public Penguin(String sex) {
		this.sex = sex;
	}	
	public Penguin(String name,int health,int love,String sex) {
		super(name,health,love);
		this.sex = sex;
	}
	public void show(){
		System.out.println("自我介紹:我的名字:"+
		                   super.name+",健康值:"+
				           super.health+",親密度"+
				           super.love+",性別 :"+
				           this.sex);
	}
	@Override
	public void eat() {
		 if(super.health>200){
	    	   System.out.println("吃飽啦");
	       }else{
	    	   System.out.println("企鵝正在吃食");
	    	   super.health=super.health+50;
	       }	
		
	}

建立貓類

package com.sisp.poly1;

public class Cat extends Pet{

	String color;

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}

	public Cat() {
	
	}
	public Cat(String name,int health,int love,String color){
		super(name,health,love);
		this.color=color;
	}
	public void show(){
		System.out.println("自我介紹:我的名字:"+
		                   super.name+",健康值:"+
				           super.health+",親密度"+
				           super.love+",顏色:"+
				           this.color);
	}

	@Override
	public void eat() {
		
		if(super.health>200){
	    	   System.out.println("吃飽啦");
	       }else{
	    	   System.out.println("貓正在吃食");
	    	   super.health=super.health+10;
	       }	
		
	}
	
}

建立飼養員類

package com.sisp.poly1;

public class Master {
	
	private String name;
	private int money;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	public Master() {
	}
	public Master(String name, int money) {
		this.name = name;
		this.money = money;
	}
	public void feed(Pet pet){//Pet pet=new Dog()
		pet.eat();
	}
	/*public void feed(Penguin pg){
		pg.eat();
	}
	public void feed(Cat cat){
		cat.eat();
	}*/

}

建立執行類

package com.sisp.poly1;

public class Demo {

	public static void main(String[] args) {
		
		 Master master=new Master("劉小姐",100);
		
		 Cat cat=new Cat("歐歐", 100, 80, "卡布拉多");
		 
		  master.feed(cat);
		
		  cat.show();

		 Penguin pg=new Penguin("貝貝",80,80,"男");
		   master.feed(pg);
		   pg.show(); 
		
	}

}