JavaSE学习之旅

第二章接口(JDK1.7版本)

2.1 接口概念

当一个抽象类中类,所有的方法全部为抽象方法,这样的抽象类,重新定义一个更加贴切的名词,不再称为抽象类,称为接口。

接口是一个特殊形式的抽象类:抽象类可以有抽象方法,或者是非抽象方法,但是接口全是抽象方法。

接口定义:关键字inertface

public interface 接口名{}

2.2 接口成员定义(非常重要)

  • 成员变量

    • 具有固定的定义方式,不可改变

    • public static final 变量的数据类型 变量名 =;
      
    • 修饰符是固定,公共,静态,和最终,变量也称为接口常量.

  • 成员方法

    • 具有固定的定义方式,不可改变

    • public abstract 返回值类型 方法名(参数列表);
      
    • 修饰符固定:公共,抽象

/**
 * 自定义接口:接口名MyInterface
 */
public interface MyInterface {
    //定义接口中的成员变量,常量名大写字母
    //常量名是多个单词全大写,下划线分开
    public static final int A = 1;
    
    //定义接口中的成员方法,抽象
    public abstract void inter();
}

2.3 接口的使用方式(非常重要)

  1. 接口不能实例化对象,不能new
  2. 定义类,实现接口(实现和继承差不多),关键字 implements(实现)
  3. 类重写接口中的抽象方法
  4. 创建实现类对象
/**
 * 自定义接口:接口名MyInterface
 */
public interface MyInterface {
    //定义接口中的成员变量,常量名大写字母
    //常量名是多个单词全大写,下划线分开
    public static final int A = 1;

    //定义接口中的成员方法,抽象
    public abstract void inter();
}
/**
 * 定义类:MyInterfaceImpl 实现接口MyInterface
 * MyInterfaceImpl类,称为接口的实现类
 * implements实现,先理解为继承
 */
public class MyInterfaceImpl implements MyInterface{
    @Override
    public void inter() {
        System.out.println("实现类实现接口,重写方法inter");
    }
}
public class MyInterfaceTest {
    public static void main(String[] args) {
        //创建对象,创建接口实现类的对象
        //可以使用多态性: 接口 变量名 =  new 实现类对象
        MyInterface my = new MyInterfaceImpl();
        my.inter();//方法肯定执行实现类的重写

        //调用接口的常量,静态修饰,接口名直接调用
        System.out.println(MyInterface.A);
    }
}

2.4 接口定义注意事项

接口的修饰符是固定:写和不写都是一样的,可以不写。但是我们心里,写不写一样!

另外接口的修饰符,还可以选择性书写

接口修饰符,我们现在还是写比较好,增加阅读性

2.5 接口的多实现(非常重要)

public class A extends B,C{}  //错误写法,不支持多继承

接口允许类的多实现,一个类可以同时实现多个接口

interface A{}
interface B{}
class C implements A,B{}//接口的多实现,允许的

多实现接口,类就要重写所有接口的抽象方法

public interface A {
    public abstract void interA();
}
public interface B {
    public abstract void interB();
}
    public static void main(String[] args) {
        //C类是接口的多实现,创建对象
        C c = new C();
        c.interA();
        c.interB();
    }
/**
 * C类,同时实现多个接口A和B
 * C类要重写A接口的抽象方法
 * C类要重写B接口的抽象方法
 */
public class C implements A,B{
    @Override
    public void interA() {
        System.out.println("重写接口A的方法");
    }

    @Override
    public void interB() {
        System.out.println("重写接口B的方法");
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AQXRwSgd-1663685097077)(images/3.png)]

2.6 怎么定义成员问题

什么时候写 private static  数据类型 成员变量   
什么时候写 public static   数据类型 成员变量,这样声明的同时必须赋值吗
  • 成员变量–称为属性
    • 属于该事物的特性
    • 定义人,或者定义学生
    • 属性人的特性,属于学生的特性
    • 都要私有修饰,方法访问方式get/set
    • 如果所有的人,或者所有的学生都共享一个数据,就是静态的
    • 多个事物中,有些数据是每个事物自己独有,非静态的属性
    • 多个事物中,有些数据是所有事物共享数据,静态的属性
    • 凡是非静态的属性,私有,没有静态,提供方法get/set
    • 凡是静态的属性:公共的,静态的,最终的,直接赋值
  • 成员方法 – 静态或者非静态
    • 原则:如果一个方法中,没有使用过类中的非静态成员,就应该定义为静态成员
    • 方法使用过类中的非静态成员,这个方法就不能写静态

2.7 接口之间的多继承问题

接口和类是实现关系,一个类可以实现多个接口。接口和接口之间是继承关系,而且接口和接口之间支持多继承关系。一个接口,可以同时继承多个接口。

interface A{}
interface B{}
interface C extends A,B{} //接口之间的多继承,允许的
class D implements C{} //类实现了接口,D类重写接口A,B,C的所有抽象方法

问题:Java中支持多继承吗?类不支持,接口支持多继承

2.8 类继承父类实现多个接口

interface A{}
interface B{}
abstract class C {} //抽象类
class D extends C implements A,B{} //类继承父类,同时实现多个接口 
public interface A {
    public abstract void interA();
}
public interface B {
    public abstract void interB();
}
public abstract class C {
    public abstract void interC();
}
/**
 * D类,继承父类C
 * 同时实现接口A和B
 * D类重写父类的抽象方法,也要重写接口中的抽象方法
 * 创建D类的对象
 */
public class D extends C implements A,B{
    public void interC(){
        System.out.println("重写父类方法");
    }

    public void interA(){
        System.out.println("重写接口A的方法");
    }

    public void interB(){
        System.out.println("重写接口B的方法");
    }
}

2.9 实现类还是抽象类

已知一个实现类,实现接口,重写了一部分接口中的抽象方法,这个实现类依然还是抽象类,不能建立对象。

interface A{
    public abstract void m();
    public abstract void n();
}
//实现,理解为继续,拥有父类的成员
class abstract AImpl implements A{
    public  void m(){}
    public abstract void n();
}

2.10 接口的规则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VHNhw8Dp-1663685097079)(images/4.png)]

更加经典的接口案例:USB接口:鼠标,键盘,手机,网卡,电风扇,打印机 。这些设备工作原理都不同,都可以插入到USB接口,满足USB接口的标准规则

2.11 接口案例(非常重要)

USB接口为例子:笔记本上有一个接口,USB接口,很多的外来设备(鼠标,键盘等等),都是连接在USB接口中工作的。

案例的核心:存在接口USB,笔记本使用USB接口上连接的设备(键盘,鼠标。。。)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gFZ3h3fS-1663685097079)(images/8.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j6IG0ioc-1663685097080)(images/9.png)]

案例难度比较大的地方:方法参数是接口类型,传递参数是接口实现类对象,形成多态性!

/**
 * USB接口:抽象方法,就是接口标准规则
 * 任何设备,连接USB接口,必须满足规则 (实现接口,重写抽象方法)
 */
public interface USB {
    //设备开机
    public abstract void powerOn();

    //设备关机
    public abstract void powerOff();
}
/**
 * 鼠标类:满足USB接口标准,实现接口重写方法
 */
public class Mouse implements USB{
    @Override
    public void powerOn() {
        System.out.println("鼠标开机");
    }

    @Override
    public void powerOff() {
        System.out.println("鼠标关机");
    }
}
/**
 * 键盘类:满足USB接口标准,实现接口重写方法
 */
public class KeyBoard implements USB{
    @Override
    public void powerOn() {
        System.out.println("键盘开机");
    }

    @Override
    public void powerOff() {
        System.out.println("键盘关机");
    }
}
/**
 *  笔记本类:
 *    功能,使用USB接口上连接的设备
 */
public class NoteBook {
    /**
     * 定义方法:使用USB接口设备的方法
     * USB接口设备,是未知的,设备可以是无限的
     * 方法:实现功能的,方法的参数就是方法实现功能的未知数
     * 本案例的方法存在未知数,就是USB 接口设备
     * 但是::这些设备都是USB接口的实现者
     * 方法的参数,不能是键盘,不能是鼠标
     */
    public void useUsb( USB u ){
        //u对象调用方法
        u.powerOn();
        u.powerOff();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值