1、Interface
1.1、概念
接口中全是抽象方法,接口是比抽象类还抽象的类,接口体现的是规范
1.2、格式
| interface 接口名{ |
| 常量; |
| 抽象方法; |
| } |
1.3、类实现接口的格式
- 类和接口是实现关系----implements
- class 类名 implements 接口
- 实现了接口的类称为--实现类
1.4、接口使用步骤
-
- 定义类实现接口
- 重写抽象方法
- 使用实现类(创建实现类对象,调用方法)
1.5、示例代码
USB接口
| |
| public interface Usb { |
| |
| public abstract void connect(); |
| |
| public abstract void sendData(); |
| |
| public abstract void disconnect(); |
| } |
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键盘
| |
| 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) { |
| |
| |
| |
| |
| |
| UsbMouse usbMouse = new UsbMouse(); |
| usbMouse.connect(); |
| usbMouse.sendData(); |
| usbMouse.disconnect(); |
| |
| System.out.println("--------------------------------------"); |
| |
| |
| UsbKeyboard usbKeyboard = new UsbKeyboard(); |
| usbKeyboard.connect(); |
| usbKeyboard.sendData(); |
| usbKeyboard.disconnect(); |
| } |
| } |
1.6、接口中成员的特点
- 接口中的方法默认就是抽象方法,会自动添加:public abstract
- 接口中定义的变量是常量,会自动添加:public static final
1.7、接口的多实现
1.7.1、Java中类只能单继承
1.7.2、Java中类可以同时实现多个接口
- class 类名 implements 接口1,接口2,接口3,....
1.8、接口的多继承
- interface 接口名 extends 接口1,接口2,....
- 开发中一般很少用接口多继承,主要是源代码中可能会看到
1.8.1 面试题
1.9 JDK1.8以后有关接口的新增方法
1.9.1、默认方法
- 默认方法的格式
- public default 返回值类型 方法名(参数列表)
- 默认方法的使用
1.9.2、静态方法
1.9.3、私有方法
示例代码
接口类
| public interface Aaa { |
| |
| |
| |
| default void test01() { |
| System.out.println("我是接口默认方法"); |
| test03(); |
| test03(); |
| } |
| |
| |
| |
| static void test02() { |
| System.out.println("我是接口静态方法"); |
| test03(); |
| } |
| |
| |
| |
| private static void test03() { |
| System.out.println("我是接口私有方法"); |
| } |
| } |
测试类
| public class Demo09 { |
| public static void main(String[] args) { |
| Bbb bbb = new Bbb(); |
| bbb.test01(); |
| |
| |
| |
| Aaa.test02(); |
| |
| |
| } |
| } |
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();
- 类名.静态成员方法()---(建议使用的格式)
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修饰指的是引用类型的地址置不能发生改变,但是地址里面的内容是可以发生改变的
5、code block
5.1、概念
{}括号括起来的代码被称为代码块
5.2、构造代码块
- 格式
- 特点
- 每次创建对象,调用构造器执行前,都会执行该代码块中的代码
5.3、静态代码块
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类
| |
| 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); |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?