类和对象

  1. 类部分定义

对象中的数据称为实例域
操纵数据的过程称为方法
类是对象的模板,由类构造对象的过程称为创建类的实例(类也可以强制转换)

  1. 对象三个主要特征:

a. 行为(可以施加哪些操作)
b. 状态(施加操作后如何响应)
c. 标识(辨别状态与行为相同的不同对象)

  1. 类之间的关系

依赖:一个类的方法操纵另一个类的对象
聚合:一个类的对象包含另一个类的对象
继承:一个类继承另一个类的公开对象+方法

  1. 使用类的规则

文件名必须与public类的名字相同
一个源文件中只有一个public类
一个非public类应该封装良好,一般通过调用类中的方法来修改和获取类中的变量
方法的使用一般有隐士参数和显示参数

  1. name n = new name
  2. n.salary(5); //其中n叫做隐式参数(实例的对象名),5叫做显式参数

image.png

  1. 对象的构造
  1. new Date() //构造了一个新对象,返回值是Date对象的引用
  2. Date deadline //定义了一个对象变量,但是不是一个对象,也没有引用对象,也不是随机指针
  3. Date deadline = new Date() //定义了一个引用新构造出的日期的变量

注:局部变量不会自动初始化为null,需要new或者手动赋值null

  1. 类设计技巧

1)一定要保证数据私有
2)一定要对数据私有化
3)不要在类中使用过多的基本类型(使用一个新类来打包他们)
4)不是所有的域都需要独立的域访问器和域更改器
5)将指责过多的类进行分解
6)类名和方法名要体现他们的职责
7)优先使用不可变的类

  1. 日期类的使用

更改器方法:访问并修改对象的方法
访问器方法:只访问而不修改

  1. LocalDate.now() //构造了一个新对象表示构造时的日期
  2. LocalDate.of(1999.12.13) //可以自定义日期
  3. LocalDate now = LocalDate.now()
  4. int year = now.getYear() //获取年(注意都不需要new)
  5. int month = now.getMonthValue() //获取月份
  6. int day = now.getDayOfMonth() //获取日
  7. DayOfWeek day = now.getDayOfWeek() //获取日期(后加.getValue可以获取1-7的数字)
  8. LocalDate now = now.plusDays(100) //获取这个日期加上100天后的日期,构造了一个新的日期对象,原来的没有变化
  9. LocalDate now = now.minusDays(int) //获取减去一个整数后的日期

打印日历的小程序

  1. package cn.an.cc;
  2. import java.time.DayOfWeek;
  3. import java.time.LocalDate;
  4. import java.util.Locale;
  5. public class an_1 {
  6. public static void main(String[] args){
  7. LocalDate date = LocalDate.now();
  8. int month = date.getMonthValue();
  9. int today = date.getDayOfMonth();
  10. date = date.minusDays(today-1);
  11. DayOfWeek week = date.getDayOfWeek();
  12. int value = week.getValue();
  13. //表头打印
  14. System.out.println("Mon Tue Wed Thu Fri Sat Sun");
  15. for(int i=1;i<value;i++)
  16. System.out.print(" ");
  17. //打印剩余表
  18. while (date.getMonthValue()==month){
  19. System.out.printf("%3d",date.getDayOfMonth());
  20. if(date.getDayOfMonth()==today)
  21. System.out.print("*");
  22. else
  23. System.out.print(" ");
  24. date = date.plusDays(1);
  25. if(date.getDayOfWeek().getValue()==1)
  26. System.out.println();
  27. }
  28. if(date.getDayOfWeek().getValue()!=1)
  29. System.out.println();
  30. }
  31. }

方法

  1. 方法类型

public:访问限制最宽,被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。
private:访问限制最窄,被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,不能跨包使 用。
protect:介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方 法只 能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。

  1. 静态种类

静态域:(所有实例化的对象共享一个静态域)
image.png
静态方法:(无需实例化对象,直接用类名调用静态方法,比如数学函数,static含义:属于类而不属于类对象的变量及函数)
image.png
image.png

  1. 方法参数

基本数据类型的参数传递的是数据的拷贝
实例化后的对象传递的是类的引用,可以改变对象中基本类型的值,但不可以改变对象的引用值(不能交换地址)


成员变量与局部变量


封装与隐藏

  1. 封装是将数据和行为组合在一个包内,对对象的使用者隐藏了数据的实现方式
  2. 封装的关键在于不能让一个类中的方法访问其他类中的数据域
  3. 封装的内部要求

a.一个私有的数据域
b.一个共有的域访问器方法
c.一个共有的域更改器方法

  1. 对象的引用

在封装良好的类中应该不能获取到对象的引用,只能获取到对象的克隆的引用

  1. class Employee{
  2. public Date getHireDay(){
  3. return (Date)hireDay.clone(); //克隆方法暂时不正确,待更新
  4. }
  5. }
  1. 可见性控制符

1)仅对本类可见——private
2)对所有类可见——public
3)对本包及所有子类可见——protected
4)对本包可见——默认,不需要修饰符


构造器

  1. 基础规定

a.构造器与类同名
b.每个类可以有一个以上的构造器
c.构造器可以有0个1个以上的参数
d.构造器没有返回值
e.构造器总是伴随new使用
注:不能对一个已存在的对象使用new来重新构造以设置实例域

  1. 重载

定义:多个方法有相同的名字不同的参数(返回值不算区别)
过程:名字相同则匹配参数类型相同的方法
注:不存在名字相同,参数类型相同但返回值类型不同的重载方法,java允许重载任何方法。

  1. 默认域初始化

如果域中无数值初始化,则数值类型初始化为0,bool类型初始化为false,引用类型初始化为null

  1. 无参数的构造器

如果类中没有构造器那么系统自动提供无参的构造器:所有实例域设置为默认值(即0,false,null)
如果类中有了一个构造器那么系统不再提供无参的构造器(这个时候最好自制无参构造器,否则报错)
image.png
image.png

  1. this的用法

在方法中与实例相同的参数名可以这样使用(this代表隐式参数:实例化对象)
image.png


类的继承

  1. 类,超类,子类

extends表明正在构造的新类派生于一个已存在的类,已存在的类称为 超类 基类 父类,新类称为子类,通常将具有特殊用途的方法放在子类中,将通用的方法放到超类中
image.png

  1. 覆盖方法

1)父类中的方法不适合的时候可以用子类中的同名方法进行覆盖
2)子类无法访问父类中的私有类(此时可以通过访问器进行访问)
3)如果重写的正是要用的访问器,那么就加上super前缀进行父类的方法访问
4)重写的方法的可见性一定要高于父类,最好一样(public那种)
image.pngimage.png
调用结果就是2(就是重写方法的时候如果调用了与自身同名的父类方法,那就加上super就行了)
image.png

  1. 继承类的特点

1)在子类中只能实现父类中元素的增加和重写但绝对不能删除某些元素
2)如果子类的

  1. 子类构造器

当子类不能在自身实现对父类中私有域的初始化的时候可以直接调用父类的构造器(但必须是子类构造器的第 一条语句)(直接super(构造器参数)即可)
image.png
注:子类必须调用父类的构造器,否则就会调用默认的构造器,如果超类无不带参数的构造器,子类中又没有显式的调用超类中的构造器,那么就会报错


多态

  1. 定义

多态:一个对象变量可以指定多种实际类型的现象(就是参数的不同)
动态绑定:运行时能够自动选择调用哪个方法的现象
好处:构造对象的时候不用修改左边的代码(就是为了方便)

  1. 置换法则

1)程序中出现超类对象的任何地方都可以用子类对象置换
例如可以将一个子类的对象赋给超类对象(还是可以调用子类中的方法的,前提是父类中有同名的)
image.png
2)一个超类变量可以引用任意一个子类(但是数据域可能无法访问)
image.png
注:这里person是manager的超类,可以用b访问manager中的方法,但是不可以用a访问manager中的方法,因为a声明时用的构造器所在的类中没有同名方法,如果有同名方法,那么可以访问manager中的方法,但是manager中的数据域a是访问不到的。
注:如果想要访问子类,那就将a强制转换成manager类,然后就可以访问了(需要重新定义一个m对象)
image.png
3)注意事项

  1. - 访问成员变量时,看new “=”左边是谁用谁的成员变量,找不到就继续想上找(骚一点,可以调用方法获得成员变量)
  2. - 访问方法时,看new的是谁用谁的方法(但是如果=左边的类中没有此方法就没有办法执行)

初始化块

  1. 初始化

在一个类的声明中可以包含很多代码块,只要构造类的对象,这些快就会执行
尽量把块放在类的末尾这样构造器传递出来的函数应该能被用上

  1. 初始化数据域的常用方法

1)所有数据初始化为默认值
2)按照出现的次序执行语句和初始化块
3)如果构造器第一行调用了第二个构造器,则执行第二个构造器主体
4)执行这个构造器的主体

  1. 随机数生成器

与C#不同的是先要实例化一个对象再调用随机数生成器生成一个范围内的随机数
image.png


包装类

Java中使用包将类组织起来,只要将类放在不同的包中,就不会产生重名冲突

  1. 类的导入

1)在每个类名之前添加完整的包名
2)使用import语句导入一个特定的类或方法(源文件的顶部,package语句的后边)

  1. java.time.LocalDate today = java.time.LocalDate.now(); //直接加包前缀
  2. import java.util.*; //先导入包(包名即可)
  3. LocalDate today = LocalDate.now();
  1. 静态导入

1)静态方法静态域(导入后可使用方法和域)
image.png
2)也可以进一步导入out;

1)如果两个包中有同名方法,则需要在方法名前指定包名,或者再import一次

  1. import java.util.*;
  2. import java.sql.*;
  3. import java.util.Date; //其中Date是两者的同名方法
  1. 对象包装器与自动装箱

1)基本概念:所有基本类型都有一个与之对应的类(Integer,Long,Float,Double,Short,Byte,Character,Void,Boolean)前六个派生于公共的超类number。
2)数组列表
使用基本类型的对象模式


equals与==、toString方法

  1. equals(P169)

1)如果两个数组的大小和下表对应的元素都相等则返回true
image.png
2)如果比较两个类
先调用超类的equals,如果检测失败,直接返回false,如果超类中的域都相等,就需要比较子类中的实例域
3)equals方法特性
a.自反性:x.equals(x) //true
b.对称性:y.equals(x) x.equals(y) //返回值相等
c.传递性:x.equals(y) y.equals(z) //如果都为true则x.equals(z)也为true
d.一致性:x.equals(y) //如果xy的引用没有变,则反复调用的结果不会变
e.非空性:x.equals(null) //对于任何非空的x,其结果都是false
image.png(true)
4)instanceof方法
用于判断此类是不是另一个类的子类(这个结果总是true)
image.png
5)getClass方法
获取对象或者变量或常量的类型
image.png
image.png(结果)
6)hashCode方法
定义在Object类中,每个对象都有一个默认的散列码,值是对象的储存地址
具体实现方法(P172)
7)数组检测
对于数组类型的域,可以使用静态的Arrays.equals方法检测
image.pngimage.png

  1. toString方法

将数组元素转换成字符串输出(在数组一章中有记录)

  1. ==方法

比较两个变量本身的值,引用变量比较的就是地址,而equals比较的是两个地址中的值

示例:

  1. String s1,s2,s3="abc",s4="abc";
  2. s1 = new String("abc");
  3. s2 = new String("abc");
  4. s1.equals(s2) //true 两个包含的内容相同
  5. s1 == s2 //false 两个变量的内存地址不同
  6. s3 == s4 //true 两个变量引用的地址相同 :这个要着重注意

总之:equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。
== 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。


final修饰符

  1. 作用

相当于C中const,一旦初始化后就不可修改

  1. 修饰类

这个类将不能被继承,且类中的方法都被隐式的指定为final方法(谨慎使用)

  1. 修饰方法

这个方法不再会被子类覆盖(子类不能够出现与父类final一模一样的方法,不能重写,但能重载)
但如果在父类中同时又有private和final同时修饰,那么子类可以直接写一个同名方法,他们两个谁也见不到谁

  1. 修饰变量

final成员变量表示常量,只能被赋值一次,赋值后不再改变(可以在初始化时不赋初值,构造时赋值)
如果修饰的是引用变量,那么引用的地址不能改变,但是地址上的内容可以改变


抽象类

  1. 定义

1)当一个超类很少用于构造对象时就将其定义为抽象类,用abstract修饰。
2)抽象类无法创建对象,只能定义之后来引用子类的对象(如下)。

  1. 用法

1)包含一个或多个抽象方法的类本身必须被声明为抽象的
2)一个抽象的类中所有方法都被抽象化,但是实例域没有被抽象化(作为父类可以被抽象化)
image.png
image.png
3)抽象方法充当着占位的角色(所以只用在父类中声明一下方法就行了,不用再写内容,用子类同名方法)
image.png(抽象类)
image.png(子类)


接口

1. 接口规则

  1. - **可以包含的内容:**
  2. - 常量
  3. - 抽象方法
  4. - 默认方法
  5. - 静态方法
  6. - 私有方法
  7. - **接口的使用规则**
  8. - **注意事项**<br />如果实现类并没有覆盖重写接口中的所有抽象方法,<br />那么这个实现类自己就必须是抽象类。** **
  9. - **可用函数(判断animal是不是Dog类型的对象,返回值是Boolean类型的)<br />**![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580319525951-5a759792-b4eb-4c9b-9663-9a8a62937264.png#height=30&id=PqfNP&name=image.png&originHeight=30&originWidth=278&originalType=binary&ratio=1&size=22760&status=done&style=none&width=278)
  10. - **基本上与抽象类的使用非常相似**![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580304357357-24fc2552-cc0a-4cdf-899f-aa6a2715afdc.png#height=270&id=HWHwo&name=image.png&originHeight=270&originWidth=671&originalType=binary&ratio=1&size=149136&status=done&style=none&width=671)
  11. - **接口定义**(含默认类,默认方法子类可以不继承,这是为了方便升级而使用的)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580306947970-9d4a51e2-c949-489b-ae57-52ad2745652b.png#height=204&id=DP7Cm&name=image.png&originHeight=204&originWidth=393&originalType=binary&ratio=1&size=11565&status=done&style=none&width=393)
  12. - **接口继承**(注意关键字的改变,alt+回车 可以直接重写所有抽象类)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580306990317-38e6e06a-67da-4228-a363-7337ce4534f8.png#height=154&id=LjJi3&name=image.png&originHeight=154&originWidth=438&originalType=binary&ratio=1&size=7767&status=done&style=none&width=438)
  13. - **子类可以不重写默认方法(**也可以重写),仍可以使用,但是其他方法必须重写<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580307217757-e65a77ba-fbed-4f84-b708-d44f5f83baad.png#height=128&id=izLxf&name=image.png&originHeight=128&originWidth=394&originalType=binary&ratio=1&size=6209&status=done&style=none&width=394)
  14. - 直接使用接口作为参数传递(其中最复杂的一种使用方式)(类中不可以直接使用对象,必须调用方法)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580370210742-d8458b87-1e10-410e-9d25-3eb72e306a89.png#height=214&id=yJf40&name=image.png&originHeight=214&originWidth=377&originalType=binary&ratio=1&size=11197&status=done&style=none&width=377)

2. 接口内容

  1. - **接口中的静态方法**
  2. - 静态方法不能通过接口实现类的对象来调用,只能直接接口名调用<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580308218255-ed88dd30-c91c-428d-8596-1b814c36635b.png#height=30&id=KkbKC&name=image.png&originHeight=30&originWidth=182&originalType=binary&ratio=1&size=1188&status=done&style=none&width=182)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580308163532-d35582ba-7dcf-4da9-a2db-7322e020ebf9.png#height=125&id=JYqIw&name=image.png&originHeight=125&originWidth=442&originalType=binary&ratio=1&size=7180&status=done&style=none&width=442)
  3. - **接口中的私有方法(解决接口重复代码的问题,很可惜JAVA8中不支持)**
  4. - 普通私有方法<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580309323057-ca1c4950-ecc2-4c09-913f-c2e3f4a82cc3.png#height=162&id=nVW0u&name=image.png&originHeight=162&originWidth=395&originalType=binary&ratio=1&size=7921&status=done&style=none&width=395)
  5. - 静态私有方法(比普通私有方法多了一个static)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580309442323-a770a163-bb40-4663-b5ee-1bf8897b745b.png#height=161&id=bGoZQ&name=image.png&originHeight=161&originWidth=392&originalType=binary&ratio=1&size=8418&status=done&style=none&width=392)
  6. - **接口中的“常量”**
  7. - 常量的修饰符可以省略(但是还是常量,这三个修饰符的效果依然存在,常量必须赋值)

image.png

  1. - 常量的推荐命名规则:完全大写,单词中间用下划线隔开<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580310880032-45a09dd0-c7a4-4786-97a2-e5adc8e44b19.png#height=81&id=Q2L69&name=image.png&originHeight=81&originWidth=354&originalType=binary&ratio=1&size=3724&status=done&style=none&width=354)
  2. - 使用方法(这个可以通过实例化的对象调用,也可以直接接口名调用)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580310844830-2e1eb041-3bc1-4661-9f4b-775f5d9afca6.png#height=68&id=KnOpM&name=image.png&originHeight=68&originWidth=247&originalType=binary&ratio=1&size=2220&status=done&style=none&width=247)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580310981516-7584ebe8-58f4-4f05-bc42-ab186f2b30f0.png#height=28&id=LH1Th&name=image.png&originHeight=28&originWidth=213&originalType=binary&ratio=1&size=1350&status=done&style=none&width=213)

3.接口与抽象类的区别

  1. - **抽象类:不可以多继承(只能线性继承)**
  2. - **接口:**
  3. - 子类可以多继承(可以直接三叉形继承,中间用逗号隔开)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580312866025-d8293351-f786-4b66-bffe-1101a892c721.png#height=286&id=CQNt8&name=image.png&originHeight=286&originWidth=482&originalType=binary&ratio=1&size=13214&status=done&style=none&width=482)
  4. - 多继承中的接口中如果出现重复抽象方法,只需覆盖重写一次(指抽象方法)
  5. - 多继承中的接口中如果出现重复的默认方法,必须覆盖重写,会有报错提示与补全。![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580316178396-bf39672f-1fa1-435e-a58c-a94cff853295.png#height=340&id=u1hfn&name=image.png&originHeight=340&originWidth=612&originalType=binary&ratio=1&size=19476&status=done&style=none&width=612)
  6. - 可以一个接口继承多个接口(如果多个接口中的方法重复,需要重新定义(加上关键字default)![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580316916483-ead9bcb0-fa36-49de-aa6e-e23c52eddb97.png#height=41&id=A3Lfz&name=image.png&originHeight=41&originWidth=454&originalType=binary&ratio=1&size=2421&status=done&style=none&width=454)
  7. - **共同使用时**
  8. - 如果既继承了父类又继承了接口,且两者中有同名方法,则优先执行父类<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580316548157-69598591-f045-457c-b407-e27827d8be4f.png#height=34&id=hyoNS&name=image.png&originHeight=34&originWidth=615&originalType=binary&ratio=1&size=2744&status=done&style=none&width=615)

内部类

  1. 基本形式
    • 内部类的基本形式
      image.png
    • 内部类中值的调用权限
      1. - 内部类可以使用上级的所有变量和方法
      2. - 外部类使用内部类的变量时必须new一个对象
  2. 使用方法
    • 间接使用方法(在外部类的方法中调用内部类,在外部类的对象中调用方法)
      image.png

image.png

  1. - 直接使用方法(直接创建内部类的对象,外.内 对象名= new 外().new 内(),骚的一批)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580356776898-982dff8f-b19f-4c30-b7b5-8551c8dea1ec.png#height=63&id=ELUTj&name=image.png&originHeight=63&originWidth=422&originalType=binary&ratio=1&size=2700&status=done&style=none&width=422)
  1. 局部内部类
    • 局部内部类定义在外部类的一个方法中(只能在方法中使用,外部无法使用)
      1. - 如果局部内部类需要调用方法中的一个变量,那么这个变量必须是final类型(可以省略不写,但是必须要保证它的值确实不会变)<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580364683345-99bbb67f-f88b-4c57-b9f7-9a853a98c904.png#height=227&id=ft99w&name=image.png&originHeight=227&originWidth=354&originalType=binary&ratio=1&size=8610&status=done&style=none&width=354)
      2. - 原因:因为对象的生命周期长于方法,方法结束之后,内部类可以直接copy一份使用
  2. 匿名内部类
    • 匿名内部类(当接口的实现类或者父类的子类只需要使用唯一的一次的时候) (直接用接口new对象)
      image.png
    • 好处:不用再为了使用一个方法而单独创建一个继承类来调用方法,可以直接定义一个没有名子的类体来使用,不过每次再不同的地方使用需要重新定义
  3. 注意事项
    • 内部类的同名变量访问(很显然是套娃调用,多次镶套调用需要加上类名)
      image.png
      image.png
      image.png
    • 匿名内部类和匿名对象不是一回事:匿名对象是直接new的没有名字的对象

String(扩展)

1. toSting方法

  1. - **x.toString""+x等价,其实后者更强力,直接将x转化成字符串(基本类型也是可以的,但是前者不行)**
  2. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1579537041161-799122fd-75c0-47f2-8081-5f0180592171.png#height=58&id=wLN3u&name=image.png&originHeight=58&originWidth=233&originalType=binary&ratio=1&size=2538&status=done&style=none&width=233)
  3. - **数组toString**

Arrays.toString(数组名) //直接生成一维数组的字符串形势
Arrays.deepToString(数组名) //生成多维数组的字符串形式
image.png
image.png

2. StringBuilder方法

  1. - **基础使用方法<br />**![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580560188060-e9fc94fc-c2e6-4b6b-991f-effef2475481.png#height=108&id=a3eJe&name=image.png&originHeight=108&originWidth=454&originalType=binary&ratio=1&size=6186&status=done&style=none&width=454)
  2. - **append方法:添加数据(返回值类型和值都相同,所以根本不需要接受返回值,直接添加就行)<br />**![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580560336910-22f08f44-2a7b-4429-a173-fb8922967a84.png#height=182&id=kGjvv&name=image.png&originHeight=182&originWidth=455&originalType=binary&ratio=1&size=11266&status=done&style=none&width=455)![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580560381947-2a031af4-7b7e-4f45-8ea0-e40b1155bcb0.png#height=105&id=lH9za&name=image.png&originHeight=105&originWidth=65&originalType=binary&ratio=1&size=1098&status=done&style=none&width=65)****可以使用他的链式编程(很方便,居然还能添加自身!!!)<br />**![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580560631921-8ac11741-6687-421a-ad18-a9bddd14c10f.png#height=133&id=WosM8&name=image.png&originHeight=133&originWidth=621&originalType=binary&ratio=1&size=9007&status=done&style=none&width=621)**![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580560642384-95bdaf26-e705-4d55-923a-c73633be28dd.png#height=33&id=yBtVL&name=image.png&originHeight=33&originWidth=251&originalType=binary&ratio=1&size=1231&status=done&style=none&width=251)
  3. - **toString方法(完成StringStringBuilder之间的转化)<br />**![image.png](https://cdn.nlark.com/yuque/0/2020/png/710889/1580561020451-c6302b73-b72a-4fc4-b090-186de012f35e.png#height=275&id=MKlU0&name=image.png&originHeight=275&originWidth=521&originalType=binary&ratio=1&size=16195&status=done&style=none&width=521)