首頁 > Java > java教程 > 主體

java-物件導向詳細介紹(三)

王林
發布: 2019-08-23 10:58:50
轉載
2379 人瀏覽過

本文接上文:java-物件導向詳細介紹(二)

#11、介面(interface)

#引入:抽象類別是從多個類別中抽像出來的模板,若要將這種抽象進行得更徹底,就得用到一種特殊的「抽象類別」→ 介面;

範例:

生活中聽過的USB介面其實並不是我們所看到的那些插槽,而是那些插槽所遵循的一種規範;而我們看到的那些插槽是根據USB規範設計出來的實例而已,也就說插槽是USB的實例;

對應不同型號的USB設備而言,他們各自的USB插槽都需要遵循一個規範,遵守這個規範就可以保證插入插槽的設備能與主板正常通信;##​​

#對於同一種型號的主板上的多個USB插槽,他們有相同的數據交換方式,相同的實作細節,可認為他們都是同一個類別的不同實例

我的總結:

介面只定義了類別應當遵循的規範,卻不關心這些類別的內部數據和其方法內的實作細節.

介面只規定了這些類別裡必須提供的方法;從而分離了規範和實作.增強了系統的可拓展性和維護性;

#使用介面的好處,拓展性,維護性更好,所以我們在開發中會經常用到接口.(相當於定義了一種標準)

interface定義

#介面定義一種規格,規定一個類別必須做什麼,但它不管如何具體去做;

[修飾符] interface 介面名稱extends 父介面1,父介面2....

沒有建構方法,不能實例化;

介面只能繼承介面,不能繼承類別

介面裡沒有普通方法,方法全是抽象的;

#介面裡的方法預設修飾符是public abstract;

介面裡的欄位全是全域常數,預設修飾符是public static final;

介面裡的成員包括(主要是前兩者):

全域常數

公共的抽象方法

內部類別(包括內部類別,內部介面,內部枚舉類別);

我的總結:

介面沒有建構方法,不能實例化!

介面裡的方法全部是抽象的,沒有普通方法,有預設的修飾符 public abstract,必須全部覆寫!

12、介面的使用

格式:

public class SubImpl  extends Super  implements IA,IB

#介面可以多繼承,但是只能繼承介面,不能繼承類別。

實作介面(支援多重實作)

[修飾符] class 類別名稱implements 介面1,介面2...

介面的實作必須在extends 之後;

實作介面的方法必須是public 類型

介面與類別之間的關係:

#實作關係或者說是繼承關係.

可以說類實作了介面的方法,也可以說類別繼承了介面的方法,不同情況下不同的理解!

13、以介面程式為導向制定標準和簡單工廠模式

#制定一個標準,讓別人去實作或是說滿足它!

Eg:
interface USB{//定义USB标准
    void useUSB();//USB有使用USB的行为
}
登入後複製

簡單工廠模式

建造一個工廠出來,在裡面進行生產,用的時候直接拿

我的總結:

#好處:屏蔽不同子類別實現的差異,提高程式碼的可拓展性和可維護性;

package reviewDemo;
 
//简单工厂模式
 
 
 
interface Phone{//制定标准,都要实现send()方法
 
   public void send();
 
}
 
 
 
class Iphone implements Phone{
 
   @Override
 
   public void send() {
 
      System.out.println("Iphone手机在发短信");
 
   }
 
}
 
 
 
class AndroidPhone implements Phone{
 
   @Override
 
   public void send() {
 
      System.out.println("AndroidPhone手机在发短信");
 
   }
 
}
 
 
 
class MyPhone implements Phone{
 
   @Override
 
   public void send() {
 
      System.out.println("MyPhone手机在发短信");
 
   }
 
}
 
 
 
class Factory{
 
   public static void show(String type){//传入参数,根据不同的类型个性化定制
 
      if(type.equals("")){//为空的情况,不用往下执行
 
         System.out.println("对不起,类型为空!,请重新输入!");
 
         return;
 
      }
 
      Phone p = null;
 
      if("Iphone".equals(type)){//判断类型
 
         p = new Iphone();
 
      }else if("AndroidPhone".equals(type)){
 
         p = new AndroidPhone();
 
      }else{
 
         p = new MyPhone();
 
      }
 
      p.send();
 
   }
 
}
 
 
 
public class FactoryDemo17 {
 
   public static void main(String[] args) {
 
     
 
      new Factory().show("Iphone");//调用方法
 
      new Factory().show("AndroidPhone");
 
      new Factory().show("MyPhone");
 
      new Factory().show("YourPhone");
 
      new Factory().show("");
 
   }
 
}
登入後複製

輸出:

Iphone手機在發送簡訊

AndroidPhone手機在發送簡訊

MyPhone手機在傳簡訊

MyPhone手機在發簡訊

對不起,類型為空!

14、面向接口编程之适配器模式

使用一个现成的类,但是它的接口不完全符合你的需求,我只想要它其中的一个方法,不想覆写其他的方法。

比如,窗体有变大,变小,关闭的行为,但是我现在只需要关闭行为;

package reviewDemo;
 
//适配器模式:只想用其中的某一个方法,用适配器作为中间的过渡
 
 
 
interface Windows{
 
   void max();
 
   void min();
 
   void close();
 
}
 
 
 
//适配器模式,实现接口所有的方法,但是不写方法体!
 
class AdapterWindows implements Windows{
 
 
 
   @Override
 
   public void max() {
 
   }
 
 
 
   @Override
 
   public void min() {
 
   }
 
 
 
   @Override
 
   public void close() {
 
   }
 
  
 
}
 
 
 
class MyWindows extends AdapterWindows{
 
   //覆写父类的方法
 
   public void close(){
 
      System.out.println("这个实现的是关闭功能!");
 
   }
 
}
 
 
 
public class Demo17 {
 
   public static void main(String[] args) {
 
      new MyWindows().close();
 
   }
 
}
登入後複製

接口和抽象类的比较

相同点:

都位于继承的顶端,用于被其他实现或继承;

都不能实例化;

都包含抽象方法,其子类都必须覆写这些抽象方法;

区别:

抽象类为部分方法提供实现,避免子类重复实现这些方法,提供代码重用性;接口只能包含抽象方法;

一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)

二者的选用:

优先选用接口,尽量少用抽象类;

需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;

总结:接口不能有构造函数,抽象类是可以有构造函数的,

abstract可以定义构造函数(包括带函数的构造函数),因为要保证其子类在创建的时候能够进行正确的初始化,但是Abstract类不能被实例化。

知识点:如果不可以或者没有创建对象,那么我们必须加上static修饰,不能用对象调用,就只好用类去调用。

16、匿名内部类


适合只使用一次的类

不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建匿名内部类的对象。

匿名内部类不能定义构造器,因为匿名内部类没有类名。

格式:
new 父类构造器([实参列表]) 或 接口()
{
//匿名内部类的类体部分
}
登入後複製

17、枚举类

使用enum声明,默认直接继承了java.lang.Enum类,而不是Object类;

枚举类的对象是固定的,实例个数有限,不可以再new( ),枚举对象后可以跟()。

枚举元素必须位于枚举类体中的最开始部分,枚举元素后要有分号与其他成员分隔。

枚举类的构造方法的权限修饰符默认是private;

一旦枚举对象后面加上{},那么该对象实际是枚举匿名内部类对象;

所有枚举类都提供一个静态的values()方法(返回该枚举类所有对象组成的数组),便于遍历所有枚举对象;

所有枚举类都提供一个静态的valueOf(String name)方法, 返回枚举类中对象名等于 name的对象。

Eg:public enum Color{
 
        RED(), GREEN(){}, BLUE{};
 
}
 
 
 
 
 
package reviewDemo;
 
//枚举
 
 
 
enum Color{
 
   Green,Blue,Yellow;
 
  
 
   @Override
 
   public String toString() {
 
      String ret = super.toString();
 
      switch (this) {
 
      case Green:
 
         ret = "绿色";
 
         break;
 
        
 
      case Blue:
 
         ret = "蓝色";
 
         break;
 
        
 
      case Yellow:
 
         ret = "黄色";
 
         break;
 
 
 
      default:
 
         break;
 
      }
 
     
 
      return ret;
 
   }
 
  
 
}
 
 
 
class Personp{
 
   Color c = Color.Blue;
 
   void show(){
 
      System.out.println(c);
 
   }
 
}
 
 
 
public class Demo18 {
 
   public static void main(String[] args) {
 
      Color []color = Color.values();
 
      for (Color c : color) {
 
         System.out.println(c);
 
      }
 
      new Personp().show();
 
   }
 
}
登入後複製

输出:

绿色

蓝色

黄色

蓝色

枚举类覆写接口抽象方法的两种方式:

在枚举类中实现接口的抽象方法;

在枚举匿名内部类中实现接口的抽象方法;

interface I{
 
    void show();
 
}
 
 
 
enum Color implements I{
 
    RED(){
 
   public void show(){
 
        }
 
    }, GREEN{
 
   public void show(){
 
        }
 
    }, BLUE{
 
   public void show(){
 
        }
 
    };
 
}
 
 
 
enum Color implements I{
 
    RED(), GREEN, BLUE;
 
    public void show() {
 
    }
 
}
登入後複製

总结:枚举不可以new();即便是反射也不可以!

备注:一个类如果没有构造方法,那么一定有相对应的某个方法可以获取对象!

以上就是關於物件導向的全部想寫講解了,如有不對的地方請聯絡改正。謝謝!

更多相關內容請上PHP中文網:JAVA影片教學

#

以上是java-物件導向詳細介紹(三)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板