Java多態&抽象類&接口

一.多態

定義:多態指一個事物在不同時刻體現出來的不同狀態

1)多態存在的三個必要條件

1.要有繼承;

2.要有重寫;

方法重寫:要求返回值類型也要相同的.不能改變返回值類型

3.父類引用指向子類對象。(向上轉型)(三者缺一不可,必須熟記

 

2)多態的成員訪問特點:
 成員變量:
  編譯看左邊,運行看左邊
 成員方法:
  編譯看左,運行看右;由於存在方法重寫,所以就運行最終的就是子類的成員方法
 靜態成員方法:
  編譯看左,運行看左
 構造方法:還是對象進行初始化,由於是一種繼承關係,還是分層初始化!

 

3)多態的好處及弊端?如何解決多態的弊端?


多態的好處:
  a.提高代碼的維護性 多態對已存在代碼具有可替換性(由繼承保證)
  b.提高代碼的擴展性(由多態保證)

c.多態簡化對應用軟件的代碼編寫和修改過程
 多態的弊端:
不能訪問子類的特有功能

解決方案:
  a.創建子類的具體對象,來訪問自己的特有功能;雖然可以解決多態的弊端,但是從內存角度考慮,需要創建子類對象,那麼必須在堆內存開闢空間,

  b.將子類的引用指向父類對象即向下轉型:將父類的引用強制轉換爲子類的引用(前提必須有父類的引用存在);
Java中多態的實現方式:接口實現,繼承父類進行方法重寫,同一個類中進行方法重載。

 

關於轉型:

  比如有2個類 A B A繼承B 先 B b = new B(); 這個時候 A a = b; 這種用法就是向上轉型 使用父類的引用 引用子類對象 向上轉型是自動的不需要其他操作 在上邊的基礎上  b =  (B) a 這個就是向下轉型 當用父類引用 引用子類對象 現在想不使用父類的引用 而使用子類的引用 就是向下轉型 向下轉型必須強制轉型 必須確定對象確實是子類對象

 

關於final的問題

 

 final關鍵字可以幹什麼?有什麼特點?

       final關鍵字可以用來修飾類,修飾類的成員變量,修飾成員方法。
       特點:如果修飾類則該類不能被繼承,如果修飾成員方法則改方法不能被重寫,如果修飾成員變量則該成員變量不能被修改。大多數情況,final一般跟public static一起使用!   

3:final關鍵字的面試題?
    A:修飾局部變量
    B:初始化時機
        A   基本數據類型:如果局部變量是基本數據類型被final修飾後,其值不能被改變。
                          引用數據類型:如果引用類型被final修飾,那麼就不能再重新分配堆內存空間,但可以改變成員變量的值!    
        B   初始化時機:構造代碼塊中可以進行初始化。
                        構造方法中可以進行初始化。
                        定義成員變量的時候可以進行初始

*局部內部類訪問局部變量時 該局部變量要作爲一個常量被final修飾

 

class Outer5{
	//外部類的成員變量
//	public int num = 100 ;
	private int num = 100 ;
	
	//外部類的成員方法
	public void method(){
		//局部變量
		 final int num2 = 200 ;	//自定義常量(細節問題)
		
		//局部位置
		class Inner5{
			//局部內部類的成員方法
			public void show(){
				System.out.println(num);
				
				//局部內部類中訪問局部變量
				System.out.println(num2); //jdk1.7纔會有這個錯誤!		jdk1.8---->封裝好了,所以不會出現錯誤!
			}
		}
		
		Inner5 i = new Inner5() ;
		i.show() ;
	}
}

 

 

 

 

 

     二. 抽象類
概念:使用了關鍵詞abstract聲明的類叫作“抽象類“。如果一個類裏包含了一個或多個抽象方法,類就必須指定成abstract,當一個類中如果有抽象功能(抽象方法)的時候,那麼這個類一定要定義爲抽象類:使用了關鍵詞abstract聲明的類叫作“抽象類“。如果一個類裏包含了一個或多個抽象方法,類就必須指定成abstract,當一個類中如果有抽象功能(抽象方法)的時候,那麼這個類一定要定義爲抽象類
 
1)抽象類成員特點?  1.抽象方法:沒有方法體的一個方法 public abstract void eat() ; 2.抽象的子類 abstract class Cat extends Animal{  1.抽象方法:沒有方法體的一個方法 public abstract void eat() ; 2.抽象的子類 abstract class Cat extends Animal{
           }
抽象類的子類的特點:    抽象類的子類是抽象類,那麼沒有意義!最終使用的就是通過子類進行對象初始化的,如果子類都被抽象修飾了,那麼也不能創建對象,所以沒意義 2)關於抽象類:   抽象類的子類是抽象類,那麼沒有意義!最終使用的就是通過子類進行對象初始化的,如果子類都被抽象修飾了,那麼也不能創建對象,所以沒意義 2)關於抽象類:
a.一個抽象類如何進行實例化:
通過抽象類多態形式:父類的引用指向子類對象,通過子類進行初始化!一個抽象類如何進行實例化:
通過抽象類多態形式:父類的引用指向子類對象,通過子類進行初始化!
b.一個抽象類中可以有非抽象方法嗎?
一個抽象類中可以抽象,也可以有非抽象的
c.抽象類不能實例化:抽象類不能創建對象一個抽象類中可以有非抽象方法嗎?
一個抽象類中可以抽象,也可以有非抽象的
c.抽象類不能實例化:抽象類不能創建對象

3)抽象類多態:
  強制子類必須重寫當前抽象的父類中所有的抽象方法
  還可以提高代碼的維護性(裏面繼承關係保證!)

 

* 抽象類的小問題     A:一個類如果沒有抽象方法,可不可以定義爲抽象類?如果可以,有什麼意義?     B:abstract不能和哪些關鍵字共存         A.  可以,不能讓創建對象。         B.  final    private   static 和 abstract不能共存

三.接口
1).接口的概述及其特點?
1).接口的概述及其特點?
 

 概述:接口體現的是一種擴展功能。        特點:接口裏面的方法只能是抽象方法。     

      Interface  接口名{
             }
             接口不能實例化,必須通過過子實現類進行初始化。因此子實現類不能爲抽象類,否則沒有意義。
             class 子實現類名 implements 接口名{
          }

 

2).接口的成員特點?  1.成員變量:

  		只能是常量:存下默認修飾符:public static final (永遠建議自己給出默認修飾符)
  	2.構造方法:
  		接口是沒有構造方法的
 	3.成員方法:
 		接口中的成員方法默認修飾符:public abstract
3).抽象類和接口的區別?		只能是常量:存下默認修飾符:public static final (永遠建議自己給出默認修飾符)
  	2.構造方法:
  		接口是沒有構造方法的
 	3.成員方法:
 		接口中的成員方法默認修飾符:public abstract
3).抽象類和接口的區別?
1.成員的區別:
 	成員變量:
 		抽象類:成員變量可以是常量,也可以是變量
 		接口:成員變量只能是一常量:存在默認修飾符:public static final
 	構造方法:
 		抽象類:可以有無參構造,有參構造方法
 			作用:通過子類進行數據初始化(通過子類創建對象)
 		接口:沒有構造方法的
 	成員方法的區別:
 		抽象類:可以有抽象方法,也可以有非抽象方法
 		接口:只能是抽象方法:存在默認修飾符:public abstract
 				
2.關係的區別:
 	類與類的關係:
  		繼承關係:extends,java中只支持單繼承,不支持多繼承,但是可以多層繼承!
  	類與接口的關係:
  		實現關係:implements,並且,一個類在繼承另一個類的同時,可以實現多個接口
 		(class 子實現類名  enxtends Object implements 接口名1,接口名2...)
  			
  	接口與接口的關係
  				繼承關係:extends,可以支持單繼承,也可以多繼承!
  						
  3.設計理念的區別:
  		抽象類:
  			體現的是一種"is a"的關係,存在繼承關係!(抽象類多態)
  		接口:
  			體現的是一種"like a"的關係,由於接口的一種擴展功能
*接口練習題	成員變量:
 		抽象類:成員變量可以是常量,也可以是變量
 		接口:成員變量只能是一常量:存在默認修飾符:public static final
 	構造方法:
 		抽象類:可以有無參構造,有參構造方法
 			作用:通過子類進行數據初始化(通過子類創建對象)
 		接口:沒有構造方法的
 	成員方法的區別:
 		抽象類:可以有抽象方法,也可以有非抽象方法
 		接口:只能是抽象方法:存在默認修飾符:public abstract
 				
2.關係的區別:
 	類與類的關係:
  		繼承關係:extends,java中只支持單繼承,不支持多繼承,但是可以多層繼承!
  	類與接口的關係:
  		實現關係:implements,並且,一個類在繼承另一個類的同時,可以實現多個接口
 		(class 子實現類名  enxtends Object implements 接口名1,接口名2...)
  			
  	接口與接口的關係
  				繼承關係:extends,可以支持單繼承,也可以多繼承!
  						
  3.設計理念的區別:
  		抽象類:
  			體現的是一種"is a"的關係,存在繼承關係!(抽象類多態)
  		接口:
  			體現的是一種"like a"的關係,由於接口的一種擴展功能
*接口練習題
老師和學生案例,加入抽菸的額外功能
分析:具體到抽象
 學生:
  			成員變量:姓名,年齡
 			構造方法:有參/無參
 			成員方法
 老師:
  成員變量:姓名,年齡
  			構造方法:有參/無參
 			成員方法
 
人類:persen類:抽象類	     eat();抽象功能
                學生繼承自persen
 		老師繼承自persen
                部分學生和老師具有吸菸功能:
 		接口:	smoking  的抽象功能
 實現:抽象到具體
			成員變量:姓名,年齡
 			構造方法:有參/無參
 			成員方法
 老師:
  成員變量:姓名,年齡
  			構造方法:有參/無參
 			成員方法
 
人類:persen類:抽象類	     eat();抽象功能
                學生繼承自persen
 		老師繼承自persen
                部分學生和老師具有吸菸功能:
 		接口:	smoking  的抽象功能
 實現:抽象到具體
 
package org.westos_08_接口; //測試類 public class Test { public static void main(String[] args) { SmokingStudent ss = new SmokingStudent(); ss.setName("吳彥祖"); ss.setAge(21); System.out.println(ss.getAge()+" "+ss.getName()); ss.sleep(); ss.eat(); ss.study(); ss.smoking(); System.out.println("---------------------"); //有參構造數據初始化 ss = new SmokingStudent("彭于晏",20); System.out.println(ss.getAge()+" "+ss.getName()); ss.sleep(); ss.eat(); ss.study(); ss.smoking(); } } 


發佈了31 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章