03-面向对象编程高级

1. 内部类

1.1. 成员内部类

类中的普通成员,拥有者是对象,(对象的内部类)。

和实例方法一样,成员内部类的实例方法可以访问外部类的实例成员,静态成员

语法:外部类名.内部类名 名字 = new 外部类名().new 内部类名();

public class OuterClass {
    public class InnerClass {
    	//JDK 16 之前,不能用静态成员。
    	//OuterClass.this 当前外部类的对象
    }
}

1.2. 静态内部类

类的内部类。有 static 修饰的内部类。不能直接访问外部类的实例成员

语法:外部类名.内部类名 名字 = 外部类名.内部类名();

1.3. 局部内部类

定义在执行体 { } 里的类。

鸡肋语法,不咋用。

1.4. 匿名内部类

本质是一个子类,使用的地方,会返回一个实例对象。

匿名内部类默认类名是 当前类名&编号

通常作为一个实参传给方法,例如:动态代理创建代理对象

语法:

// 方便创建子类对象的语法。 联想到类lambda式
new 类或接口(参数) {
    // 方法的重写
    @Override
    ...
}

2. 枚举

2.1. 是什么?

枚举是一个特殊的类

语法

修饰符 enum 枚举类 {
    名字1,名字2,名字3等; 
    其他成员
}

2.2. 特点

通过反编译,看到枚举的特点

public enum A{
X , Y , Z;
}

//Compiled from “A.java"
public final class A extends java.lang.Enum<A> {  
    public static final A X = new A();  
    public static final A Y = new A();  
    public static final A Z = new A();  
  
    public static A[] values();  
  
    public static A valueOf(java.lang.String);  
}

2.3. 用枚举实现单例设计模式


2.4. 使用场景

常量和枚举都表示一组信息,作为参数传递。

例子


3. 泛型和通配符

泛型让类、接口、方法更通用

3.1. 泛型类、泛型接口

语法

修饰符 class 名字<类型变量,类型变量...> {

}

修饰符 interface 名字<类型变量,类型变量...> {

}

类型变量建议约定大于强制)大写英文字母:

3.2. 泛型方法和通配符

语法


// 类型变量 使用在声明上,方法体内不能。

修饰符 <类型变量,...> 返回值类型 方法名(形参列表) { 
    ... 
}

父子,上下。

3.3. 泛型擦除

泛型的本质:把具体的数据类型作为参数,传递给类型变量。

泛型工作在编译阶段,用于类型检查,可以避免强制类型转化。

编译完成后,class 文件中没有泛型了,这就是泛型的擦除。

泛型只支持引用数据类型,不支持基本数据类型。

4. 常用 API

4.1. Object

祖宗类,常用方法

toString() // 被子类重写,用来返回内容。
equal() // 被子类重写,指定对象得比较规则。默认比较对象得地址值。


4.2. Objects

工具类

equal(o1,o2)  // 更安全,相对Object得,增加了两个判断,地址和非空判断。
notNull()
isNull()

4.3. 包装类

4.3.1. 为什么要设计包装类

万物皆对象。

泛型和集合,不支持基本数据类型,支持引用数据类型。

包装类把基本数据类型,包装成引用数据类型。例如 Integer num = Integer. valueOf (10);

int->Integer char->Character;其他首字母大写

自动装箱,自动拆箱,是说基本数据类型和它们对应的引用数据类型之间可以自动转化

Important

包装类得常量池技术 #TODO

4.3.2. 常见操作

#TODO

toString(2)
toString()基本类型转字符串。

parseXXX()
valueOf()

4.4. StringBuilder

String StringBuilder
不可变字符串 可变字符串
频繁操作字符串,会产生很多没用得对象,性能差 拼接字符列性能好,代码优雅
StringBuilder()
StringBuilder(str)
append(任意类型)
length()
toString()
reverse()

StringBuffer 和 StringBuilder 用法一样。

StringBuffer 是线程安全的。

demo 整数数组,返回格式 [1,2,3] 字符串


4.5. StringJoiner

JDK 8 有的,

高效操作字符串,同时它使用它的 API 代码会更简洁。

StringJoiner(间隔符)
StringJoiner(间隔符,开始符,结束符)
add() //添加对象,返回对象自身。  联想到设计模式,装饰器。
length()
toString()

上一节:02-面向对象编程进阶-2

下一节:04-常用-api