02-接口、static、final、代码块

1、Interface

1.1、概念

​ 接口中全是抽象方法,接口是比抽象类还抽象的类,接口体现的是规范

1.2、格式

interface 接口名{
常量;
抽象方法;
}

1.3、类实现接口的格式

  • 类和接口是实现关系----implements
  • class 类名 implements 接口
  • 实现了接口的类称为--实现类

1.4、接口使用步骤

    1. 定义类实现接口
    2. 重写抽象方法
    3. 使用实现类(创建实现类对象,调用方法)

1.5、示例代码

USB接口

// Usb接口 接口=规范, 交给实现类做具体实现
public interface Usb {
    // 连接电脑
    public abstract void connect();
    // 传输数据
    public abstract void sendData();
    // 断开连接
    public abstract void disconnect();
}

USB鼠标

// Usb鼠标实现Usb接口
public class UsbMouse implements Usb {
    @Override
    public void connect() {
        System.out.println("Usb鼠标连接啦");
    }
    @Override
    public void sendData() {
        System.out.println("Usb鼠标发送数据");
    }
    @Override
    public void disconnect() {
        System.out.println("Usb鼠标断开");
    }
}

USB键盘

// Usb键盘实现Usb接口
public class UsbKeyboard implements Usb {
    @Override
    public void connect() {
        System.out.println("Usb键盘连接啦!");
    }
    @Override
    public void sendData() {
        System.out.println("Usb键盘发送数据!");
    }
    @Override
    public void disconnect() {
        System.out.println("Usb键盘断开连接!");
    }
}

测试类

public class Demo05 {
    public static void main(String[] args) {
        // 不能创建接口对象
        // Usb usb = new Usb();
        // 使用接口的实现类
        // 创建Usb鼠标
        UsbMouse usbMouse = new UsbMouse();
        usbMouse.connect();
        usbMouse.sendData();
        usbMouse.disconnect();
        System.out.println("--------------------------------------");
        // 创建Usb键盘
        UsbKeyboard usbKeyboard = new UsbKeyboard();
        usbKeyboard.connect();
        usbKeyboard.sendData();
        usbKeyboard.disconnect();
    }
}

1.6、接口中成员的特点

  • 接口中的方法默认就是抽象方法,会自动添加:public abstract
  • 接口中定义的变量是常量,会自动添加:public static final

1.7、接口的多实现

1.7.1、Java中类只能单继承

  • 一个类只有一个父类
    • class 子类 extends 父类

1.7.2、Java中类可以同时实现多个接口

  • class 类名 implements 接口1,接口2,接口3,....

1.8、接口的多继承

  • interface 接口名 extends 接口1,接口2,....
  • 开发中一般很少用接口多继承,主要是源代码中可能会看到

1.8.1 面试题

  • Java中有多继承吗?
    • 类只能单继承
    • 接口可以多继承

1.9 JDK1.8以后有关接口的新增方法

1.9.1、默认方法

  • 默认方法的格式
    • public default 返回值类型 方法名(参数列表)
  • 默认方法的使用
    • 实现类直接使用
    • 重写接口的默认方法

1.9.2、静态方法

  • 静态方法的格式
    • 修饰符 static 返回值类型 方法名()
  • 静态方法的使用
    • 接口名.静态方法名();

1.9.3、私有方法

  • 私有方法格式
    • private 返回值类型 方法名()
  • 私有方法的使用
    • 给本接口的默认方法或静态方法使用

示例代码

接口类
public interface Aaa {
    // JDK8接口新增默认方法
    // 1.实现直接使用
    // 2.重写接口的默认方法
    default void test01() {
        System.out.println("我是接口默认方法");
        test03();
        test03();
    }
    // JDK8接口新增静态方法
    // 接口名.静态方法名();
    static void test02() {
        System.out.println("我是接口静态方法");
        test03();
    }
     // JDK9接口新增私有方法 (给本接口的其他方法使用)
    // 接口的私有方法是JDK9推出的.如果同学们使用JDK1.8会报错,不识别,忽略即可
    private static void test03() {
        System.out.println("我是接口私有方法");
    }
}
测试类
public class Demo09 {
    public static void main(String[] args) {
        Bbb bbb = new Bbb();
        bbb.test01();
        // 接口名.静态方法名();
        // bbb.test02();
        Aaa.test02();
        // bbb.test03();
    }
}

2、static

2.1 static修饰成员变量

2.1.1、概念

  • static是静态的意思,可以修饰成员变量和成员方法

2.1.2、 作用

  • static修饰的变量在内存中只有一份,可以被这个类的所有对象直接共享访问,解决特定场景问题,同时减少内存消耗。

2.1.3、格式

  • 对象名.静态成员变量
  • 类名.静态成员变量(建议使用的格式)

2.2、static修饰成员方法

2.2.1、概念

​ static修饰的方法是静态方法

2.2.2、作用

​ 可以使用类名调用

2.2.3、格式

  • 对象名.静态方法()
    • eg: new Student().daKa();
  • 类名.静态成员方法()---(建议使用的格式)
    • Student.daKa();

2.2.4、注意事项

  • 同一个类中,静态方法只能访问静态修饰的成员
    • 静态只能访问静态
  • 静态方法中没有this关键字

3、modifier

3.1、概念

​ 是用来控制一个类中成员能够被访问的范围

3.2、使用

​ 可以修饰成员变量,成员方法,构造器,内部类

3.3、作用范围

  • 作用范围从小到大
    • private < 缺省 < protected < public

3.4、常用的modifier

  • private,私有的,只有本类可以使用
  • public,公开的,所有地方都能使用

3.5、不常用的modifier

  • 缺省的(即默认的),给本包的类使用
  • protected,受保护的,给子类使用

3.6、定义成员的一般要求

  • 成员变量一般私有,并设置get、set方法
  • 方法一般公开

4、final

4.1、概念

​ final关键字是最终、不可变的意思

4.2、使用

​ 可以修饰类、方法、变量

4.3、final关键字修饰的特点

  • 修饰类
    • 表明该类是最终类,不能被继承
  • 修饰方法
    • 表明该方法是最终方法,不能被重写
  • 修饰变量
    • 表示该变量是常量,即该变量第一次赋值后,不能多次被赋值

4.4、注意事项

  • 变量是基本类型
    • final修饰指的是基本类型的数据值不能发生改变
  • 变量是引用类型
    • final修饰指的是引用类型的地址置不能发生改变,但是地址里面的内容是可以发生改变的

5、code block

5.1、概念

​ {}括号括起来的代码被称为代码块

5.2、构造代码块

  • 格式
    • {}
  • 特点
    • 每次创建对象,调用构造器执行前,都会执行该代码块中的代码

5.3、静态代码块

  • 格式
    • static {}
  • 特点
    • 随着类的加载而加载,执行的最早,并且自动触发一次
  • 使用场景
    • 做一些静态数据初始化的操作

5.4、示例代码

Student类

public class Student {
    public Student() {
        System.out.println("构造器执行啦!");
    }
    // 静态代码块
    static {
        System.out.println("静态代码块执行啦!");
    }
    // 构造代码块
    {
        System.out.println("构造代码块执行啦!");
    }
}

测试类

public class Demo14 {
    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student();
        Student s3 = new Student();
    }
}

执行效果

静态代码块执行啦!
构造代码块执行啦!
构造器执行啦!
构造代码块执行啦!
构造器执行啦!
构造代码块执行啦!
构造器执行啦!

5.5、静态代码块案例:斗地主游戏

  • 定义一个静态的ArrayList集合存储牌
  • 使用静态代码块进行静态集合的初始化操作,将54张牌存入到静态集合中去

Room类

// 房间, 创建一个房间就要准备好一副牌 (54张)
public class Room {
    // 类型 变量名 = 值;
    private static String name = "房间一";
    // 静态的成员变量
    private static ArrayList<String> pokerList = new ArrayList<>();
    // 一创建房间就要有一副牌,我们选在在静态代码块中创建
    static {
        pokerList.add("大王");
        pokerList.add("小王");
        String[] numbers = {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"};
        String[] colors = {"♠", "♥", "♣", "♦"};
        // 遍历花色
        for (int i = 0; i < colors.length; i++) {
            String color = colors[i];
            // 遍历数字
            for (int j = 0; j < numbers.length; j++) {
                String number = numbers[j];
                String poker = color + number;
                pokerList.add(poker);
            }
        }
        System.out.println("静态代码块初始化好了一副牌: " + pokerList);
    }
}
posted @   OnlyOnYourself-Lzw  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示