Java学习第六章重点

6.1 接 口

  1. 接口声明:
    接口包含有接口声明和接口体,和类的定义很相似,但不同点是,接口使用关键字interface来声明自己是一个接口。
  2. 例子:
    1
    2
    3
    4
    5
    6
    interface Printable//接口声明,
    {
    final int MAX=100;//无法定义变量,只有常量且有数值,甚至可以没有final
    void add();//只有抽象方法
    float sum(float x,float y);
    }

6.2 接口实现

  1. 类实现接口
    在Java语言中,接口由类来实现以便使用接口中的方法。一个类需要在类中使用关键字 implements 声明该类实现一个或多个接口。如果实现多个接口,用逗号隔开接口名。
    举例:

    1
    2
    3
    4
    5
    6
    7
    8
    class A extends B implements C,D
    {
    类体
    }
    class AA implements C,D
    {
    类体
    }
  2. 重写接口中的方法
    如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。

  3. 实现接口的类的子类自然也实现了该接口
    举例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    }
    class AA implements C,D
    {
    类体
    }
    class B extends//已经实现了该接口
    {
    类体
    }
  4. 接口可以被继承,可以通过 extends 声明一个接口是另一个接口的子接口。接口中的方法与常量都是public的,子接口也将继承父类的全部方法和常量。

  5. 可以用接口名访问接口的常量

6.3 接口的UML图

顶层:名字层,需要用<>修饰名字,并用该修饰和名字分列在两行。

第二层:常量层,列出接口中的常量及类型,格式是“常量名字”,类型。

第三层:方法层,也称操作层,列出接口中的方法及返回类型,格式是“方法名字(参数列表):类型”。

6.4 接口回调

接口属于引用型变量,接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用。比如:假设Com是一个接口,那么就可以用Com声明一个变量:

1
2
3
Com com;
A a=new A();
com=a;//只能可以调用A类中的接口方法

可以把实现某一接口的 类创建的对象的引用(类似于C语言中的地址)赋值给该接口声明的接口变量 ,该接口变量就可以调用被类实现的接口。

6.5 重点:理 解 接 口

##关键点:

  1. 接口可以抽象出重要的行为标准,该行为标准用抽象方法来表示。
  2. 可以把实现接口的类的对象的引用赋值给接口变量,该接口变量可以调用被该类实现的接口方法,即体现该类根据接口里的行为标准给出的具体行为。
  3. 接口只是 行为标准,具体内容由不同的类去声明。
    课本例题:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    package 第六章;

    abstract class MotorVehicles {
    abstract void brake();
    }
    interface MoneyFare
    {
    void charge();
    }
    interface ControlTemperature
    {
    void controlAirTemperature();
    }
    class Bus extends MotorVehicles implements MoneyFare
    {
    public void charge() {
    System.out.println("公交汽车刹车");
    }
    void brake() {
    System.out.println("公交:价格一元/张");
    }

    }
    class Taxi extends MotorVehicles implements MoneyFare,ControlTemperature
    {
    public void charge() {
    System.out.println("出租车收费");
    }
    public void controlAirTemperature() {
    System.out.println("出租车空调");
    }
    void brake() {
    System.out.println("出租车刹车");
    }
    }
    public class Example_6_5
    {
    public static void main(String[] args)
    {
    Bus bus = new Bus();
    Taxi taxi = new Taxi();
    MoneyFare fare;
    ControlTemperature temperature;
    bus.brake();
    fare=bus;//引用赋值
    fare.charge();//接口的方法是bus中定义的
    taxi.brake();
    fare=taxi;
    temperature=taxi;
    fare.charge();
    temperature.controlAirTemperature();

    }
    }

6.6 接口与多态

多态是指,不同的类在实现同一接口时可能具有不同的实现方法,那么接口变量在回调时就可能具有多种形态。
可以看一下6.5的例子,类在重写接口方法的时候方法体不同,也是这也是多态。

6.7 接口参数

如果一个方法的参数是接口类型,我们就可以将任何实现该接口的类的实例的引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法。

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package 第六章;

interface SpeakHello//声明接口
{
void speakhello();
}
class Chinese implements SpeakHello
{
public void speakhello()//重写接口方法
{
System.out.println("您吃饭了吗?");
}
}
class English implements SpeakHello
{
public void speakhello()//重写接口方法
{
System.out.println("Hello, how is it going!");
}
}
class Kindspeak
{
public void lookhello(SpeakHello hello)//接口类型参数
{
hello.speakhello();//接口回调
}
}
public class Example_6_6 {

public static void main(String[] args) {
Kindspeak speak=new Kindspeak();
speak.lookhello(new Chinese());
speak.lookhello(new English());
}
}

6.8 重 点:abstract类与接口的比较

比较如下:

  1. abstract类和接口都可以有abstract方法
  2. 接口中只可以有常量,不能有变量,而abstract既可以有常量也可以有变量。
  3. abstract类中也可以有非abstract方法,接口不可以。
    如果某个问题需要使用继承才能更好地解决,比如,子类除了需要重写父类的abstract方法,还需要 从父类继承一些变量或继承一些重要的非abstract方法 ,就可以考虑使用abstract类。
    如果某个问题 不需要使用继承,只是需要若干个类给出某些重要的abstract方法的实现细节 ,就可以考虑使用接口。

6.9 难 点:面向接口编程

抽象类将其抽象方法的实现交给其子类,而接口将其抽象方法的实现交给实现该接口的类。
接口只关心操作,但不关心这些操作的具体实现细节,把主要精力放在程序设计上,而不拘泥于细节的实现。
核心思想:接口回调
开——闭原则

6.10 难 点:应用举例

应用目的:设计一个广告牌,希望所设计的广告牌可以展示许多公司的广告词

  1. 问题分析
    是否有哪些数据,需要什么功能,行为,标准。
  2. 设计接口(也可以使用抽象类)
    显示内容,显示公司名字(两个行为标准)

    1
    2
    3
    4
    public interface Advertisement {
    public void showAdvertisement();
    public String getCorpName();
    }
  3. 设计广告牌类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    public class AdvertisementBoard {//负责创建广告牌
    public void show(Advertisement adver)
    {
    System.out.println(adver.getCorpName()+"的广告如下");
    adver.showAdvertisement();//接口回调
    }
    }
    public class CompanyA implements Advertisement {//A公司广告

    public void showAdvertisement() {
    System.out.println("@@@@@@@@@@@@@@@");
    System.out.println("我家还蛮大的!");
    System.out.println("@@@@@@@@@@@@@@@\n\n");
    }
    public String getCorpName() {
    return "杰哥之家";
    }
    }
    public class CompanyB implements Advertisement{//B公司广告

    public void showAdvertisement() {
    System.out.println("@white@give@");
    System.out.println("机器学习 人白给!");
    System.out.println("@white@give@\n\n");
    }
    public String getCorpName() {
    return "白给之源";
    }
    }
    public class Guanggao {

    public static void main(String[] args) {
    AdvertisementBoard board = new AdvertisementBoard();
    board.show(new CompanyA());
    board.show(new CompanyB());
    }

    }

要熟练使用接口回调技术以及面向接口编程的思想,以便体现程序设计所体长的“开——闭”原则

坚持原创技术分享,您的支持也将成为我的动力!
-------------本文结束感谢您的阅读-------------
undefined