介面 介面就是一種公共的規範標準 是一種引用數據類型 定義格式 public interface 介面名稱{} java7 中介面可以包含常量,抽象方法;Java8 還可以額外包含預設方法,靜態方法;Java 9 還可以額外包含私有方法 介面的抽象方法使用 介面使用步驟: 1. 介面不能夠直接使用, ...
介面
介面就是一種公共的規範標準 是一種引用數據類型
定義格式
public interface 介面名稱{}
java7 中介面可以包含常量,抽象方法;Java8 還可以額外包含預設方法,靜態方法;Java 9 還可以額外包含私有方法
public interface MyInterfaceAbstract{
//這是一個抽象方法
public abstract void methodAbs();
//介面中的抽象方法,修飾符必須是兩個固定的關鍵字:public abstract
//這兩個關鍵字可以選擇性的省略
abstract void methodAbs2();
public void methodAbs3();
void methodAbs4();
}
介面的抽象方法使用
介面使用步驟:
介面不能夠直接使用,必須有一個“實現類”來實現該介面
格式:
public class 實現類名稱 implements 介面名稱{}
- 介面的實現類必須覆蓋重寫介面中所有的抽象方法
創建實現類對象(new),進行使用
//按照定義格式定義一個介面
//public interface 介面名稱{}
public interface InterfaceDemo {
//介面裡面可以有抽象方法,普通方法
//定義一個抽象方法
public abstract void methodAbs1();
//預設方法
public abstract void methodAbs2();
}
public class InterfaceDemoImpl implements InterfaceDemo{
//回顧一些重寫的概念
//方法名和形參列表一樣
//許可權修飾符必須大於或者等於父類的許可權修飾符
//子類的返回值類型必須小於或者等於父類的返回值類型
@Override
public void methodAbs1() {
System.out.println("天下武功,唯快不破");
}
@Override
public void methodAbs2() {
System.out.println("認真的人,自帶光芒");
}
}
public class newInterfaceDemo {
public static void main(String[] args){
InterfaceDemoImpl inter = new InterfaceDemoImpl();
inter.methodAbs1();
inter.methodAbs2();
}
}
註意事項
如果實現類並沒有覆蓋重寫介面中的所有的抽象方法,那麼這個實現類就必須是抽象類
介面的預設方法定義
public interface InterfaceDemo {
/*
java 8開始,介面允許定義預設方法
格式:
public default 返回值類型 方法名稱(參數列表){
方法體
}
備註:介面當中的預設方法,可以解決介面升級的問題
預設方法可以有方法體
*/
public abstract void methodAbs1();
public default void methodAbs2(){
System.out.println("我是預設方法,可以解決升級問題");
}
public class InterfaceDemoImpl implements InterfaceDemo{
@Override
public void methodAbs1() {
System.out.println("天下武功,唯快不破");
}
//我在這裡並沒有重寫public default void methodAbs2()
//實現介面自動繼承方法
}
public class newInterfaceDemo {
public static void main(String[] args){
InterfaceDemoImpl inter = new InterfaceDemoImpl();
//介面的預設方法也是可以覆蓋重寫的
//這裡就不寫了
inter.methodAbs1();
inter.methodAbs2();
}
}
介面的靜態方法的定義
/*
格式
public static 返回值類型 方法名稱(參數列表){}
*/
public interface InterfaceStatic {
public static void method1(int a,int b){
System.out.println("今天要敲"+a*b+"行代碼");
}
}
public class InterfaceStaticImpl {
//介面中的靜態方法的使用
public static void main(String[] args) {
//直接通過介面名稱.靜態方法的名稱調用即可
InterfaceStatic.method1(15,67);
}
}
介面的私有方法定義
/*
問題描述:
我們需要抽取一個共有方法,用來解決兩個預設方法之間重覆代碼的問題
但是這個共有方法,不應該被是實現類使用,應該私有化的
解決方案
從Java 9 開始,介面當中允許定義私有方法
1.普通私有方法,解決多個預設方法之間重覆代碼問題
格式
private 返回值類型 方法名稱(參數列表){}
2.靜態私有方法,解決多個靜態方法之間重覆代碼問題
格式:
private static 返回值類型 方法名稱(參數列表){}
*/
public interface InterfaceStatic {
public default void method1(){
System.out.println("認真的人,自帶光芒");
method3();
}
public default void method2(){
System.out.println("作日的最佳表現,是今日的最低要求");
method3();
}
private void method3(){
System.out.println("乘風破浪會有時,直掛雲帆濟滄海");
}
}
public class InterfaceStaticImpl implements InterfaceStatic{
public static void main(String[] args) {
InterfaceStaticImpl inter = new InterfaceStaticImpl();
inter.method1();
inter.method2();
//介面中的靜態方法的使用
//想要使用介面的方法,必須要實現介面
//實現完介面後,需要new對象使用
}
}
介面的常量定義和使用
1.介面當中的常量,可以省略public static final ,註意,不寫也照樣是這樣
介面當中的常量,必須進行複製,不賦值不能使用
介面當中的常量名稱,使用完全大寫的字母,用下劃線進行分割
使用格式
介面名稱.常量名稱
多態
多態的前提:extends繼承或者Implements實現,
一個對象擁有多種形態,這就是:對象的多態性
代碼當中體現多態性:父類引用指向子類對象
多態格式
父類名稱 對象名 = new 子類名稱();
或者
介面名稱 對象名= new 實現類名稱();
多態中成員變數的使用特點
//訪問成員變數的兩種方式
//1.直接通過對象名稱訪問成員變數:看等號左邊是誰,優先用誰,沒有向上找
//2.間接通過成員方法訪問
public class Fu {
//子類也有相同的成員變數num
int num = 10;
public void shownum(){
System.out.println(num);
}
}
public class Zi extends Fu{
//與父類相同的成員變數num
int num = 20;
//子類特有的成員變數
int num1 =30;
//重寫方法
@Override
//重寫了父類的方法,
public void shownum(){
System.out.println(num);
}
}
public class Demo01MultiField {
public static void main(String[] args) {
//使用多態的寫法,父類引用指向子類對象
Fu obj = new Zi();
//等號左邊是Fu,優先使用左邊的的成員變數,沒有則向上找
System.out.println(obj.num);//10
//不可能向下找
//System.out.println(obj.num1);編譯報錯
//shownum屬於Fu,則使用Fu的成員變數//10
//當子類覆蓋重寫父類,就屬於Zi類//20
obj.shownum();
}
}
多態中成員方法的使用特點
public class Fu {
//成員方法的訪問規則
//看new的是誰,就優先用誰,沒有則向上找
public void method(){
System.out.println("我是父類");
}
public void methodFu(){
System.out.println("我是父類特有方法");
}
}
public class Zi extends Fu{
public void method(){
System.out.println("我是子類");
}
public void methodZi(){
System.out.println("我是子類特有方法");
}
}
java
public class Demo01MultiField {
public static void main(String[] args) {
Fu obj = new Zi();//多態
obj.method();// 父子都有,new的是zi,優先用zi //輸出結果我是子類
obj.methodFu();//子類沒有,向上找, //輸出結果我是父類特有方法
}
}
多態中成員變數訪問規則和成員方法訪問規則總結
成員變數:看左邊,左邊是哪一個類就優先使用哪一個類。沒有像上找
成員方法:看右邊,new的是哪一個對象就優先使用哪一個對象的方法。沒有向上找
對象的向上轉型
對象的向上轉型,其實就是多態的寫法
格式 父類名稱 對象名 = new 子類名稱();
含義:右側創建一個子類對象,把他當作父類來看待使用
Animal animal = new Cat();創建了一隻貓,當作動物看待
註意事項:向上轉型一定是安全的從小範圍(貓)轉成大範圍(動物)
對象的向下轉型
對象的向下轉型,其實是一個還原的動作
格式:子類名稱 對象名 = (子類名稱)父類對象;
含義,將父類對象,還原成本來的子類對象
Animal animal = new Cat();//本來是貓,向上轉型成為動物
Cat cat = (cat) animal;//本來是貓,已經被當成動物了,還原回來成為本來的貓向下轉型;
instanceof關鍵字進行類型判斷
格式:
對象 instanceof類名稱
這將會得到一個Boolean值結果,也就是判斷前面的對象能不能當作後面類型的實例
筆記本USB介面案例
//先確定一下筆記本電腦有什麼功能
//關機,開機,可以使用各種USB設備
//功能確定好之後寫方法
public class Computer {
public void powerOn() {
System.out.println("筆記本電腦開機了");
}
public void powerOff() {
System.out.println("筆記本電腦關機了");
}
public void usbDevice(USB usb) {
usb.open();
if (usb instanceof Mouse) {
Mouse mouse = (Mouse) usb;
mouse.click();
} else if (usb instanceof KeyBoard) {
KeyBoard keyboard = (KeyBoard) usb;
keyboard.type();
}
//usb.close();
}
}
//usb設備需要設置成介面,並且有抽象方法,
//因為usb設備都有著共性的方法,和非共性的方法,我們需要把共性的方法給抽取出來
//usb設備都有開關的功能
public interface USB {
//打開設備的功能
public abstract void open();
//關閉設備的功能
public abstract void close();
}
//現在設置一個usb設備
//去實現USB介面
//實現了這個USB介面才可以在Computer類中傳遞進去,有了USB設備,滑鼠才是一個完整的電腦
//現在就去實現這個介面吧
public class Mouse implements USB {
//必須重寫抽象方法
@Override
public void open() {
System.out.println("滑鼠插入");
}
@Override
public void close() {
System.out.println("滑鼠拔出");
}
//滑鼠特有的方法
public void click() {
System.out.println("滑鼠點擊");
}
}
//也是一個USB設備
public class KeyBoard implements USB {
//重寫方法
@Override
public void open() {
System.out.println("鍵盤插入。。。");
}
@Override
public void close() {
System.out.println("鍵盤拔出");
}
//鍵盤特有方法
public void type() {
System.out.println("鍵盤打字");
}
}
//現在可以創建一個電腦了
public class ComputerImple {
public static void main(String[] args) {
//創建一個筆記本對象
Computer computer = new Computer();
//啟動筆記本
computer.powerOn();
//創建USB介面
USB usb = new Mouse();
//傳遞介面
computer.usbDevice(usb);
USB usb1 = new KeyBoard();
computer.usbDevice(usb1);
//關閉筆記本
computer.powerOff();
}
}