面向对象(下)
一、包装类
1.1、基本类型和引用类型
![基本数据类型和包装类对应表](C:UsersAdministratorDesktopoop基本数据类型和包装类对应表。jpg)1、一切皆对象,但是八大基本类型却不是对象。
2、声明方式不同,引用数据类型需要用new关键字来创建,基本数据类型不需要。
3、存储位置不同,基本数据类型直接存储保存在堆栈中,能高效存取,引用数据类型需要引用指向实例,具体的实列保存在堆中。
4、引用数据类型的初始值为null,基本数据类型的初始值依其数据类型而定。
1.2、包装类型的作用
包装类型是为了方便对基本数据类型进行操作,解决了一些基本数据类型解决不了的问题:
- 集合中不允许存放基本数据类型,只能存放引用类型。
- 基本类型和引用类型可以进行相互转换,自动拆箱和装箱。
- 通过包装类型的parse方法可以实现基本数据类型+String类型之间的相互转换。
- 方法中的参数为Object类型,传入基本数据类型就不行。需要对基本数据类型进行装箱。
1.3、 装箱和拆箱
JDK1.5以前(已经过时)
把基本类型转换成包装类型需要通过包装类。valueOf(基本类型的值)方法。
把包装类型转换成基本类型需要通过包装类。xxxValue()方法。
JDK1.5后提供了自动装箱和拆箱
可以把基本类型的变量“近似”地当成对象使用。转换由系统完成。
包装类实现基本类型和字符串的转换:
- 字符串转成基本类型
- 包装类。parseXxx(String)静态方法(除Character之外的所有包装类都提供了该方法。)- 包装类。valueOf(String s)静态方法
- 基本类型转成字符串
- String类也提供了多个重载valueOf()方法,用于将基本类型变量转换成字符串```
String.valueO(基本类型);
- 基本类型+“ ”;直接转换成字符串
Java 7增强了包装类的功能,
- 提供了一个静态的compare(xxx val1,xxx val2)方法来比较基本类型值的大小。
- 为Character包装类增加了大量的工具方法来对一个字符进行判断java 8 支持无符号算术运算。
## 二、 处理对象
### 2.1、 toString
一个“自我描述”的方法。
### 2.2、==和equals方法
常量池(constant pool)专门用于管理在**编译时**被确定并被保存在已编译的。class文件中的一些数据。它包括了关于类、方法、接口中的常量,还包括字符串常量。(在编译期间能够确定的就放在常量池中。运行期间的不放在常量池中)Object类的equals()方法比较的结果与==运算符比较的结果完全相同。==和equals方法本质上都是指向地址,只不过equals()方法被重写了,才比较的是值。
如何正确地重写equals()方法:
? 自反性:对任意x, x.equals(x)一定返回true。
? 对称性:对任意x和y, 如果y.equals(x)返回true,则x.equals(y)也返回true。
? 传递性:对任意x, y, z, 如果x.equals(y)返回ture,y.equals(z)返回true,则x.equals(z)一定返回true。
? 一致性:对任意x和y, 如果对象中用于等价比较的信息没有改变, 那么无论调用x.equals(y)多少次,返回的结果应该保持一致,要么一直是true,要么一直是false。
? 对任何不是null的x, x.equals(null)一定返回false。
## 三、static关键字
以static修饰的成员就是类成员,类成员随着类的加载而加载,随着成员的消亡而消亡。调用格式是:类名。类成员**static 关键字主要有以下四种使用场景**
1、修饰成员变量和成员方法
2、静态代码块
3、修饰类(只能修饰内部类)
4、静态导包(用来导入类中的静态资源,1.5之后的新特性)## 四、final关键字
final关键字可用于修饰类、变量和方法,用于表示它修饰的类、方法和变量不可改变。一旦定义就不能更改final修饰的成员变量必须由程序员显式地指定初始值### 4.1、final修饰的变量
- 类变量:必须在**静态初始化块**中指定初始值或**声明该类变量时指定初始值**,而且只能在两个地方的其中之一指定。
- 实例变量:必须在**非静态初始化块**、**声明该实例变量**或**构造器中指定初始值**,而且只能在三个地方的其中之一指定。
- Java不允许在final成员变量显式初始化之前,直接访问final修饰的age成员变量,但可以通过方法来访问(这是一个缺陷,应该避免)- final修饰的引用变量final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但可以改变这个对象和对象里面的值。
### 4.2、final修饰的方法
final修饰的方法不可被重写,
### 4.3、final修饰的类
不可以有子类
### 4.5、不可变类
不可变(immutable)类的意思是创建该类的实例后,该实例的实例变量是不可改变的。Java提供的8个包装类和java.lang.String类都是不可变类,当创建它们的实例后,其实例的实例变量不可改变。
- 如何设计一个不可变类
1. 使用private和final修饰符来修饰该类的成员变量。
2. 提供带参数的构造器(或返回该实例的类方法),用于根据传入参数来初始化类里的成员变量。
3. 仅为该类的成员变量提供getter方法,不要为该类的成员变量提供setter方法,因为普通方法无法修改final修饰的成员变量。
4. 确保类中的方法不会被重写
5. 如果有必要,重写Object类的hashCode()和equals()方法## 五、抽象和接口
### 5.1抽象方法和抽象类
抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法。
规则:
- 必须使用abstact关键字来定义,抽象方法不能有方法体。
- 抽象类不能被实例化
- 抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接口、枚举)5种成分。主要作用是被子类调用- 包含抽象方法的类只能被定义成抽象类
注意:
?abstract不能用于修饰成员变量,不能用于修饰局部变量不能用于修饰构造器,没有抽象构造器,抽象类里定义的构造器只能是普通构造器。
?abstract关键字修饰的方法必须被其子类重写才有意义。不能被定义为private访问权限。
### 5.2、接口
Java 9:允许在接口中定义默认方法和类方法,默认方法和类方法都可以提供方法实现,Java 9为接口增加了一种私有方法,私有方法也可提供方法实现。
![接口的定义](C:UsersAdministratorDesktopoop接口的定义。jpg)修饰符可以是public或者省略,命名规范和类名相同的命名规则。接口只能继承接口,不能继承类。
注意:接口内默认都采用public static 两个修饰符。接口支持多继承,Java类支持单继承多实现1. 接口的用途
- 定义变量,也可以进行强制类型转换
- 调用接口中定义的常量。
- 被其他类实现。
2.接口和抽象类用法差别
- 接口里只能包含抽象方法、静态方法、默认方法和私有方法,不能为普通方法提供方法实现;抽象类则完全可以包含普通方法。
- 接口里只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态常量。
- 接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
- 接口里不能包含初始化块;但抽象类则完全可以包含初始化块。
- 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。
###六、内部类