第十章
10.1 引言
10.2 类的抽象和封装
类的抽象:将类的实现和类的使用分离开
类的封装:类实现的细节被隐藏,用户不需要知道类是如何实现的
10.3 面向对象的思考
在面向过程程序设计中,数据和数据上的操作是分离的,而且这种做法要求传递数据给方法。
面向对象程序设计将数据和对它们的操作都放在一个对象中。
因此,面向对象方法结合了面向过程范式的功能以及将数据和操作集成在对象中的特性。
10.4 类的关系
关联
聚集和组合
由于聚集和组合关系都以同样的方式用类来表示(聚集和组合都可以表示为聚集类中的一个数据域) ,我们不区分它们,将两者都称为组合。
10.5 示例学习
10.6 示例学习
10.7 将基本数据类型值作为对象处理
出于对性能的考虑,在Java中基本数据类型不作为对象使用。因为处理对象需要额外的系统开销。然而,Java中的许多方法需要将对象作为参数。java.lang包提供了包装类,即将基本数据类型并入对象或包装成对象。
包装类没有无参构造方法。
10.8 基本类型和包装类类型之间的自动转换
将基本类型值转换为包装类对象称为装箱(boxing),将包装类对象转化为基本类型值称为开箱(unboxing)。编译器会在没有相关命令的情况下,进行自动装箱和自动开箱。
所有包装类的实例都是不可变的。这意味着一旦创建对象后,它们的内部值就不能再改变。
10.9 Biglnteger和BigDecimal 类
如果要进行非常大的数的计算或者高精度浮点值的计算,java.math包提供了两个类,表示任意大小和精度的整教或者十进制数。
Biglnteger和BigDecimal 类都是不可变的。
10.10 String 类
字符串是对象,和前面讲到的包装类一样,String变量存储的是对String对象的引用,String对象里存储的才是字符串的值,只不过大多情况下,他们的差别可以忽略。
字符串是不可改变的。字符串实例是一个常量,内容不能再改变。
10.10.1构造字符串
//构造字符串的语法,其中stringLiteral是双引号括起来的字符序列
String newString = new String(stringLiteral);
//Java将字符串直接看做String对象,所以下面的语句也合法
String message = stringLiteral;
//也可以用字符数组创建一个字符串
char[] charArray = {
'G', 'o', 'o', 'd', '', 'D', 'a', 'y'};
String message = new String(charArray);
10.10.2 不可变字符串与限定字符串
字符串不可变指的是其内容不可以改变,但是引用变量的指向是可以改变的
在Java中,字符串字面值会被保存在字符串池中,对于相同的字面值,在字符串中只会保存一份。因此,多个相同字符串字面值的引用变量都会指向字符串池中的同一个地址;
但是,使用new关键字创建的字符串对象,即使字符串内容一样,他们也会被储存在堆中的不同地址,分别由各自的引用变量所指向,如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJSyRQ4x-1682245012290)(/Users/kevinwang/Library/Application Support/typora-user-images/image-20230419145614631.png)]
10.10.3 字符串的替换和分隔
替换由replace关键字完成,分隔由split关键字完成
String[] tokens = "Welcome to Java and HTML".split(" ");
//Welcome
System.out.println(s1 = tokens[0]);
//to
System.out.println(s2 = tokens[1]);
10.10.4 依照模式匹配、替换和分隔
使用正则表达式判定有一定模式规律的字符串,如电话号码、邮箱等
10.10.5 字符串与数组之间的转换
//以下代码将字符串"Java"转化为字符数组:'j', 'a', 'v', 'a'
char[] chars = "Java".toCharArray();
//以下代码将源字符串的子串复制到目标字符串的指定位置:4个参数中,前面的2个参数表示源字符串需要复制的子串的起始位置,左闭右开;后面的2个参数表示目标字符串的名字和开始粘贴的位置
String str = "hello, world";
char[] charArray = new char[6];
str.getChars(0, 5, charArray, 0);
System.out.println(charArray);
以下代码将字符数组'j', 'a', 'v', 'a'转化为字符串"Java"
String str = new String(new char[]{
'j', 'a', 'v', 'a'});
String str = String.valueOf(new char[]{
'j', 'a', 'v', 'a'});
10.10.6 将字符和数值转换成字符串
//使用下面的方法返回由字符‘5’, '.', '4'和'4'构成的字符串。
String.value0f(5.44)
10.10.7 格式化字符串
除了printf方法,format方法也可以格式化字符串,具体用法如下
System.out.printf(format, iteml, item2, ...,itemk);
//等价于
System.out.print(String.format(format, item1, item2, ..., itemk));
10.11 StringBuilder 和 StringBuffer 类
StringBuilder和StringBuffer类似于String类,区别在于String类是不可改变的。
例如,append可以在原有字符串末尾增加新的字符或字符串;insert可以在字符串指定位置插入新的字符串;delete可以删除指定位置的字符;reverse可以颠倒字符串的顺序;replace在指定位置用新的字符串取代原来的内容;setCharAt可以改变指定位置的一个字符等