1.API类 — StringBuilder
可变的字符序列,但不保证同步
可将StringBuilder视为容器,因此内容是可变的
1.1 String和StringBuilder的区别
String:内容不可变
StringBuilder:内容可变
1.2 StringBuilder的构造方法
StringBuilder() 构造一个没有字符的字符串构建器,初始容量为16个字符。 |
---|
StringBuilder(int capacity) 构造一个没有字符的字符串构建器,由 capacity 参数指定的初始容量。 |
StringBuilder(String str) 构造一个初始化为指定字符串内容的字符串构建器。 |
1.3 StringBuilder的常用方法
-
-
StringBuilder
append(int i)
将int
参数的字符串表示法附加到此序列。StringBuilder
append(long lng)
将long
参数的字符串表示法附加到此序列。StringBuilder
append(Object obj)
追加Object
参数的字符串Object
形式。StringBuilder
append(String str)
将指定的字符串附加到此字符序列。
-
-
-
StringBuilder
insert(int offset, String str)
将字符串插入到此字符序列中。int
lastIndexOf(String str)
返回指定子字符串最右边出现的字符串内的索引。int
lastIndexOf(String str, int fromIndex)
返回指定子字符串最后一次出现的字符串中的索引。
-
-
-
int
length()
返回长度(字符数)。
-
-
-
StringBuilder
reverse()
导致该字符序列被序列的相反代替。
-
-
-
void
setCharAt(int index, char ch)
指定索引处的字符设置为ch
。
-
-
-
String
substring(int start)
返回一个新的String
,其中包含此字符序列中当前包含的字符的子序列。String
substring(int start, int end)
返回一个新的String
,其中包含此序列中当前包含的字符的子序列。String
toString()
返回表示此顺序中的数据的字符串。void
trimToSize()
尝试减少用于字符序列的存储。
-
实现一个将String和StringBuilder两个对象之间的相互转化
1 StringBuilder转化为String
String toString()
2 将String转化为StringBuilder
String Builder(String str)
String和StringBuilder的使用场景
单纯字符串用String;字符串需要动态拼接的用StringBuilder
StringBuffer和StringBuilder的区别
StringBuffer 线程同步且安全
StringBuilder 线程不同步且不安全
一般情况下用StringBuilder,在多线程环境下进行字符串拼接则考虑StringBuffer
2.继承
是面向对象的三大特征之一。
格式: public class 子类名 extends 父类名{……}
继承其他类的类 称为子类,派生类 ,衍生类
被继承的类 称为父类,超类,基类
2.1子类特点:
1 子类可以继承父类的非私有成员
2 子类还可以拥有自己特有的成员
2.2继承产生的影响:
1 继承会产生父子类关系,子类会拥有父类的非私有成员和自己的特有成员
2 子类继承了父类的非私有的方法和属性
3 子类可以使用父类的方法和属性,也可以创建新的
4 关键字为extends 因此子类不是父类的子集,而是拓展
2.3继承规则
子类不能直接访问父类的私有成员
2.4 继承的好处和弊端
好处:
1 提高了代码的复用性
2 提高了代码的维护性
弊端:
继承使得类与类之间产生关系,类的耦合性增强,当父类变化时,子类实现也必须跟着变化,削弱了子类的独立性
开发的原则:高内聚,低耦合
什么时候使用继承? 一定当两个类之间满足 类1 is a 类2 的关系时才使用继承,不要为了减少代码量而使用继承
2.5继承中变量的访问特点
变量的使用遵循就近原则,即在有继承关系的类中,变量优先在子类的局部变量找,再到子类的成员变量找,再到父类中找(不考虑父类的父类),如果都没有则报错
2.6 super
super用法和this相似:
this代表本类的当前成员 可以访问成员变量、成员方法,调用本类构造方法
super代表本类的父类对象 可以访问父类成员变量、成员方法,调用父类构造方法
构造方法调用,this和super不能同时出现(都必须在第一行)
用super访问成员变量或方法时,成员变量或方法一定是子类和父类拥有同名变量和方法的时候
2.7继承中构造方法的访问特点
在子类的构造方法中,会默认调用父类的无参构造,但不会继承
子类会继承父类的数据,还可能使用父类的数据,因此子类初始化前一定会进行父类数据的初始化
每一个子类的构造方法中,默认有一条super()语句。
如果父类中没有无参构造则需要通过super()语句调用父类的带参构造或在父类中定义无参构造
2.8继承中成员方法的访问特点
与变量的访问特点相同
2.9方法的重写
子类中出现和父类一模一样的方法的声明。
应用场景:子类需要父类的功能,而父类的功能不能满足子类的需求。在方法中,子类方法要有自己的特点。(声明相同,内容不同)
注意事项:
1 private方法不能重写
2 子类重新时,不能使用比父类严格的访问修饰符(private>default(默认)>public 严格度)
3 当父类方法为私有时,如果子类出现和父类一样的方法,两个方法之间没有关系
2.10 继承的注意事项
1 一个子类只能继承一个父类
2 支持多层继承
3 一定当两个类之间满足 类1 is a 类2 的关系时才使用继承,不要为了减少代码量而使用继承
3 多态
面向对象的三大特征之一
3.1概述
同一个对象,在不同时候表现出来的不同形态称之为多态。
前提条件:
1 有继承关系(实现关系)
2 有方法的重写
3 要有父类的引用指向子类对象 (父类 对象名 = new 子类)
要点:
1 多态时方法的多态,不是属性的多态
2 多态的存在有三个必要条件
3 父类的引用指向子类对象后,用该父类引用调用子类重写的方法(多态的产生)
具体来讲:多态指的是同一个方法调用,由于对象不同会有不同行为
3.2多态中的成员的访问特点
对成员变量 访问的是父类的成员变量
对成员方法 如果是父类和子类共有的成员方法,则访问子类的成员方法,否则访问不到。
3.3多态的好处和弊端
好处 :提高了代码的拓展性。定义方法的时候,以父类作为参数,使用时,以具体的子类作为真实操作对象
弊端 :不能访问子类特有的成员方法
3.4虚拟方法调用
子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法。父类根据
不同的子类对象,动态调用该子类的方法,这样的方法的调用在编译器是无法确定的。
编译时类型和运行时类型
3.5重写和重载的区别
在方法调用前,编译器已经确定要调用的方法,称之为早绑定或静态绑定
对于多态,只有方法调用时,执行器才会确定要调用的具体方法,称之为晚绑定或动态绑定。
重载:允许存在多个参数不同的同名方法,可以包括父类和子类,即子类可以重载父类的同名不同参数的方法。要求方法名称相同,参数列表不同
在重载中,编译器根据方法不同的参数列表,对同名方法的名称作修饰,对于编译器这些方法就变成了不同的方法,调用的地址在编译期就绑定了。
重写:一定是子类对父类的,要求方法的声明形式完全一致
3.6 在多态中访问子类特有成员
将父类引用转变成子类引用,就能访问子类的特有方法
3.6.1多态的转型
类比基本类型数据类型转换
子类为小的数据类型,父类为大的数据类型
java中的对象强制类型转换称为造型
子类到父类可以自动转换
父类到子类要造型
无继承关系的类造型是非法的(报错)
3.6.2 instanceof
用于检验某一个引用是否是另一个类的实例对象,返回值为boolean型。
格式 : 对象名 instanceof 类名
向上转型:子类到父类的类型转换(自动转换)
向下转型:父类到子类的类型转换,需要造型(强制转换)
3.6.3 继承成员变量和继承方法的区别
子类方法重写父类方法时,将父类同名方法覆盖,系统将不会把父类的方法转移到子类
对于实例变量,即使子类与父类定义完全相同的实例变量,子类的实例变量也不会覆盖父类的实例变量
4 包
4.1 package
包:本质为文件夹,对类进行分类管理
包的命名格式:采用多级格式,每一级之间用“ . ”分割,一般采用公司域名的逆序,如:cn.lanqiao.模块名
4.2导包(import)
格式:import java.包名.类名
String类位于java.lang下,在使用String类时不需要导包
凡是java.lang包下的类使用时都不需要导包。除此之外的类在使用时都要进行导包操作
意义:
当类有包信息后,类的类名会有两种形式
全类名 包名.类名 java.util.Scanner
简单类名 类名 Scanner
在类的内部使用类时,可以直接用类的简单类名进行操作
4.3 JDK的主要包
java.lang 包含一些java语言的核心类 如:String Thread
java.awt 主要包含了一些图形化窗口相关操作的工具类
java.net 主要包含了一些和网络相关的操作
java.io 主要包含IO操作一些相关的类
java.util 主要包含的是一些使用的工具类
5 修饰符
5.1权限修饰符
修饰符 | 同一个类 | 同一个包中子类和无关类 | 不同包的子类 | 不同包的无关类 |
---|---|---|---|---|
private | √ | |||
default(默认) | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
√ 表示该修饰符修饰的成员在该范围内可访问
5.2状态修饰符
final (最终的)
static (静态)
5.2.1 final
关键字 可修饰成员方法、成员变量、类
final修饰的特点:
修饰方法时,方法不能被重写;修饰变量时,变量变为常量,赋值时可以直接赋值也可用构造方法赋值,不能改变值;修饰类时,类不能被继承(格式:final class 类名)
final修饰局部变量:
局部变量为基本数据类型时,值不能修改;局部变量为引用类型时,引用类型的地址不能改变,但地址指向的对象的属性可以改变
5.2.2 static
可修饰成员方法、成员变量
适用范围:属性、方法、代码块、内部类
修饰特点:
1 随着类的加载而加载
2 优先于对象存在
3 修饰的成员,被所有成员共享
4 访问权限允许时,可用不创建对象,直接被类调用,调用时可以使用类名
访问特点:
静态成员方法只能访问静态成员,非静态成员方法可以访问非静态成员,也可访问静态成员
5.2.3 static修饰的对象运行时的内存分配
JVM方法区:
所有方法区在逻辑上是堆的一部分,但一些简单的实现可能不会选择进行垃圾收集或进行压缩。对HopSpot JVM而言,方法区别名non-heap,目的是与堆分开。
方法区可看作一块独立于java堆的内存空间,主要存放类信息,而堆中主要存放实例化的对象。
演变:JDK7前,方法区称为永久代;JDK8后,使用元空间取代永久代,类信息和编译后的代码数据也移动到元空间,元空间不在堆内存中,而是直接占用本地内存。
元空间本质和永久代类似,都是对JVM规范中对非法取得实现,最大区别在与:元空间不在虚拟机设置的内存中而是占用本地内存。永久代和元空间内部结构时不同的。
方法区储存的信息:类型信息(包名、类名、父类等)、常量、静态变量、编译后的代码数据等
方法信息:方法名称、方法返回值类型、方法形参、方法的修饰符
non-final的类变量(static)
静态变量和类关联,随类的加载而加载,成立类数据在逻辑上的一部分,类变量被类的所有实例对象共享,存在于方法区中,即使没有实例对象也可以访问。
6 单例设计模式
设计模式:大量时间中总结和理论化后优选的代码结构、编程风格以及解决问题的思考方式
单例设计模式:采取一定的方法保证在整个系统运行中,对某一个类只能存在一个实例对象,并且该类只提供一个获取该类实例的方法
设计模式思路:
1.私有化构造方法 2.创建类的静态对象 3.设计获取实例的方法(静态)
在创建静态对象时创建实例(饿汉式)
在获取方法判断中判断有无实例,没有就建立,有就返回(懒汉式)
单例设计模式优点:只生产一个实例,减少了系统的开销,当一个对象的产生需要较多资源时,如读取配置文件,产生其他的依赖对象时,可在应用启动时就产生一个实例对象,然后让其永驻内存的方式来解决。