2021-07-21 Java课堂笔记Day06

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的常用方法

    • StringBuilderappend(int i)int参数的字符串表示法附加到此序列。
      StringBuilderappend(long lng)long参数的字符串表示法附加到此序列。
      StringBuilderappend(Object obj) 追加 Object参数的字符串 Object形式。
      StringBuilderappend(String str) 将指定的字符串附加到此字符序列。
    • StringBuilderinsert(int offset, String str) 将字符串插入到此字符序列中。
      intlastIndexOf(String str) 返回指定子字符串最右边出现的字符串内的索引。
      intlastIndexOf(String str, int fromIndex) 返回指定子字符串最后一次出现的字符串中的索引。
    • intlength() 返回长度(字符数)。
    • StringBuilderreverse() 导致该字符序列被序列的相反代替。
    • voidsetCharAt(int index, char ch) 指定索引处的字符设置为 ch
    • Stringsubstring(int start) 返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。
      Stringsubstring(int start, int end) 返回一个新的 String ,其中包含此序列中当前包含的字符的子序列。
      StringtoString() 返回表示此顺序中的数据的字符串。
      voidtrimToSize() 尝试减少用于字符序列的存储。
实现一个将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.设计获取实例的方法(静态)

在创建静态对象时创建实例(饿汉式)

在获取方法判断中判断有无实例,没有就建立,有就返回(懒汉式)

单例设计模式优点:只生产一个实例,减少了系统的开销,当一个对象的产生需要较多资源时,如读取配置文件,产生其他的依赖对象时,可在应用启动时就产生一个实例对象,然后让其永驻内存的方式来解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值