目录
一、接口
1、接口概述、特点
1)、接口的定义
接口的格式如下:
2)、接口的特点
JDK8之前接口中只能是抽象方法和常量,没有其他成分了。
接口不能实例化。
接口中的成员都是public修饰的,写不写都是,因为规范的目的是为了公开化。
3)、接口
接口也是一种规范。
2、接口的基本使用:被实现
1)、接口的用法
接口是用来被类实现(implements)的,实现接口的类称为实现类。实现类可以理解成所谓的子
类。
从上面可以看出,接口可以被类单实现,也可以被类多实现。
2)、接口实现的注意事项
一个类实现接口,必须重写完全部接口的全部抽象方法,否则这个类需要定义成抽象类。
3、补充知识:接口与接口的多继承
1)、基本小结
类和类的关系:单继承。
类和接口的关系:多实现。
接口和接口的关系:多继承,一个接口可以同时继承多个接口。
2)、接口多继承的作用
规范合并,整合多个接口为同一个接口,便于子类实现。
4、补充知识:JDK8开始接口新增的方法
1)、默认方法
类似之前写的普通实例方法:必须用default修饰。
默认会public修饰。需要用接口的实现类的对象来调用。
2)、静态方法
默认会public修饰,必须static修饰。
注意:接口的静态方法必须用本身的接口名来调用。
3)、私有方法
就是私有的实例方法:,必须使用private修饰,从JDK 1.9才开始有的。
只能在本类中被其他的默认方法或者私有方法访问。
注意:JDK8新增的3种方法我们自己在开发中很少使用,通常是Java源码涉及到的,我们需要理解、识别语法、明白调用关系即可。
5、补充知识:使用接口的注意事项
1)、注意事项
接口不能创建对象
一个类实现多个接口,多个接口的规范不能冲突。
一个类实现多个接口,多个接口中有同样的静态方法不冲突。
一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的。
一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。
一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。
二、内部类
1、内部类概述
1)、内部类
内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)。
2)、内部类的使用场景
场景:当一个事物的内部,还有一个部分需要一个完整的结构进行描述时。
3)、基本作用
内部类通常可以方便访问外部类的成员,包括私有的成员。
内部类提供了更好的封装性,内部类本身就可以用private ,protectecd等修饰,封装性可以做更多控制。
4)、内部类的分类
静态内部类[了解]
成员内部类(非静态内部类) [了解]
局部内部类[了解]
匿名内部类(重点)
2、内部类之一:静态内部类
1)、静态内部类的概念
有static修饰,属于外部类本身。
它的特点和使用与普通类是完全一样的,类有的成分它都有,只是位置在别人里面而已。
2)、静态内部类创建对象的格式
3)、静态内部类的访问拓展
1、静态内部类中是否可以直接访问外部类的静态成员?
可以,外部类的静态成员只有一份可以被共享访问。
2、静态内部类中是否可以直接访问外部类的实例成员?
不可以的,外部类的实例成员必须用外部类对象访问。
3、内部类之二:成员内部类
1)、成员内部类的概念
无static修饰,属于外部类的对象。
JDK16之前,成员内部类中不能定义静态成员,JDK 16开始也可以定义静态成员了。
2)、成员内部类创建对象的格式
3)、成员内部类的访问拓展
1、成员内部类中是否可以直接访问外部类的静态成员?
可以,外部类的静态成员只有一份可以被共享访问。
2、成员内部类的实例方法中是否可以直接访问外部类的实例成员?
可以的,因为必须先有外部类对象,才能有成员内部类对象,所以可以直接访问外部类对象的实例成员。
4)、成员内部类-面试笔试题
写出结果:
注意:在成员内部类中访问所在外部类对象 ,格式:外部类名.this。
4、内部类之三:局部内部类
1)、局部内部类的概念
局部内部类放在方法、代码块、构造器等执行体中。
局部内部类的类文件名为: 外部类$N内部类.class。
5、部类之四:匿名内部类概述
1)、匿名内部类的概念及总结
本质上是一个没有名字的局部内部类。
作用:方便创建子类对象,最终目的是为了简化代码编写。
2)、格式
3)、特点总结
匿名内部类是一个没有名字的内部类,同时也代表一个对象。
匿名内部类产生的对象类型,相当于是当前new的那个的类型的子类类型。
6、匿名内部类常见使用形式
1)、案例
某个学校需要让老师,学生,运动员一起参加游泳比赛
2)、代码
public static void main(String[] args) {
Swimming s = new Swimming() {
@Override
public void swim() {
System.out.println("学生比赛!");
}
};
go(s);
System.out.println("-----------------------------");
go(new Swimming() {
@Override
public void swim() {
System.out.println("老师比赛!");
}
});
System.out.println("-----------------------------");
go(new Swimming() {
@Override
public void swim() {
System.out.println("运动员比赛!");
}
});
}
/**
学生,老师,运动员可以一起参加比赛
*/
public static void go(Swimming s){
System.out.println("开始");
s.swim();
System.out.println("结束");
}
interface Swimming{
void swim();
}
4)、结果
5)、使用总结
匿名内部类可以作为一个对象,直接传输给方法。
7、匿名内部类真实使用场景演示
1)、案例
给按钮绑定点击事件
2)、代码
public static void main(String[] args) {
//1、创建窗口
JFrame win = new JFrame("登录界面");
JPanel panel = new JPanel();
win.add(panel);
//2、创建一个按钮对象
JButton btn = new JButton("登录");
//注意:讲解匿名内部类的使用
// btn.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
// JOptionPane.showMessageDialog(win,"点我一下,说明爱我");
// }
// });
btn.addActionListener(e -> JOptionPane.showMessageDialog(win,"点我一下,说明爱我"));
//3、把按钮对象添加到桌布上展示
panel.add(btn);
//4、展示窗口
win.setSize(400,300);
win.setLocationRelativeTo(null);
win.setVisible(true);
}
3)、结果
4)、使用总结
匿名内部类通常是在开发中调用别人的方法时,别人需要我们写的时候才会定义出来使用。
将来:匿名内部类还可以实现进一步的简化代码。
三、常用API
1、API概述
1)、概述
API(Application Programming interface) 应用程序编程接口。
简单来说:就是Java帮我们已经写好的一些方法,我们直接拿过来用就可以了。
2、Object类:toString方法
1)、Object类的作用
一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类。
Object作为所有类的父类,提供了很多常用的方法给每个子类对象拿来使用。
2)、Object类的常用方法
方法名 | 说明 |
public String toString() | 默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址 |
public boolean equals(Object o) | 默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false |
3)、Object的toString方法
方法名 | 说明 |
public String toString() | 默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址 |
4)、问题引出
开发中直接输出对象,默认输出对象的地址其实是毫无意义的。
开发中输出对象变量,更多的时候是希望看到对象的内容数据而不是对象的地址信息。
5)、toString存在的意义
父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息!!
3、Object类:equals方法
1)、Object的equals方法
方法名 | 说明 |
public boolean equals(Object o) | 默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false |
2)、问题思考
直接比较两个对象的地址是否相同完全可以用“==”替代equals。
同时,开发中很多业务情况下,更想判断2个对象的内容是否一样。
3)、equals存在的意义
为了被子类重写,以便子类自己来定制比较规则(比如比较对象内容)。
4、Objects
1)、Objects概述
Objects是一个工具类,提供了一些方法去完成一些功能。
使用Objects的equals方法在进行对象的比较会更安全。
2)、Objects的常见方法
方法名 | 说明 |
public static boolean equals(Object a, Object b) | 比较两个对象的,底层会先进行非空判断,从而可以避免空指针异常。再进行equals比较 |
public static boolean isNull(Object obj) | 判断变量是否为null ,为null返回true ,反之 |
3)、源码分析
5、StringBuilder
1)、StringBuilder概述
StringBuilder是一个可变的字符串的操作类,我们可以把它看成是一个对象容器。
使用StringBuilder的核心作用:操作字符串的性能比String要更高(如拼接、修改等)。
2)、StringBuilder 构造器
名称 | 说明 |
public StringBuilder() | 创建一个空白的可变的字符串对象,不包含任何内容 |
public StringBuilder(String str) | 创建一个指定字符串内容的可变字符串对象 |
3)、StringBuilder常用方法
方法名称 | 说明 |
public StringBuilder append(任意类型) | 添加数据并返回StringBuilder对象本身 |
public StringBuilder reverse() | 将对象的内容反转 |
public int length() | 返回对象内容长度 |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
4)、案例
设计一个方法用于输出任意整型数组的内容,要求输出成如下格式:
5)、分析
1、定义一个方法,要求该方法能够接收数组,并输出数组内容。
2、定义一个静态初始化的数组,调用该方法,并传入该数组。
6)、代码
public static void main(String[] args) {
int[] arr = null;
System.out.println(toString(arr));
int[] arr2 = {};
System.out.println(toString(arr2));
int[] arr3 = {11,22,33,44};
System.out.println(toString(arr3));
}
/**
1、定义方法接受任意数组,返回数组内容格式
*/
public static String toString(int[] arr){
if (arr != null){
//2、开始正式拼接
StringBuilder s = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
s.append(arr[i]).append(arr.length - 1 == i ? "" : ",");
}
s.append("]");
return s.toString();
}else {
return null;
}
}