Java接口【final、interface】

1、final(掌握)

1.1 final修飾變量

  • 生活生產中有些數據是不可變的,作成常量java

  • 使用final修飾的變量成爲常量,不可再次賦值小程序

  • final修飾的變量必須在聲明的後面直接賦值框架

常量

  • 字面值常量ide

    • 1/3/555aaa、hhh、hehehe學習

  • 自定義常量測試

    • 把變量使用final修飾this

    • final int area = 960spa

    • 命名自定義常量的時候字母所有大寫,多個單詞使用下劃線鏈接設計

package com.qf.final0;

public class Demo01 {
public static void main(String[] args) {
double pi = Math.PI;
System.out.println(pi);

double pI2 = MathUtil.PI;
System.out.println(pI2);

// 這個圓周率能夠被任意修改,不合理,作成常量不可修改
// MathUtil.PI = 6.666;
double pI3 = MathUtil.PI;
System.out.println(pI3);
}
}

class MathUtil{
// 生活生產中有些數據是不可變的,作成常量
public static final double PI = 3.141592653589793;
}

引用類型常量

  • 引用地址不能夠改變對象

  • 對象中的內容能夠改變

1.2 final修飾類

  • 被final修飾的類成爲最終的類

  • 這個類不能被繼承,沒有子類

1.3 final修飾方法

  • final修飾的方法成爲最終的方法

  • 能夠被所在類的子類繼承使用

  • 不能被重寫

package com.qf.final0;

public class Demo05 {
public static void main(String[] args) {
double pi = Math.PI;
String str = "heiheihei";
System.out.println();

Students s01 = new Students();
// 子類能夠繼承到final修飾的方法
s01.bitCard();
}
}

final class Calculator{
public static int getSum(int...is) {
int sum = 0;
for (int i = 0; i < is.length; i++) {
sum += is[i];
}
return sum;
}
}

// 最終的類沒法被繼承,沒有子類
// class Calculator000 extends Calculator{}

class Student{
String name;
int age;

// 被final修飾的方法能被繼承,不能被重寫
public final void bitCard() {
System.out.println("咱們須要使用小程序在校區附近打卡....");
}
}

class Students extends Student{

/*
public final void bitCard() {
System.out.println("咱們須要使用小程序在校區附近打卡....");
}
*/
}

1.4 final小結

 

 

2、接口(掌握)

2.1 定義

  • 在java中使用interface聲明的內容成爲接口

  • 接口中的變量只能是公開靜態常量

  • 接口中的方法只能是公開抽象方法

  • 接口不能直接建立對象

2.2 驗證接口中屬性的修飾符

  • 接口和測試類

package com.qf.inter;

public class Demo01 {
public static void main(String[] args) {
String field = MyInterface.FIELD;
System.out.println(field);

// 能使用類名直接調用說明是static修飾
String yourField = YourInterface.YOUR_FIELD;
System.out.println(yourField);

// 不能從新賦值說明是final修飾
// YourInterface.YOUR_FIELD = "嘿嘿嘿";

}
}

interface MyInterface{
// 屬性:公開、靜態、常量
public static final String FIELD = "接口中的FIELD";

// 方法:公開、抽象方法
public abstract void show();

}


interface YourInterface{
String YOUR_FIELD = "沒有修飾符的FIELD";
}
  • 驗證public

package com.qf.inter;

public interface Demo02 {
String OUR_FIELD = "Demo02中的OUR_FIELD";
}
package com.qf.final0;

import com.qf.inter.Demo02;

public class Demo06 {
public static void main(String[] args) {
// 在其餘包中也能訪問到,說明默認修飾符是public
String ourField = Demo02.OUR_FIELD;
System.out.println(ourField);
}
}

3、接口和抽象類(掌握)

3.1 相同點

  • 能夠生產字節碼文件

  • 能夠聲明爲引用類型

  • 不能直接建立對象

  • 擁有Object中全部的方法

3.2 不一樣點

  • 接口中全部的屬性都是公開、靜態、常量,默認使用public static final修飾

  • 接口中的方法都是公開、抽象方法,默認使用public abstract修飾

  • 接口中沒有構造方法、動態代碼塊、靜態代碼塊

4、接口的基本使用(掌握)

4.1 定義

  • 接口不能直接建立對象

  • 可讓一個類實現接口,重寫接口中的方法

  • 類能夠在繼承其餘類的同時,實現多個接口

  • 而後建立這個類的實例,使用重寫以後的方法

4.2 USB案例

package com.qf.inter;

public class Demo03 {
public static void main(String[] args) {
ACER acer = new ACER();
acer.power();
acer.transfer();

System.out.println("=================");

USB usb = new ACER();
usb.power();
usb.transfer();

}
}

/**
* USB 接口
* 定義了屬性電壓和版本
* 定義了方法充電和傳輸數據
* @author Dushine2008
*
*/
interface USB{
// 屬性
double VOLTAGE = 5.0;
double VERSION = 3.0;

// 方法
public abstract void power();

public abstract void transfer();
}

/**
* 子類宏碁電腦
* 實現接口USB
* @author Dushine2008
*
*/
class ACER implements USB{

@Override
public void power() {
System.out.println("個人電腦品牌是宏碁,供電電壓是5.0V,最大電流是2A...");
}

@Override
public void transfer() {
System.out.println("個人電腦USB版本是" + VERSION + ",傳輸數據速率嫩達到6Gbps...");
}

}

5、接口的多態(掌握)

5.1 接口多態的向上轉型

  • 接口能夠用做變量的聲明

  • 聲明接口的類型,引用指向實現接口的類建立的對象

  • 這個是向上轉型的多態

package com.qf.inter;

public class Demo04 {
public static void main(String[] args) {
/**
* Dog類
* 繼承Animal
* 實現Runnable接口
* 實現Swiming接口
*/
Dog dog = new Dog("道哥", 2);
dog.run();
dog.swim();
dog.eat();
dog.sleep();

System.out.println("================================");

Animal animal = new Dog();
animal.eat();
animal.sleep();

System.out.println("================================");

Runnable runnable = new Dog();
runnable.run();

System.out.println("================================");

Swimable swimable = new Dog();
swimable.swim();

}
}

/**
* 動物類
* 定義了屬性和方法
* @author Dushine2008
*
*/
class Animal{
String name;
int age;

public Animal() {
super();
}

public Animal(String name, int age) {
super();
this.name = name;
this.age = age;
}

public void eat() {
System.out.println("不少動物都是雜食性的...");
}

public void sleep() {
System.out.println("大部分動物晚上睡覺...");
}
}

/**
* 能奔跑的接口
* @author Dushine2008
*
*/
interface Runnable{
void run();
}

/**
* 能游泳的接口
* @author Dushine2008
*
*/
interface Swimable{
void swim();
}

/**
* Dog類
* 繼承了Animal,得到了Animal中全部非私有的屬性和方法
* 實現了Swimable接口,重寫了游泳的方法
* 實現了Runnable接口,重寫了奔跑的方法
* @author Dushine2008
*
*/
class Dog extends Animal implements Runnable,Swimable{

public Dog() {
super();
}

public Dog(String name, int age) {
super(name, age);
}

/**
* 來自Swimable中的方法
*/
@Override
public void swim() {
System.out.println("狗子天生就會游泳,狗刨這個姿式來來自狗子...");
}

@Override
public void run() {
System.out.println("狗子奔跑的時候用四條腿,速度比人要快一些....");
}

}

5.2 接口多態的向下轉型

  • 把聲明的父類引用轉換回原來的類型

package com.qf.inter;

public class Demo05 {
public static void main(String[] args) {
/**
* Dog類
* 繼承Animal
* 實現Runnable接口
* 實現Swiming接口
*/
Dog5 dog = new Dog5("道哥", 2);
dog.run();
dog.swim();
dog.eat();
dog.sleep();

System.out.println("================================");

Animal5 animal = new Dog5();
animal.eat();
animal.sleep();

Dog5 dog5 = (Dog5) animal;
dog5.run();
dog5.swim();
dog5.eat();
dog5.sleep();

System.out.println("================================");

Runnable5 runnable = new Dog5();
runnable.run();

Dog5 dog05 = (Dog5) runnable;
dog05.run();
dog05.swim();
dog05.eat();
dog05.sleep();

System.out.println("================================");

Swimable5 swimable = new Dog5();
swimable.swim();

// Runnable r = (Runnable) swimable;

}
}

/**
* 動物類
* 定義了屬性和方法
* @author Dushine2008
*
*/
class Animal5{
String name;
int age;

public Animal5() {
super();
}

public Animal5(String name, int age) {
super();
this.name = name;
this.age = age;
}

public void eat() {
System.out.println("不少動物都是雜食性的...");
}

public void sleep() {
System.out.println("大部分動物晚上睡覺...");
}
}

/**
* 能奔跑的接口
* @author Dushine2008
*
*/
interface Runnable5{
void run();
}

/**
* 能游泳的接口
* @author Dushine2008
*
*/
interface Swimable5{
void swim();
}

/**
* Dog類
* 繼承了Animal,得到了Animal中全部非私有的屬性和方法
* 實現了Swimable接口,重寫了游泳的方法
* 實現了Runnable接口,重寫了奔跑的方法
* @author Dushine2008
*
*/
class Dog5 extends Animal5 implements Runnable5,Swimable5{

public Dog5() {
super();
}

public Dog5(String name, int age) {
super(name, age);
}

/**
* 來自Swimable中的方法
*/
@Override
public void swim() {
System.out.println("狗子天生就會游泳,狗刨這個姿式來來自狗子...");
}

@Override
public void run() {
System.out.println("狗子奔跑的時候用四條腿,速度比人要快一些....");
}

}

6、接口和類常見關係(掌握)

  • 類和類

    • 單繼承,多層繼承

    • 使用extends

  • 類和接口

    • 多實現,一個類能夠在繼承另外一個類的同時再實現多個接口

    • implements 接口1,接口2接口3。。。

  • 接口和接口

    • 多繼承

    • 接口A extends 接口B,接口C,接口D....

package com.qf.inter;

public class Demo06 {
public static void main(String[] args) {
Lenove lenove = new Lenove();
lenove.power();
lenove.transferHDMI();
lenove.transferVGA();
lenove.readROM();
lenove.RAM();
lenove.ROM();
lenove.start();
lenove.shutdown();
lenove.signalCommunicate();
}
}

/**
* 電腦類
* 定義了電腦通用的屬性和方法
* @author Dushine2008
*
*/
class Computer{
// 屬性
String brand;
int price;
int weight;
int size;

// 方法
public void start() {
System.out.println("電腦必須能夠經過電源鍵開機...");
}

public void shutdown() {
System.out.println("電腦關機能夠分爲軟關機和硬關機...");
}

}

/**
* VGA接口,提供VGA協議規定的數據傳輸方式
* @author Dushine2008
*
*/
interface VGA{
void transferVGA();
}

/**
* HDMI接口,提供HDMI協議規定的數據傳輸方式
* @author Dushine2008
*
*/
interface HDMI{
void transferHDMI();
}

/**
* 電源接口
* @author Dushine2008
*
*/
interface Power{
void power();
}

/**
* 網線接口
* @author Dushine2008
*
*/
interface RJ45{
void signalCommunicate();
}

/**
* 光驅接口
* @author Dushine2008
*
*/
interface CdDrive{
void readROM();
}

/**
* 主板接口,繼承VGA,HDMI,Power,RJ45
* 本身獨有的方法內存、硬盤、CPU
*
* @author Dushine2008
*
*/
interface Board extends VGA,HDMI,Power,RJ45{
void RAM();

void ROM();
}

class Lenove extends Computer implements Board,CdDrive{

@Override
public void transferVGA() {
System.out.println("VGA信號傳輸效果然贊!!!!");

}

@Override
public void transferHDMI() {
System.out.println("HDMI信號傳輸效果geng贊!!!!");

}

@Override
public void power() {
System.out.println("這款電腦即使是沒有電池也能正常工做...");
}

@Override
public void signalCommunicate() {
System.out.println("這款電腦不插網線也能瀏覽網頁...");
}

@Override
public void readROM() {
System.out.println("這款電腦提供了光驅,能夠看DVD裏面的大片...");
}

@Override
public void RAM() {
System.out.println("這款電腦內存8G,能夠運行多數軟件...");
}

@Override
public void ROM() {
System.out.println("這款電腦磁盤1T,能夠存儲800部大片...");
}

}

7、常量接口(掌握)

  • 存放一些經常使用的常量

  • 調用的時候直接使用 接口名.常量名就能獲取到具體的內容,簡單方便

package com.qf.inter;

public interface Constants {
String USERNAME = "root";
String PASSWORD = "root1234";
String HOST_NAME = "localhost:3306";
String DB_NAME = "";
}

8、接口回調(熟悉)

  • 在咱們學習每週會有一次週考

  • 講師分配週考的任務給學生

  • 學生作週考題目,作完以後把結果反饋給講師

    • 須要考試這樣一個接口

    • 講師類實現考試接口,再定義接收結果的方法

    • 學生類中定義作考試題的方法

8.1 案例01

package com.qf.callback;

public class Demo01 {
public static void main(String[] args) {
Student stu = new Student("zhangsan");
Teacher teacher = new Teacher(stu);

teacher.doTest("java基礎測試");

}
}

/**
* java考試的接口
* @author Dushine2008
*
*/
interface JavaTest{
void doTest(String testName);
}

class Teacher implements JavaTest{
Student student;

public Teacher(Student student) {
super();
this.student = student;
}

@Override
public void doTest(String testName) {
System.out.println("講師開始分配任務.............");
student.doTest(testName,this);
}

public void getResult(String result) {
System.out.println("接收到學生傳來的結果:" + result);

}

}

class Student{
String name;

public Student(String name) {
super();
this.name = name;
}

public void doTest(String testName, Teacher teacher) {
System.out.println("學生接收到任務..............");
System.out.println(name + "開始認真作" + testName);
System.out.println("100分鐘以後.........");
teacher.getResult("試題作完啦啦啦啦啦啦");
}
}

8.2 案例02

package com.qf.callback;

public class Demo02 {
public static void main(String[] args) {
Worker worker = new Worker("卓別林");
Boss boss = new Boss(worker);

boss.task("擰一萬個螺絲");
}
}

/**
* 接口公司
* 進了公司有任務須要作
* @author Dushine2008
*
*/
interface Company{
void task(String taskName);
}

/**
* Boss類
* 實現公司接口中的任務方法
* 在任務方法中分配任務
* @author Dushine2008
*
*/
class Boss implements Company{
Worker worker;

public Boss(Worker worker) {
super();
this.worker = worker;
}

/**
* 重寫接口中的任務方法
*/
@Override
public void task(String taskName) {
System.out.println("Boss開分配任務:" + taskName);
worker.work(taskName,this);
}

/**
* boss接收結果的方法
* @param worker
* @param result
*/
public void getResult(Worker worker, String result) {
System.out.println(worker.name + "回覆:" + result);
}

}

/**
* 工人類
* 接收boss分配的任務
* 作完任務後調用boss接收消息的方法反饋內容
* @author Dushine2008
*
*/
class Worker{
String name;

public Worker(String name) {
super();
this.name = name;
}

/**
* 工人作工的方法
* @param taskName boss分配的任務
* @param boss 分配任務的boss
*/
public void work(String taskName, Boss boss) {
System.out.println("工人接收到任務:" + taskName);
System.out.println(this.name + "開始努力作任務:" + taskName);
System.out.println("100分鐘以後給boss的回覆............");
boss.getResult(this,"任務完成!!!");
}

}

9、接口的好處(理解)

  • 下降程序的耦合性
  • 更天然的使用多態
  • 徹底分離設計與實現
  • 搭建程序框架更容易
  • 更容易更換具體實現

10、總結

  • 什麼是接口:
    • 微觀:接口是一種能力和約定
    • 宏觀:接口是一種標準
  • 接口與類的異同
    • 沒有構造方法,僅可定義公開靜態常量公開的抽象方法
  • 接口的應用
    • java爲單繼承,當父類的方法種類沒法知足子類需求時,可實現接口擴充子類能力
  • 接口的規範
    • 任何類在實現接口時,必須實現接口中全部的抽象方法,不然此類爲抽象類
  • 什麼是常量接口
    • 將多個經常使用於表示狀態或固定值的變量,以靜態常量的形式定義在接口中統一管理
  • 什麼是接口的回調
    • 先有接口的使用者,後有接口的實現者
相關文章
相關標籤/搜索