疯狂Java讲义-面向对象(下)

面向对象(下)

本章思维导图

疯狂Java讲义-面向对象(下)_第1张图片

包装类(Wrapper Class)

解决8种基本数据类型当成Object类型变量使用

基本数据类型的包装类

  • byte == Byte
  • short == Short
  • int == Integer
  • long == Long
  • char == Character
  • float == Float
  • double == Double
  • boolean == Boolean

JKD1.5提供了自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)

  • 自动装箱是把一个基本数据类型变量直接赋给对应的包装类变量或者赋给Object变量
  • 自动拆箱是直接把包装类对象直接赋给一个对应的基本类型变量

包装类可实现基本类型变量和字符串之间的转换

  • 把字符串类型的值转换为基本类型的值
    • parseXxx(String s) 静态方法,除Character之外所有包装类都提供了该方法
    • valueOf(String s) 静态方法
包装类的引用类型变量可以直接和基本数据类型作比较
  • 但是Integer包装类直接把-128~127之间的整数放入cache数组中缓存起来
  • 包装类提供了一个静态compare(xxx var1, xxx var2)方法,来比较两个基本类型值的大小

包装类无符号运算的方法

Integer、Long

static String toUnsignedString(int/long i)

  • 指定int或long型整数转换为无符号整数对应的字符串

static String toUsignedString(int\long i, int radix)

  • 指定int或long型整数转换为指定进制的无符号整数对应的字符串

static xxx parseUnsignedXxx(String s)

  • 指定字符串解析成无符号整数

static xxx parseUnsignedXxx(String s, int radix)

  • 指定字符串按指定进制解析成无符号整数

static int compareUnsigned(xxx x, xxx y)

  • 将x、y两个整数转换为无符号整数后比较大小
Byte、Short

toUnsignedInt(xxx x)

toUnsignedLong(xxx x)

  • 无符号类就是把二进制代码的最高位的符号位当成数值类处理

处理对象

打印对象和toString方法

  • 直接打印对象名是 类名+@+hashCode
  • toString()方法是Object类的一个实例方法
    • 是一个特殊的方法,是一个“自我描述”的方法
    • 重写类的toString()方法,可对类介绍
    • 类名[field1=值1, field2=值2, ...]

==和equals方法

  • 对于两个引用类型变量,只有都指向同一个对象时,==才会返回true
    • ==不可用于比较类型上没有父子关系的两个对象
    • "hello"直接量和new String("hello")的区别
      • 使用形如"hello"的字符串直接量,JVM将会使用常量池来管理这些字符串
      • 使用new String("hello")时,JVM会先使用常量池来管理"hello"直接量,在调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中
      • new String("hello")一共产生了两个字符串对象
      • 常量池(constant pool)专门用户管理在编译时被确定并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口中的常量,还包括字符串常量
        • 常量池保住相同的字符串直接量只有一个
  • equals()方法
    • equals()方法是Object类提供的一个实例方法
      • 重写equals()方法来实现自定义的相等标准
    • String的equals()方法用来判断两个字符串是否相等
    • 实例名.getCall()类名.class
    • 正确重写euqls()方法应该满足的条件
      • 自反性:对任意x,x.equals(x)一定返回true
      • 对称性:对任意x和y,如果y.equals(x)返回true,则x.equals(y)也返回true
      • 传递性:对任意x、y、z,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)一定返回true
      • 对任何不是null的x,x.equals(null)一定返回false

类成员

static关键字修饰的成员就是类成员

static可以修饰成员变量、方法、初始化块、内部类(接口、枚举)

不允许类成员访问实例成员

单例(Singleton)类

  • 一个类始终只能创建一个实例
  • 把类构造器使用private修饰,提供一个public方法作为该类的访问点,用于创建该类的对象,且该方法必须使用static修饰
  • 该类还必须缓存已经创建过的对象,用来判断该类是否曾经创建过对象

final修饰符

final关键字可用于修饰类、变量、方法,用于表示不可改变

final成员变量

  • 必须由程序员显式地指定初始值
  • 类变量
    • 必须在静态初始化块中指定初始值或声明该类变量时指定初始值
  • 实例变量
    • 必须在非静态初始化块、声明该实例变量或构造器中指定初始值
  • 在显式初始化之前不能访问,但可以通过方法来访问(java的一个缺陷)

final局部变量

final修饰的形参,不允许在方法内被赋值

可执行“宏替换”的final变量

  • 只要满足3个条件,final变量就不再是一个变量,而是相当于一个直接量
    • 使用final修饰
    • 在定义时制定了初始值
    • 该初始值可以在编译时确定下来

final方法

  • final修饰的方法不可被重写
  • 子类可重写private final修饰的方法
    • 因为private修饰的方法,子类无法访问,如果子类定义了相同方法名、相同形参列表、相同返回值类型的方法,只是重新定义了一个新方法

final类

  • final修饰的类不可以有子类

不可变(immutable)类

创建类的实例后,该实例的实例变量不可改变

  • 规则
    • 使用private和final修饰该类的成员变量
    • 提供带参数的构造器,用于根据传入参数来初始化类里的成员变量
    • 仅为类的成员变量提供getter方法,不提供setter方法
  • 注意引用类型的成员变量

抽象类

  • 有抽象方法的类只能定义成抽象类
  • 抽象类里可以没有抽象方法

规则

  • 抽象类必须使用abstract来修饰,抽象方法也必须使用abstract来修饰,抽象方法不能有方法体
  • 抽象类不能被实例化
  • 抽象类可以包含成员变量、方法(普通方法、抽象方法)、构造器、初始化块、内部类(接口、枚举)
    • 抽象类的构造器不能用于创建实例,主要是用于被其子类调用
  • 含有抽象方法的类(直接定义了一个抽象方法、继承了一个抽象父类,但没有完全实现父类包含的抽象方法、实现了一个接口,但没有完全实现接口包含的

你可能感兴趣的:(疯狂Java讲义,java,面向对象,自学,疯狂Java讲义)