Java 内部类,常用api
一.内部类
1.内部类概述
- 内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)。
public class People{
// *内部类
* public class Heart{}
}
内部类的使用场景
场景:当一个事物的内部,还有一个部分需要一个完整的结构进行描述时。
基本作用
-
内部类通常可以方便访问外部类的成员,包括私有的成员。
-
内部类提供了更好的封装性,内部类本身就可以用private ,protectecd等修饰,封装性可以做更多控制。
2.内部类:静态内部类
有static修饰,属于外部类本身。
它的特点和使用与普通类是完全一样的,类有的成分它都有,只是位置在别人里面而已。
public class Outer{
// 静态成员内部类
public static class Inner{}
}
静态内部类创建对象的格式:
格式:外部类名.内部类名 对象名 = new 外部类名.内部类构造器;
范例:Outer.Inner in = new Outer.Inner();
3.内部类:成员内部类
无static修饰,属于外部类的对象。
JDK16之前,成员内部类中不能定义静态成员,JDK 16开始也可以定义静态成员了。
public class Outer {
// *成员内部类
* public class Inner {}
}
成员内部类创建对象的格式:
格式:外部类名.内部类名 对象名 = new 外部类构造器.new 内部类构造器();
范例:Outer.Inner in = new Outer().new Inner();
4.内部类:局部内部类
局部内部类放在方法、代码块、构造器等执行体中。
局部内部类的类文件名为: 外部类$N内部类.class。
5.内部类:匿名内部类概述★
匿名内部类:
本质上是一个没有名字的局部内部类。
作用:方便创建子类对象,最终目的是为了简化代码编写。
格式:
new 类|抽象类名|或者接口名() {
重写方法;
};
Employee a = new Employee() {public void work() {}};
a. work();
特点总结:
-
匿名内部类是一个没有名字的内部类,同时也代表一个对象。
-
匿名内部类产生的对象类型,相当于是当前new的那个的类型的子类类型。
public class Test {
public static void main(String[] args) {
Animal a = new Animal(){
@Override
public void run() {
System.out.println("老虎会吃人~~~");
}
};
a.run();
}
}
// class Tiger extends Animal{
// @Override
// public void run() {
// System.out.println("老虎会吃人~~~");
// }
// }
abstract class Animal{
public abstract void run();
}
6.匿名内部类常见使用形式
/**
掌握匿名内部类的使用形式(语法)
*/
public class Test2 {
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("老师开始游泳~~~");
}
});
}
public static void go(Swimming s){
System.out.println("开始~~");
s.swim();
System.out.println("结束~~");
}
}
interface Swimming{
void swim();
}
匿名内部类可以作为一个对象,直接传输给方法。
/**
通过GUI编程 理解匿名内部类的真实使用场景
*/
public class Test3 {
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);
}
}
匿名内部类通常是在开发中调用别人的方法时,别人需要我们写的时候才会定义出来使用。
匿名内部类还可以实现进一步的简化代码
二.常用API
1.API概述
-
API(Application Programming interface) 应用程序编程接口。
-
简单来说:就是Java帮我们已经写好的一些方法,我们直接拿过来用就可以了
2.Object类:toString方法
Object类的作用:
-
一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类。
-
Object作为所有类的父类,提供了很多常用的方法给每个子类对象拿来使用。
Object类的常用方法:
方法名 | 说明 |
---|---|
public String toString() | 默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址 |
public boolean equals(Object o) | 默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false |
Object的toString方法:
方法名 | 说明 |
---|---|
public String toString() | 默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址 |
toString存在的意义
父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息
public class Student {
private String name;
private char sex;
private int age;
public Student() {}
public Student(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public char getSex() {return sex;}
public void setSex(char sex) {this.sex = sex;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex=" + sex +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) {
Student s = new Student("张飞",'男',22);
System.out.println(s);
}
}
3.Object类:equals方法
Object的equals方法:
方法名 | 说明 |
---|---|
public boolean equals(Object o) | 默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false |
equals存在的意义:
- 为了被子类重写,以便子类自己来定制比较规则(比如比较对象内容)。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return sex == student.sex && age == student.age && Objects.equals(name, student.name);
}
Student s1 = new Student("张飞",'男',22);
Student s2 = new Student("张飞",'男',22);
Student s3 = new Student("张飞",'男',23);
System.out.println(s1);
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
4.Objects
Objects是一个工具类,提供了一些方法去完成一些功能。
官方在进行字符串比较时,没有用字符串对象的的equals方法,而是选择了Objects的equals方法来比较。
使用Objects的equals方法在进行对象的比较会更安全。
Objects的常见方法:
方法名 | 说明 |
---|---|
public static boolean equals(Object a, Object b) | 比较两个对象的,底层会先进行非空判断,从而可以避免空指针异常。再进行equals比较 |
public static boolean isNull(Object obj) | 判断变量是否为null ,为null返回true ,反之 |
对象进行内容比较的时候建议使用Objects提供的equals方法,比较的结果是一样的,但是更安全。
5.StringBuilder
StringBuilder概述:
-
StringBuilder是一个可变的字符串的操作类,我们可以把它看成是一个对象容器。
-
使用StringBuilder的核心作用:操作字符串的性能比String要更高(如拼接、修改等)。
StringBuilder 构造器
名称 | 说明 |
---|---|
public StringBuilder() | 创建一个空白的可变的字符串对象,不包含任何内容 |
public StringBuilder(String str) | 创建一个指定字符串内容的可变字符串对象 |
StringBuilder常用方法
方法名称 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据并返回StringBuilder对象本身 |
public StringBuilder reverse() | 将对象的内容反转 |
public int length() | 返回对象内容长度 |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
StringBuilder:内容是可变的、拼接字符串性能好、代码优雅。
String :内容是不可变的、拼接字符串性能差。
注意事项:
-
定义字符串使用String
-
拼接、修改等操作字符串使用StringBuilder
案例:
//打印整型数组内容
// 需求:
// 设计一个方法用于输出任意整型数组的内容,要求输出成如下格式:
// “该数组内容为:[11, 22, 33, 44, 55]”
// 分析:
// 1、定义一个方法,要求该方法能够接收数组,并输出数组内容。 ---> 需要参数吗?需要返回值类型申明吗?
// 2、定义一个静态初始化的数组,调用该方法,并传入该数组。
public class Test {
public static void main(String[] args) {
int [] arr = null;
int [] arr1 = {11,22,33};
int [] arr2 = {};
System.out.println(toString(arr));
System.out.println(toString(arr1));
System.out.println(toString(arr2));
}
//1.定义方法接受任意整型数组,返回数组内容格式
public static String toString(int[] arr){
if (arr != null){
//2.开始拼接
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]).append(i == arr.length - 1 ? "" : ",");
}
sb.append("]");
return sb.toString();
}else {
return null;
}
}
}