1. 程式人生 > >JAVA學習總結(四)

JAVA學習總結(四)

服務 共同點 運行 blog 重要 程序員 ride 處理 mob

1.接口 interface

1.1語法:

  修飾符 interface 接口名{
    常量
    都是抽象方法
  }

修飾符:默認 | public
接口名:自定義,規則與類名相同,一般I字母打頭:wifi接口(Iwifi)

//示例:
    public interface Iwifi{
        int COUNT=1public abstract void send();//發送
        public void receive();//接收
        
    }

1.2接口與類的區別:  

  接口不能用於實例化對象。
  接口沒有構造方法。
  接口中所有的方法必須是抽象方法。
  接口不能包含成員變量,除了 static 和 final 變量。
  接口不是被類繼承了,而是要被類實現。
  接口支持多重繼承。

1.3接口特性:

  1.接口中每一個方法也是隱式抽象的,接口中的方法會被隱式的指定為 public abstract(只能是 public abstract,其他修飾符都會報錯)。

  2.接口中可以含有變量,但是接口中的變量會被隱式的指定為 public static final 變量(並且只能是 public,用 private 修飾會報編譯錯誤。

  3.接口中的方法是不能在接口中實現的,只能由實現接口的類來實現接口中的方法。

1.4、為什麽需要接口

繼承:描述事物的自然屬性和行為的復用。

接口:描述事物的社會屬性和行為的復用。

1、重要性:在Java語言中, abstract class 和interface 是支持抽象類定義的兩種機制。正是由於這兩種機制的存在,才賦予了Java強大的 面向對象能力。

2、簡單、規範性:如果一個項目比較龐大,那麽就需要一個能理清所有業務的架構師來定義一些主要的接口,這些接口不僅告訴開發人員你需要實現那些業務,而且也將命名規範限制住了(防止一些開發人員隨便命名導致別的程序員無法看明白)。

3、維護、拓展性:比如你要做一個畫板程序,其中裏面有一個面板類,主要負責繪畫功能,然後你就這樣定義了這個類。

4、安全、嚴密性:接口是實現軟件松耦合的重要手段,它描敘了系統對外的所有服務,而不涉及任何具體的實現細節。這樣就比較安全、嚴密一些(一般軟件服務商考慮的比較多)。

因為類具有“單根性”,所有的類只能有一個直接父類,通過可以實現一個類有多個父類,可以實現多重繼承。

java特點之一:單一繼承,但能實現多個接口。

1.5、接口的特點

1)、接口中的方法可以有參數列表和返回類型,但不能有任何方法體。

2)、接口中可以包含字段,但是會被隱式的聲明為static和final。

3)、接口中的字段只是被存儲在該接口的靜態存儲區域內,而不屬於該接口。

4)、接口中的方法可以被聲明為public或不聲明,但結果都會按照public類型處理。

5)、當實現一個接口時,需要將被定義的方法聲明為public類型的,否則為默認訪問類型,Java編譯器不允許這種情況。

6)、如果沒有實現接口中所有方法,那麽創建的仍然是一個接口。子類必須實現接口中未實現的方法,除非子類也是接口。

7)、擴展一個接口來生成新的接口應使用關鍵字extends,實現一個接口使用implements。

8)、接口中的方法是抽象方法(abstract),不能是靜態方法(static))、接口的所有方法都是抽象的,而抽象方法是沒有static,有static的方法是不能override的,所以這樣定義接口才有意義。

接口中的字段是默認為:static final ,通俗說就是常量。

1.6類如何實現接口:

//示例:
    public class Mobile implements IWifi{
        public void send1(){
            System.out.println("用wifi發送信息");
        }
        public void receive1(){
            System.out.println("用wifi接收信息");
        }
        public void send(){
            System.out.println("用手機發短");
        }
    }

註意:
  1.類如果沒有實現全部的抽象方法,這個類必須定義為抽象類implements關鍵字
  2.接口可以被子接口繼承,使用extends關鍵字
  3.子類可以繼承一個父類,實現多個接口
  4.接口不能實例化對象,但接口類型變量可以引用實現的子類對象

//示例:
    public interface IUSB2{
        public abstract void send2();
        public void receive2();
    }

    public interface IUSB3 extends IUSB2{
        public abstract void connection(IUSB3 usb);        
    }
//示例:繼承一個父類,實現多個接口
public class Computer{
    public void downLoad(){}
    public void upLoad(){}
    ...
}
public class Dell_Computer extends Computer implements IWifi,IUSB3{
    public  void connection(IUSB3 ortherUsb){
        System.out.println("this<-->ortherUsb");
        System.out.println("連接USB3.0設置");
    }
    public  void send1(){
        System.out.println("用wifi發送信息");
    }
    public void receive1(){
        System.out.println("用wifi接收信息");
    }
    public  void send2(){
        System.out.println("用USB3.0發送信息");
    }
    public void receive2(){
        System.out.println("用USB3.0接收信息");
    }
}

接口不能實例化對象,但接口類型變量可以引用實現的子類對象

IWifi wifi設備1 = new Mobile();
Mobile 手機= new Mobile();
wifi設備1 可以訪問的方法:send1()和receive1();
手機 可以訪問的方法:send1(),receive1(),send();

IWifi wifi設備2 = new Dell_Computer();
IUSB2 設備3 = new Dell_Computer();
IUSB3 設備4 = new Dell_Computer();
Computer 電腦 = new Dell_Computer();
Dell_Computer 筆記本 = new Dell_Computer();

wifi設備2 可以訪問的方法:send1()和receive1();
設備3 可以訪問的方法:send2()和receive2();
設備4 可以訪問的方法:send2(),receive2()和connection(參數);
電腦 可以訪問的方法:downLoad()和upLoad();
筆記本 可以訪問的方法:send1(),receive1(),send2(),receive2(),connection(參數),downLoad()和upLoad();

二、抽象類

2.1、語法定義

抽象類定義,抽象類前使用abstract關鍵字修飾,則該類為抽象類。

2.2、用途

a、在某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但無法準確知道這些子類如何實現這些方法
(抽象類約束子類必須有哪些方法,但並不關註子類怎麽去實現這些方法。)

b、從多個具有相同特征的類中抽象出一個抽象類,以這個抽象類作為子類的模板,從而避免了子類設計的隨意性。

2.3、意義

限制規定子類必須實現某些方法,但不關註實現細節。

2.4、特點

1,抽象方法一定在抽象類中

2,抽象方法和抽象類都必須被abstract關鍵字修飾

3,抽象類不可以用new創建對象。因為調用抽象方法沒意義4,抽象類中的抽象方法要被使用,必須由子類復寫起所有的抽象方法後,建立子類對象調用。

如果子類只覆蓋了部分抽象方法,那麽該子類還是一個抽象類。

5、抽象方法沒有方法體,以分號結束

//示例
package com.zhangguo.chapter5.s2;

import java.util.Scanner;

/** 動物 */
public abstract class Animal {
    /** 名稱 */
    public String name;

    /** 抽象方法,無方法體,必須被子類實現(重寫) */
    public abstract void eat();
    
    /**測試*/
    public static void main(String[] args) {
        //LSP 裏氏替換原則
        Animal dog=new Dog();
        dog.name="博美";
        //int i=1;
        //Scanner input=new Scanner(System.in);
        dog.eat();
    }
    
    /**抽象類中可以有非抽象方法,可以有靜態方法*/
    public void show(){};
}

/**抽象類動物(Animal)的子類,必須實現父類未實現的方法*/
class Dog extends Animal {
    //註解
    @Override
    public void eat() {
        System.out.println(this.name+"狗在吃骨頭");
    }
}

運行結果:

技術分享圖片

2.5抽象類和接口的區別:

共同點與區別:
  1.繼承的層次結構都是上層。
  2.都不能實例化對象。
  3.接口所有方法都是抽象,變量都是public static final類型,抽象類可以有抽象方法和常量。
  4.抽象類只能作為唯一的父類,接口可以實現多個也可以被繼承。
  5.抽象類由abstract class定義,接口由interface定義。
  6.父類與子類是"is a"的關系,父類是抽象類,父類與子類是"like a"的關系,父類是接口。

三、Final(最終的)

3.1、final修飾類

  final修飾的類不允許被繼承。

  一個類不能既是final的,又是abstract的。因為abstract的主要目的是定義一種約定,讓子類去實現這種約定,而final表示該類不能被繼承,兩者矛盾。

技術分享圖片

3.2、final修飾方法

  final修飾方法,表示該方法不能被子類中的方法覆寫Override。不能被重寫

技術分享圖片

3.3、final修飾變量

  final成員變量表示常量,只能被賦值一次,賦值後值不再改變

  當final修飾一個原生數據類型時,表示該原生數據類型的值不能發生變化;

  如果final修飾一個引用類型時,表示該引用類型不能再指向其他對象了,但該引用所指向的對象的內容是可以發生變化的。

  本質上是一回事,因為引用的值是一個地址,final要求值,即地址的值不發生變化。

  final修飾一個成員變量(屬性),必須要顯示初始化。

  這裏有兩種初始化方式,一種是在變量聲明的時候初始化;第二種方法是在聲明變量的時候不賦初值,但是要在這個變量所在的類的所有的構造函數中對這個變量賦初值。

  當函數的參數類型聲明為final時,說明該參數是只讀型的。

  技術分享圖片

JAVA學習總結(四)