Java基础回顾(1)
目录
基本类型:
包装器类型:
128陷阱:
现象描述:
示例代码:
原因分析:
Integer缓存机制:
对象比较:
解决方法:
String
关键字
抽象类和接口
Object类
反射
代理
基本类型:
整型:int short byte long——长度不同,精度不同
浮点型:float double
boolean
char
包装器类型:
每一个基本类型都有对应的包装类型
Integer——自动装箱、拆箱:javac编译器会帮助我们自动装箱,拆箱
自动装箱:Java编译器会自动将基本数据类型转换为对应的包装类型。
自动拆箱:Java编译器会自动将包装类型转换为对应的基本数据类型。
128陷阱:
现象描述:
当使用==比较两个Integer对象时,如果这两个对象的值在-128到127之间(包括-128和127),则比较结果为true。
如果这两个对象的值超出这个范围,则比较结果为false,即使它们的数值相同。
示例代码:
public class IntegerTrap { public static void main(String[] args) { Integer num1 = 127; Integer num2 = 127; System.out.println(num1 == num2); // 输出 true Integer num3 = 128; Integer num4 = 128; System.out.println(num3 == num4); // 输出 false } }
原因分析:
Integer缓存机制:
Integer类型在Java中有一个缓存机制,该机制会缓存-128到127之间的所有Integer对象。
当在这个范围内进行自动装箱时,Java会直接使用缓存中的对象,而不是创建一个新的对象。

对象比较:
使用==比较两个对象时,实际上是在比较它们的内存地址(即引用)。
在-128到127范围内,由于使用了缓存机制,两个相同的数值会被包装到同一个对象中,因此它们的内存地址相同,比较结果为true。
超出这个范围时,每次自动装箱都会创建一个新的Integer对象,因此即使数值相同,它们的内存地址也不同,比较结果为false。
解决方法:
为了避免128陷阱,建议在使用==比较Integer对象时,改为使用equals()方法。因为equals()方法会比较两个对象的值是否相等,而不是它们的内存地址。
Integer num3 = 128; Integer num4 = 128; System.out.println(num3.equals(num4)); // 输出 true
String
常用的String方法
.split()分割
.toUpperCase()转大写
.toLowerCase()转小写
.indexOf()返回下标
.charAt()分割为单个字符
.subString()截取字符
.startWith()返回boolean值,判断是否为..开头
.trim()去除前后空格
string不可变
- 类被final修饰——不可被继承
- 存数据的char数组被final修饰——不会指向新的数据
- 类内无修改char数组内容的方法——不会被修改
关键字
static:只执行一次
方法——为所有对象共享,可由类直接调用,只能访问静态变量,不能访问实例变量,不能用 this 或 super 关键字,主函数是静态的。
变量——为所有对象共享,归类所有,随类加载存在于方法区静态区,JVM 只分配一次内存,可通过类名或对象调用。
类——静态类只有静态内部类。非静态内部类不能声明静态成员或方法,静态内部类可以;非静态内部类可任意访问外部类成员,静态内部类只能访问外部类静态成员;创建非静态内部类实例需绑定外部类,静态内部类实例无需绑定。
代码块——随类调用或实例创建执行且仅一次,先于主函数执行,用于初始化类,所有父类子类中静态代码块优先级最高,且对后面静态变量可赋值不可访问。
final:
方法——不能被重写,指令不能被重新排序
类——类不能被集成
变量——不能被重新赋值
super:
调用父类方法,或者属性
调用父类构造函数,仅当在当前构造函数第一行时才为有效代码
this:
调用当前类的属性或者方法
调用当前类构造函数,仅当在当前构造函数第一行时才为有效代码
extend
implement
权限
public
private:当前类内能访问
protected:不仅能被同一包内的所有类访问,也能被不同包内的子类访问
default:当前包可访问
抽象类和接口
1、类是单继承,而接口是多实现
2、抽象类更偏向于本质,接口更偏向于行为功能
3、抽象类中可以有属性,构造函数,方法。但接口中只能存在
Object类
toString()
equals()——判断两个对象是否一致(区别于==)
equals()
默认行为:继承自Object类的equals()方法等同于==(比较内存地址)。
重写后的行为:大多数类(如String、Integer等)会重写equals()方法,改为比较对象的内容是否相等。
重写equals()必须重写hashcode
hashcode:描述对象的状态码——一组特性
反射
动态获取类信息 类内容 类组成的能力
获取类信息的三种方式:
class.forName()
对象.getClass()
类名.class
MVC框架
扫描类信息——>获得该类的全限定名称——>借助反射 Class.forName(className)把这个类加载进来——>检查该类是否含有注解@Controller@RequestMapping,检查每一个方法上面的@RequestMapping值,把这些信息放置到我们的HashMap中去
代理
静态代理
对于代理类对某个被代理类进行增强,实现简单。当被代理类增多时出现类爆炸。
动态代理
通过创建子类进行代理CGLB

通过实现接口进行动态代理JDK
