一、内部类
概念:在一个类的内部再定义一个完整的类。
class Outer{ //外部类
class Inner{ //内部类
}
}
特点:1.编译之后可生成独立的字节码文件(class 文件)。
2.内部类可直接访问外部内的私有成员,而不破坏封装性。
public class Body{
private String name;
class Header{
pubilc void show(){
System.out.println(name);
}
}
}
3.可为外部类提供必要的内部功能组件。
1.成员内部类
* 在类的内部定义,与实例变量,实例方法同级别的类。
* 外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象。
Outer out = new Outer();
Inner in = out.new Inner();
* 当外部类,内部类存在重名属性时,会优先访问内部类属性。
A.内外相同访问内部
B.内外相同访问外部
C.排除重名属性的影响使调用更加明确
* 成员内部不能定义静态成员。
非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。
2.静态内部类
不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员
3.局部内部类
A.定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。
B.局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final.
4.匿名内部类
:优点减少代码量
:缺点可读性差
A.没有类名的局部内部类(一切特征都与局部内部类相同)。
B.必须继承一个父类或者实现一个接口
:实现一个接口
用匿名内部类优化
C.定义类,实现类,创建对象的语法合并,只能创建一个该类的对象
二、Object类
- 超类,基类,所有类的直接或间接父类,位于继承数的最顶层。
- 任何类,如果没有书写extends显示继承某个数,都默认直接继承Object类,否则为间接继承。
- Object类中所定义的方法,是所有对象都具备的方法。
- Object类型可以存储任何对象。
1.作为参数,可接受任何对象。
2.作为返回值,可返回任何对象
1.getClass()方法
- public final Class<?> getClass(){}
- 返回引用中存储的实际对象类型。
- 应用:通常用于判断两个引用中实际存储对象类型是否一致。
2.hashCode()方法
- public int hashCode(){}
- 返回对象的哈希码值。
- 哈希值根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值。
- 一般情况下相同对象返回相同哈希码
3.toString()方法
- public String tostring(){}
- 返回该对象的字符串表示(表现形式)。
- 可以根据程序需求覆盖该方法,如:展示对象各个属性值
显示:返回类型 + @符号 + hashCode
我们可以重写该方法让其显示自己的属性:
4.equals()方法
- pubilc boolean equals(Object obj){}
- 默认实现为(this == obj),比较两个对象地址是否相同。
- 可进行覆盖,比较两个对象的内容是否相同。
重写equals方法
5.finalize()方法
- 当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
- 垃圾对象:没有有效引用指向此对象时,为垃圾对象。
- 垃圾回收:由GC销毁垃圾对象,释放数据存储空间。
- 自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。
- 手动回收机制:使用System.gc();通知JVM执行垃圾回收。
上面图片中(s1~s6)还未回收
说明 (s1~s6) 不是垃圾
如图垃圾已经回收
三、包装类
- (什么是包装类)基本数据类型所对应的引用数据类型
基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的
1.包装类对应
基本数据类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
2.类型转换的装箱,拆箱
3.类型的转换
- 8种包装类提供不同类型间的转换方式
- Number父类中提供的6个共性方法。
- parsexxx()静态方法。
- valueOf()静态方法。
- 注意:需保证类型兼容,否则抛出NumberFormatException异常
* 基本类型转换成字符串
下图为重载方法
* 字符串换成基本类型
* boolean字符串形式转换成基本类型
解决上面代码中的errors
java 从 JDK 1.9 开始就不建议用Integer构建包了,官方推荐同ValueOf来构建包
Integer obj = new Integer(100)
Integer obj = Integer.valueOf(100)
4.整数缓冲区
- Java预先创建了256个常用的整数包装类型对象。
- 在实际应用中,对已创建的对象进行复用
源码查看方式:鼠标点击valueOf ,然后 ctrl+鼠标左键
四、String类
- 方法区,栈,堆
不同的JDK版本,字符串池不一定在方法区域
给字符串赋值时,并没有修改数据,而是从新开辟了一个新地址
运行即可证明上述结论:
字符串的另外一种创建方式:
解释:
另外一种比较:
1. String类中的常用方法
- 1.public int length ():返回字符串长度。
- 2.public char charAt (int index);根据下标获取字符。
- 3.public Boolean contains (String str); 判断当前字符串是否包含str。
- 4.public char[] toCharArray () ; 将字符串转换成数组。
- 5.public int indexOf (String str) ; 查找 str 首次出现的下标,存在,则返回改下标,不存在,则返回-1。
- 6.public int lastIndexOf(String str);查找字符串在当前字符串中最后一次出现的下标索引。
- 7.public String trim();去掉字符串前 后的空格。
- 8.public StringtoUppercase();将小写转换成大写。
- 9.public boolean endwith(String str);判断字符串是否以str结尾。
1.2.3的使用方法:
4.5.6的使用方法:
7.8.9的使用方法:
补充方法:
- replace
- split
- equals 和 compare() ;比较大小
2. 可变字符串
- StringBuffer:可变长字符串,JDK1.0提供,运行效率慢,线程安全。
- String Builder:可变长字符串,JDK5.0提供,运行效率快,线程不安全。
StringBuffer:
StringBuilder和上面方法一样:
StringBuilder的效率高于String:
五、BigDecimal类
在很多实际应用中需要精确运算,而像double,float是近似值存储,不符合要求,需借助BigDecimal(计算更精确)
- 位置:java.math中
- 作用:精确计算浮点数
- 创建方式:BigDecimal bd = new BigDecimal(“1.0”);
- 方法:
- BigDecimal r1=bd1.add(BigDecimal bd2);加法
- BigDecimal r1=bd1.subtract(BigDecimal bd2);减法
- BigDecimal r1=bd1.multiply(BigDecimal bd2);乘法
- BigDecimal r1=bd1.divide(BigDecimal bd2);除法
:和double的比较
:加,减运算
:乘除运算
在进行除法运算时,如果不能准确的计算出结果时,需要指定保留的位数和取舍方式。
:除法中的特殊情况(不能整除)
- 除法:divide(BigDecimal bd,int scal,RoundingMode mode)
- 参数:指定精确到小数点后几位
- 参数mode:
- 指定小数部分取舍模式,通常采用四舍五入的模式
- 取值为BigDecimal.ROUND_HALF_UP
六、Date类
- Date 表示特定的瞬间,精确到毫秒,Date类中的大部分方法都已经被Calendar类中的方法取代。
- 时间单位
- 1秒 = 1000毫秒
- 1毫秒 = 1000微秒
- 1微秒 = 1000纳秒
Date类相关方法:
七、Calendar类
- Calendar提供了获取或设置各种日历字段的方法。
- 构造方法
- protected Claender() :由于修饰符是protected,所以无法直接创建该对象。
- 其他方法
修改时间:
补充方法:
八、SimpleDateFormat类
- SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类。
- 进行格式化(日期->文本),解析(文本->日期).
- 常用的时间模式字母
九、System类
- System系统类,主要用于获取系统的属性数据和其他操作,构造方法私有的。
使用 例子:
System.gc();的使用
- 未执行
- 退出JVM