關鍵字implements是一個類,實現一個接口用的關鍵字,它是用來實現接口中定義的抽象方法。實現一個接口,必須實現接口中的所有方法。使用 implements 關鍵字可以變相的使java具有多繼承的特性,使用范圍為類繼承接口的情況,可以同時繼承多個接口(接口跟接口之間采用逗號分隔)
還有幾點需要注意:
(1)接口可以被多重實現(implements),抽象類只能被單一繼承(extends)
(2)接口只有定義,抽象類可以有定義和實現
(3)接口的字段定義默認為:public static final, 抽象類字段默認是”friendly”(本包可見)
舉如下例子:
定義兩個接口Bread、Milk並(implements)單一實現
//定義Bread接口 public interface Bread{ //定義一個方法吃面包(接口中沒有具體的實現方法體) public void eatBread(); } //Bread接口的實現類 public class BreadImpl implements Bread{ //實現eatBread方法(接口的實現類中需要有具體的方法體) public void eatBread(){ System.out.println("吃面包"); } }
public interface Milk{ //定義一個方法喝牛奶 public void drinkMilk(); } //Bread接口的實現類 public class MilkImpl implements Milk{ //實現eatBread方法(接口的實現類中需要有具體的方法體) public void drinkMilk(){ System.out.println("喝牛奶"); } }
多重實現 依照上面定義的接口進行多重實現
public class Man implements Bread,Milk{ //實現了Bread接口中eatBread方法 public void eatBread(){ System.out.println("吃面包"); } //實現了Milk接口中drinkMilk方法 public void drinkMilk(){ System.out.println("喝牛奶"); } }
這就是接口的多重實現了
關於接口的作用:
接口是軟件編程的規范,可以降低耦合性,換句話說,可以讓某個模塊或功能能夠重復利用,這樣只要寫這功能一次代碼就ok了。其他地方要用到的,全部用接口調用來實現
接口的優勢:
1 “接口+實現”最常見的優勢就是實現類和接口分離,在更換實現類的時候,不用更換接口功能。
2.這對於做單元測試也非常有幫助。
關鍵字extends,表示對父類的繼承,可以實現父類,也可以調用父類初始化。而且會覆蓋父類定義的變量或者函數。在 Java 中,類的繼承是單一繼承,也就是說,一個子類只能擁有一個父類,所以 extends 只能繼承一個類。
類的繼承格式
class 父類 { } class 子類 extends 父類 { }
為什么需要繼承
接下來我們通過實例來說明這個需求。
開發動物類,其中動物分別為企鵝以及老鼠,要求如下:
企鵝:屬性(姓名,id),方法(吃,睡,自我介紹)
老鼠:屬性(姓名,id),方法(吃,睡,自我介紹)
企鵝類
public class Penguin { private String name; private int id; public Penguin(String myName, int myid) { name = myName; id = myid; } public void eat(){ System.out.println(name+"正在吃"); } public void sleep(){ System.out.println(name+"正在睡"); } public void introduction() { System.out.println("大家好!我是" + id + "號" + name + "."); } }
老鼠類
public class Mouse { private String name; private int id; public Mouse(String myName, int myid) { name = myName; id = myid; } public void eat(){ System.out.println(name+"正在吃"); } public void sleep(){ System.out.println(name+"正在睡"); } public void introduction() { System.out.println("大家好!我是" + id + "號" + name + "."); } }
從這兩段代碼可以看出來,代碼存在重復了,導致后果就是代碼量大且臃腫,而且維護性不高(維護性主要是后期需要修改的時候,就需要修改很多的代碼,容易出錯),所以要從根本上解決這兩段代碼的問題,就需要繼承,將兩段代碼中相同的部分提取出來組成 一個父類:
公共父類
public class Animal { private String name; private int id; public Animal(String myName, int myid) { name = myName; id = myid; } public void eat(){ System.out.println(name+"正在吃"); } public void sleep(){ System.out.println(name+"正在睡"); } public void introduction() { System.out.println("大家好!我是" + id + "號" + name + "."); } }
這個Animal類就可以作為一個父類,然后企鵝類和老鼠類繼承這個類之后,就具有父類當中的屬性和方法,子類就不會存在重復的代碼,維護性也提高,代碼也更加簡潔,提高代碼的復用性(復用性主要是可以多次使用,不用再多次寫同樣的代碼) 繼承之后的代碼:
企鵝類
public class Penguin extends Animal { public Penguin(String myName, int myid) { super(myName, myid); } }
老鼠類
public class Mouse extends Animal { public Mouse(String myName, int myid) { super(myName, myid); } }
這里super
在繼承關系中,父類的成員變量、局部變量、方法被隱藏被子類常常覆蓋,這時需要引用父類成員變量、局部變量、方法。
super.變量名,super.方法名,super.父類的構造方法;
這里還引入一個關鍵字this的用法
如果類的成員變量與局部變量重名,類的成員變量將被隱藏,如果要使用類的成員變量,需要使用this引用之。
this.變量名,this.方法名,this.父類的構造方法;
繼承的特性
1.子類擁有父類非private的屬性,方法。
2.子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。
3.子類可以用自己的方式實現父類的方法。
Java的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關系就是C類是B類的父類,B類是A類的父類,這是java繼承區別於C++繼承的一個特性。
4.提高了類之間的耦合性(繼承的缺點,耦合度高就會造成代碼之間的聯系)。