Day_9 常用类

Day 9 常用类

内部类

概念:在一个类的内部再定义一个完整的类。

特点:

​ 编译之后可分别生成独立的字节码文件。

​ 内部类可以直接访问外部类的私有成员,而不破坏封装。

​ 可为外部类提供必要的内部功能组件。

内部类的分类

​ 成员内部类、静态内部类、局部内部类、匿名内部类

成员内部类

在类的内部定义和成员变量、成员方法同级别的类,即是成员内部类。

先创建外部类对象,再借助外部类对象,进而创建成员内部类对象。

内部类可直接访问外部类的私有属性,而不破坏封装。

当外部类、内部类存在重名属性时,会优先访问内部类属性。

外部类.this:指向外部类当前实例对象

​ 外部类.this.属性名:访问外部类属性

成员内部类不能定义静态成员(静态属性和静态方法)。–原因:静态成员定义是可以通过类名.方法名(或属性名)调用,而成员内部类只能由外部类对象找到,所以没有外部类对象无法找到静态成员,违反类名.方法名的调用规则,无法通过成员内部类名.方法名调用,所以规定内部类中不能定义静态成员。

静态内部类

静态内部类类似于静态属性:

​ 定义位置:类以内,方法以外,被static修饰

创建静态内部类对象,直接依赖外部类类名:

​ Outer.Inner i = new Outer.Inner();

访问静态内部类中的静态成员,直接通过类名:

​ Outer.Inner.静态内部类的静态成员

静态内部类只能访问外部类的静态成员

局部内部类

局部内部类类似于局部变量:

​ 1.定义位置:方法以内

​ 2.局部内部类中可以直接访问外部类的私有属性

注意:

创建局部内部类对象,只能在定义它的方法中。

局部内部类访问外部类的局部变量时,要求==局部变量必须加final==。(用于保证局部变量生命周期等于或长于内部类)

匿名内部类

概念: 特殊的局部内部类(局部内部类的一切特征,匿名内部类都有)

语法: 继承一个类或实现一个接口

创建对象: 只会创建该类的一个对象

优点: 减少代码量

缺点: 可读性差


Object类

Object类:称为超类、根类,定义在java.lang包下,所有类的父类(直接或是间接)。

注意:任何一个类如果没有写继承的父类,都默认继承Object。

Object类型的引用中可以存储任意类型的对象。

Object中定义的方法是所有类都具备的。

Object类中常用方法

getClass():返回引用中存储的实际对象类型。

通常用于判断两个引用中实际存储对象类型是否一致,相同为true,不同为false。

hashCode():返回该对象的哈希码值(一般是通过将该对象的内部地址转换成一个整数)
toString():返回该对象的String形式。

作用:为了方便打印输出对象的内容,可以覆盖toString()方法。

toString方法的覆盖原则:将所有属性的值,拼接为一个字符串作为返回值。

equals(Object obj):比较两个对象的内容是否相同,内容一致返回true,否则返回false。

加注:

​ 比较对象的内容,需要覆盖父类Object中的equals方法

覆盖equals的5个步骤:

  1. 自反性(比较两个引用是否指向同一个对象)

  2. 判断对象是否为null

  3. 判断两个引用指向的实际对象类型是否一致

  4. 强制类型转换

  5. 一次比较各个属性值是否相同

    (基本数据类型用“==”比较,引用数据类型用equals比较)


包装类

引用类型的变量只能存储对象,8种基本数据类型不能直接存储在引用中,为了让Object统一管理所有数据的类型,java提供包装类的概念。

概念:为8种基本数据类型分别定义了相应的对象类型,称之为包装类。

基本数据类型包装类型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

自动装箱、拆箱

JDK5.0之后,提供自动装箱、拆箱的功能,即包装类型和基本数据类型自动转换。

public class TestInteger{
  public static void main(String[] args){
    Integer i = 12;     //将一个基本数据类型变为包装类型的过程称为自动装箱    
    int a = 1;  //将一个包装类型变为基本数据类型的过程称为自动拆箱
  }
}

==整数缓冲区==

public class TestInteger{
  public static void main(String[] args){
    Integer i1 = 12;
    Integer i2 = 12;
    System.out.println(i1 = i2);

    Integer i3 = 128;
    Integer i4 = 128;
    System.out.println(i3 == i4);
  }
}

/*
    输出结果为:  true        false
    原因:在所有整数类型中,当创建包装类对象时,java会在缓冲区中创建-128到127这256个对象,当创建此范围内对象时,全都是复用缓冲区中的对象,而不是重新创建,所以创建的此范围内的对象都是指向的同一块地址空间,故用“==”判断时为true,超过此范围的则是创建时开辟新空间,故判断地址空间不相同,返回false。
*/

String类

知识储备:

String 类中有一个intern方法,可用于将字符串主动加入常量池。(还可去除重复值)解释如下图:

intern

创建String对象

String str1 = “hello”; //产生一个对象存放在字符串串池中,共享。

String str2 = new String(“word”); //产生两个对象,一个存放在字符串串池中共享,另一个存放在堆空间中。

不可变性

String字符串是==常量==,创建之后不可改变;

字符串字面值存储在串池中,可以共享。

可变长字符串

StringBuffer:可变长字符串,JDK1.0,线程安全,运行效率慢。

StringBuilder:可变长字符串,JDK5.0,线程不安全,运行效率高。

BigDecimal

很多实际应用中需要精确运算,而double是近似值存储,不符合要求,需要借助BigDecimal。

位置:java.math包中

作用:精确表示、计算浮点数

创建BigDecimal对象(方式很多,以参数为字符串为例):

​ BigDecimal bd = new BigDecimal(“1.0”);

方法:

​ BigDecimal add(BigDecimal bd) 加

​ BigDecimal subtract(BigDecimal bd) 减

​ BigDecimal multiply(BigDecimal bd) 乘

​ 除法:

​ BigDecimal divide(BigDecimal bd , int scal , RoundingMode mode) 除

​ 参数scal:指定精确到小数点后几位。

​ 参数mode:指定小数部分的取舍模式,通常采用四舍五入的模式,取值为

​ BigDecimal.ROUND_HALF_UP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值