本文接上文: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
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(""); } }
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中文網其他相關文章!