作者小头像 Lv.4
892 成长值

个人介绍

什么都了解一点,什么都不精通。

感兴趣或擅长的领域

数据库、编程语言、DevOps、微服务架构、云计算
个人勋章
  • 考证狂人
成长雷达
25
312
250
285
20

个人资料

个人介绍

什么都了解一点,什么都不精通。

感兴趣或擅长的领域

数据库、编程语言、DevOps、微服务架构、云计算

达成规则

发布时间 2021/09/06 15:10:48 最后回复 power11 2021/09/28 08:42:31 版块 社区活动
10529 22 1
发布时间 2021/07/06 15:43:54 最后回复 @Wu 2021/08/09 16:36:10 版块 社区活动
6919 156 1
他的回复:
华为云ID:yun1025933139 第二阶段笔记第1章 Java面向对象之类和对象1.1 面向过程和面向对象- 面向过程就是分析出解决问题的步骤,然后使用函数把这些步骤一步步实现。重点在完成的没恩过程上。- 面向对象,构成问题的事物分解成各个对象,描述某个事物在整个解决问题的步骤中的行为。面向对象关注的是解决问题所需要的对象。面向过程就是自己办事,面向对象就是托人办事。1.2 现实世界的面向对象- 模板就是类1.3 java的类和对象- java的类可以看做是一个模板,用于描述一类对象的行为和状态。对象是具体的物体,具有唯一性。必须先有类再有对象:类名 对象名 = new 类名();- new关键字表示创建一个对象;表示实例化对象;表示申请内存空间。1.5 实例变量和静态变量- 实例变量声明在一个类中,但在方法、构造方法和语句块之外;无static修饰;数值型变量默认值为0;布尔型变量默认值为false;引用类型默认值为null;实例变量属于该类的具体对象,必须产生该类对象,才能调用实例变量。(对象.实例变量)- 静态变量,独立于方法之外,用static修饰的变量,也叫类变量。static不能修饰局部变量(定义在方法中的变量就是局部变量)。属于整个类共有的,用static修饰。1.6 匿名构造块和构造函数- java构造函数也叫构造方法,是java中一种特殊的函数;构造函数没有返回类型,函数名和类名保持一致;new对象产生后,就调用了对象的属性和方法。- 作用:一般用来初始化成员属性和方法,格式:* 修饰符 类名 (参数列表) { }* 直接类名 (参数列表) { }public class Employee {public Employee(){} //默认无参构造函数public Employee(String name,int age){ //有参构造函数return; //构造函数中可以有return关键字,但是不能有具体的返回值类型} }- 构造方法不是手动调用的,是对象被创建的时候jvm调用的;如果一个类没有定义构造方法,jvm在编译的时候会给这个类默认添加一个无参构造方法;如果定义了构造方法,那么jvm不会再创建无参构造方法;创建对象的时候,有几个参数,就要有相应的构造方法,也是对应的要有几个参数;构造函数可以调用构造函数。- 匿名代码块{},匿名代码块的作用是对对象统一初始化,对象创建之前都会执行这个代码块。一个类中可以有多个匿名构造块,按顺序执行。1.7 构造函数重载- 构造函数重载是多态的一个典型的特例。多态:同一个方法名,不同的实现结果。类中有多个构造函数,参数列表不同(参数的个数、类型、顺序不同),重载构造函数来表达对象的多种初始化行为。1.8 方法定义和调用- 方法是类或对象的行为特征的抽象。java中的方法不能独立存在,必须定义在类体中。权限修饰符 返回值类型 方法名 (参数类型 参数名) {//方法体//返回值}- 方法定义的先后顺序无所谓,方法的定义不能产生嵌套包含关系(方法的内部不能再定义方法),方法定义中的返回值与传递的参数类型均为方法中定义的数据类型,在方法中可以进行返回数据的处理。- 方法的调用,方法定义了不会执行,需要调用才会执行。方法调用:本类中用:方法名(参数列表);外部类中用:外部类.方法名(参数列表)1.9 方法重载和编译时多态- 方法的重载,一个类中多个方法名相同,参数的列表不同(参数的个数、类型、顺序不同)。与修饰符无关,与返回值类型无关。- 早期绑定就是指被调用的目标方法如果在编译器可知,且运行期保持不变时,即可将这个方法与所属的类型进行绑定。重载的方法是早期绑定完成,调用重载方法,在编译时根据参数列表就可以确定方法。方法的重载也叫编译时多态。2.0 面向对象的封装- 封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。封装的原则:1.将不需要对外提供的内容都隐藏起来;2.把属性都隐藏,提供公共方法对其访问。封装的好处提高了数据访问的安全性,隐藏了实现细节。- 封装机制:高内聚、低耦合。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合就是仅暴露方法给外部使用。禁止直接访问一个对象中数据的实际表示,而应通过操作方法来访问,这称为数据的隐藏。2.2 this访问本类属性- this代表当前对象的一个引用。所谓当前对象,指的是调用类中方法或属性的那个对象。this只能在方法内部使用,表示对“调用方法的那个对象”的应用。this.属性名表示本对象自己的属性。2.3 this调用本类方法- this调用类的重载构造函数,必须位于构造函数的第一行。- this.方法名,表示调用当前对象自己的方法。2.4 this关键字使用注意* this不能用于静态方法和静态块。main方法也是静态的,所以this也不能用于main方法。2.6 static静态变量- static变量也称为静态变量,也叫做类变量。静态变量被类的所有对象共享,内存中只有一个副本,当且仅当在类初次加载时会被初始化,静态变量属于类,通过类名可以调用静态变量类名.静态变量名,也可以通过对象名.静态变量名调用。* 实例变量和静态变量的区别- 静态变量属于类,该类不生产对象,通过类名就可以调用静态变量- 实例变量属于该类的对象,必须产生该类对象,才能调用实例变量- 静态变量随类的加载存在于方法区中- 实例变量随对象的建立存在于堆内存中- 静态变量在程序开始时创建,在程序结束时销毁- 实例变量在对象创建的时候创建,在对象被销毁时销毁2.7 静态方法- static修饰的方法叫静态方法,也叫做类方法。静态方法中不能直接访问类的非静态成员变量和非静态成员方法。静态方法中不能使用this关键字,通过类名调用静态方法,也可以通过对象名.静态方法名调用。2.8 静态块- 静态代码块在类加载时执行,并且只执行一次。静态代码块在类中可以有多个,静态代码块中不能有this关键字。3.0 类的生命周期- 1)加载(Loading),java源文件编译成class文件,jvm将class文件读入内存,放入方法区。- 2)连接(Linking)[验证(Verification)>准备(Preparation)>解析(Resolution)]- 3)初始化(Initialization)* 以上三个阶段就是类加载阶段Class Loading- 4)使用(Using)- 5)卸载(Unloading)3.1 类的设计和分析3.3 java方法的参数类型- 参数是基本数据类型,传过来的就是这个参数的一个副本,函数不会改变原始对象。- 参数是引用类型,传过来的就是引用参数的副本,这个副本存放的是参数的地址,函数中可以改变原始对象。- 可变参数列表(int... a)只能有一个,且只能放在参数列表的最后。3.4 java方法的参数传递第2章 Java面向对象之继承1.1 继承的作用- 减少重复的冗余的相同属性和方法1.2 子类继承父类1.3 单继承和间接继承- java不支持多继承,只允许一个类直接继承另一个类。子类只能有一个父类,extends关键字后面只能有一个类名。1.4 Object类- Object类是java中所有类的始祖。java中的每一个类都是由他扩展而来,但是并不需要明确写出要继承它,java类都有object的方法。- toString()- equals(Object obj),该方法用来判断两个对象是否相同。如果没有被重写过,与==等价。- hashCode(),object类的hashCode()方法是返回对象存储地址1.5 对象向上转型- 向上转型,子类转换成为父类。格式:父类名称 对象名称 = new 子类名称()- 含义:把创建的子类对象当做父类看待和使用。1.6 对象向下转型- 向下转型,父类转换为子类,这是强制类型转换。格式:子类 引用 = (子类) 父类对象- 可能会出现ClassCastException异常。1.8 super访问构造函数- 在继承中子类的构造函数必须依赖父类提供的构造函数,super()访问调用父类的构造函数,必须在构造函数的第一行。- 如果父类有默认无参的构造函数,子类继承时可以不写super()。如果父类只提供有参的构造函数,子类的构造函数必须用super(参数),写出明确的参数来依赖父类的构造函数。super()必须在第一行。1.9 super访问父类的属性- super.属性,明确调用的是父类中声明的属性。2.0 super访问父类的方法- super.方法名2.1 super和this区别- super()调用父类的构造函数,this()调用本类的构造函数,都要求在第一行。super()和this()不能同时调用构造函数。- 代表的对象不同:this代表调用者本身这个对象;super代表父类对象的引用- this没有继承也可以使用;super只能在继承条件下使用。2.3 final修饰变量- final关键修饰的如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是应用数据类型的变量,则在对其初始化之后便不能再让其指向另一个对象。final修饰的变量都是常量,final可以修饰局部变量。2.4 final修饰方法- final修饰的成员方法不能被子类重写。当父类方法为final时,子类不能与父类有方法名、参数类型、参数个数及参数顺序都一样的方法。如果父类的方法为private,那么子类的同名方法为public是可以的。2.5 final修饰类- final修饰的类不能被子类继承,final类中的成员方法也默认为final。final类中的变量值是可以改变的。第3章 Java面向对象之多态1.1 子类和父类同名方法# 方法重写- 子类和父类同名方法,叫方法重写。- 前提:需要有继承关系- 表现:方法名必须相同、参数列表必须相同、返回值类型必须相同、修饰符范围可以扩大或相同,不能缩小(public>protected>default)* 不能重写父类的private方法,如果子类定义了父类private方法的同名方法,只是定义了一个新方法,不是方法重写。# 运行时多态- 后期绑定,如果被调用的方法在编译期无法被确定下来,只能够在程序运行期根据实际的类型绑定相关的方法,这种绑定方式也被称之为后期绑定。- 方法重写是根据实际的类型决定调用哪个重写的方法,发生在运行期间,也叫作运行时多态。方法重载是早期绑定,也叫编译时多态。1.2 static修饰同名方法- static修饰的方法是静态方法,也叫作类方法。使用private或static或final修饰的变量或者方法,属于早期绑定。1.3 解耦合- 动态绑定是在运行时根据具体对象的类型进行绑定,也就是后期绑定。- 解耦合,字面意思就是解除耦合关系。设计的核心思想:尽可能减少代码耦合,如果发现代码耦合,就要才去解耦技术。数据模型、业务逻辑和视图显示三层之间彼此降低耦合。1.4 同名变量- 子类和父类出现同名变量。1.5 方法重载和方法重写的区别1.7 抽象类的定义- 使用abstract关键字修饰的方法叫作抽象方法,抽象方法没有方法体。当一个类中包含了抽象方法,那么该类是抽象类,必须使用abstract关键字来修饰。抽象类可以有构造方法,可以完成抽象类本身的初始化。但是不能用new 构造方法来创建对象。[修饰符] abstract class 类名 {//定义抽象方法[修饰符] abstract 方法返回值类型 方法名([参数列表]);//其他属性或方法}1.8 抽象类的作用- 抽象类的作用类似于“模板”,其目的是方便开发人员根据抽象类的格式来修改和创建新类。抽象类主要用于继承,有利于程序的扩展。- 抽象方法是为了继承和修改,所以只能用public和protected修饰,不能用private修饰,不能用final和static修饰。- 子类必须实现抽象父类的所有抽象方法。1.9 抽象类设计和场景2.1 接口的定义- 接口就是某个事务对外提供的一些功能的声明。可以利用接口实现多态和多继承。使用interface关键字定义接口。实现接口用关键字implements,也有继承的意思。2.2 接口的特点和作用- jdk 1.8之前接口的特性* 接口允许多继承,多个接口之间用逗号隔开* 接口没有构造方法* 接口中的属性默认是final,用public static final修饰* 接口中的方法默认是抽象方法,用public abstract修饰* 接口继承接口用extends,不能用implement。子类实现接口用implements- jdk 1.8之后接口的特性* 在接口内部可以定义多个常量和抽象方法,定义常量时必须进行初始化赋值* 接口中可以定义默认方法和类方法,可以有多个,可以有方法体。* 在接口中定义常量时,可以省略public static final修饰符,接口会默认添加。接口的抽象方法也可以省略public abstract,定义default默认方法和static静态方法时,可以省略public修饰符。这些修饰符系统都会默认添加。* 静态方法可以直接通过接口.方法名来调用* 当一个类实现接口时,如果这个类是抽象类,只需要实现接口中的部分抽象方法即可,否则需要实现接口中的所有抽象方法。* 一个类可以通过implements关键字同时实现多个接口,被实现的多个接口之间用英文逗号隔开。* 接口之间可以通过extends关键字实现继承,并且一个接口可以同时继承多个接口,接口之间用英文逗号隔开。* 一个类在继承一个类的同事还可以实现接口,此时extends关键字必须位于implements关键字之前。[修饰符] interface 接口名 [extends 父接口1,父接口2,...] {[public] [static] [final] 常量类型 常量名 = 常量值;[public] [abstract] 方法返回值类型 方法名([参数列表]);[public] default 方法返回值类型 方法名([参数列表]){//默认方法的方法体}[public] static 方法返回值类型 方法名([参数列表]){//类方法的方法体}}- 接口的作用,接口是一种能力。程序设计关心实现类有何能力,而不关心实现细节;面向接口的约定而不考虑接口的具体实现。2.3 接口的设计2.5 抽象类is-a# 抽象类* 1)抽象类不能创建对象。只能创建其非抽象子类的对象* 2)抽象类中,可以有构造器,是供子类创建对象时,初始化父类成员使用的* 3)抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类* 4)抽象类的子类,必须重写抽象父类中所有的抽象方法,否则子类必须定义成抽象类* 5)抽象类中的抽象方法不能用private、final、static修饰* 6)抽象类存在的意义是为了被子类继承。抽象类提现的是模板思想* 符合is-a关系的设计使用继承,继承是代码重用的一种方式,将子类共有的属性和行为放到父类中,子类与父类是is-a关系2.6 接口has-a2.7 猜数字游戏实战第4章 Java面向对象之包和内部类1.1 包的定义和导入- java使用包package存放两个同名的类而不冲突,包对应java源文件的目录结构。- 包名由小写字母组成,不能以圆点开头或结尾。包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名。- 包的作用:允许组成较小的单元(类似文件夹),易于找到和使用响应的文件;放置命名冲突,区分面相同的类;有助于实施访问权限控制。- 使用不在同一个包中的类,需要用import关键字导入这个类。import 包名.类名;* 每个包都是独立的,顶层包不会包含子包的类* package和import的顺序是固定的,package必须位于第一行,只允许有一个package语句,其次是import,然后是类的声明。1.2 系统常用包* java.lang 提供java语言程序设计的基础类,虚拟机内嵌包,不需导包直接使用。* java.util 提供处理日期、时间、随机数等各种使用工具的类* java.io 提供与输入输出相关的类* java.net 提供实现网络操作相关的类* java.sql 提供使用访问并处理数据库中的数据* java.nio 为输入输出提供缓冲区的类* java.text 提供处理文本、日期、数字和消息的类和接口* java.awt 包含用于创建用户界面和绘制图形图像的类* java.swing 与awt功能相同的纯java组件类# lang包* lang包下常用的类:- String:- Class:- ClassLoader:- Enum:- Math:- Number:- Object:- Package:- Runtime:- StringBuffer:- StringBuilder:- System:- Thread:- ThreadGroup:- Throwable:- Process:* lang包下常用的接口- Appendable:用于追加字符串- Cloneable:用于复制类对象- Runnable:用于实现类对象具有线程功能- Comparable:用于类对象的排序1.3 创建jar包和引用ide工具命令行:- 1) 编写java源文件- 2) 用javac编译生成class文件- 3) 将所有要打包的class文件存在的目录以及依赖的jar包全部放在一个根文件夹里面(比如bin)- 4) 编写MANIFEST清单文件,指定程序入口以及其他添加的依赖jar包- 5) 执行打包命令:jar {ctxu}[vfm0M][jar-文件名][manifest-文件名][-C 目录] 文件名...eg: jar cvfm xxx.jar MANIFEST.MF -C bin/ .* -c创建新的jar文件包* -v生成详细报告文档并打印到标准输出* -f指定jar文件名,必须参数* -m指定需要包含的MANIFEST清单文件- MANIFEST文件- MANIFEST文件时jar打包必须的,MANIFEST文件描述了打包后的jar文件信息,存在于包的META-INF文件夹。* Manifest-Version是版本号* Main-Class是jar包的入口程序,指定运行类的全程(含包名)。这样可以使用java -jar xx.jar直接运行jar包。* Class-Path是指打包时需要依赖的其他jar包。* 注意:每个MANIFEST属性冒号与内容之间都有一个空格,最后还要留一行空行。1.4 访问权限控制- private(当前类访问)- default(同包访问)- protected(子类可访问)- public(公共)1.6 普通内部类的定义- 内部类分为成员内部类、局部内部类、静态内部类、匿名内部类* 在一个类中除了可以定义成员变量、成员方法外,还可以定义类,这样的类称为成员内部类。在成员内部类中,可以访问外部类的所有成员,抱愧成员变量和成员方法;在外部类中,同样可以访问成员内部类的变量和方法。* 语法:外部类名.内部类名 变量名 = new 外部类名().new 内部类名();1.7 局部内部类* 局部内部类也叫做方法内部类,就是定义在某个局部范围中的类,它和局部变量一样,都是在方法中定义的,其有效范围只限于方法内部。局部内部类可以访问外部类的所有成员和方法,而局部内部类中的变量和方法却只能在创建该局部内部类的方法中访问。1.8 静态内部类* 所谓静态内部类,就是使用static关键字修饰的成员内部类。静态内部类在成员内部类前增加了static关键字,在静态内部类中只能访问外部类的静态成员,同时通过外部类访问静态内部类成员时,可以跳过外部类从而直接通过内部类访问静态内部类成员。* 语法:外部类名.静态内部类名 变量名 = new 外部类名.静态内部类名();1.9 匿名内部类* 匿名内部类就是没有名称的内部类。在调用包含有接口类型参数的方法时,通常为了简化代码,可以直接通过匿名内部类的形式传入一个接口类型参数,在匿名内部类中直接完成方法的实现。* 语法:new 父接口(){//匿名内部类的实现部分}第5章 Java面向对象之函数式编程5.1 函数式编程- 函数就是有输入量、输出量的一套计算方案,强调功能做什么,而不是以什么形式做。- 函数式编程的本质是传递一段代码。JDK1.8中新增的Lambda表达式,只针对有一个抽象方法的接口实现,以简洁的表达式形式实现接口功能来作为方法参数。public class TestDemo {new Thread(new Runnable(){//传统写法,用匿名函数实现抽象方法@overridepublic void run(){System.out.println("线程1跑起来了!");}}).start();//Lambda函数式写法new Thread(()-> System.out.println("线程2跑起来了!")).start();}5.2 函数式接口# Lambda表达式语法:([数据类型 参数名,数据类型 参数名,...]) -> {表达式主体}- ()内的参数用来向表达式主体内部实现的接口方法传递参数,多个参数之间用逗号分割,可以省略数据类型,只有一个参数时还可以省略小括号。- ->用来指定参数数据指向,不能省略- {表达式主体},本质是接口中抽象方法的具体实现。如果只有一条语句,可以省略大括号;在lambda表达式主体中只有一条return语句时,也可以省略return关键字。* 接口中有且只有一个抽象方法时才能使用Lambda表达式代替匿名内部类。因为Lambda表达式是基于函数式接口实现的。所谓函数式接口是指有且仅有一个抽象方法的接口,Lambda表达式就是java中函数式编程的体现,只有确保接口中有且仅有一个抽象方法,Lambda表达式才能顺利推导出所实现的这个接口中的方法。- 在jdk1.8中,接口标注有@FunctionalInterface注解的即为函数式接口,在函数式内部有且只有一个抽象方法。5.3 方法引用* Lambda表达式的主体只有一条语句时,程序不仅可以省略包含主体的花括号,还可以通过英文双冒号::的语法格式来引用方法和构造器(即构造方法)。- 1)类名引用静态方法printAbs(-10,n -> Math.abs(n)); //Lambda表达式方式printAbs(-10,Math::abs); //方法引用的方式- 2)对象名引用方法- 3)构造器引用方法- 4)类名引用普通方法第6章 Java面向对象之枚举和包装类6.1 枚举类的定义● 枚举是一种特殊类。枚举是有固定实例个数的类型。可以把枚举理解成有固定个数实例的多例模式。enum关键字的作用就像是class或interface。enum定义枚举类型,继承自java.lang.Enum类。而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都默认为final,也是public和staic,与接口中的常量限制相同。可以通过类名直接使用。public enum Senson {SPRING ,SUMMER ,AUTUMN ,WINTER; //必须放在最前面}6.2 枚举类的结构- 枚举像普通的类一样可以添加静态和非静态的属性和方法。6.3 枚举的应用- 枚举类的常用API:* values()取得所有的枚举成员实例,并以数组方式返回* compareTo()比较两个枚举对象在枚举时的顺序,前一个的索引减去后一个的索引* ordinal()依枚举顺序得到位置索引,默认从0开始6.4 Java中,以下关于枚举类的说法错误的是哪个?A. 枚举类型也可以实现一个或多个接口 B. 枚举类型实现接口时也要实现该接口中全部方法 C. 枚举类型里定义抽象方法无须显示的使用abstract关键字 D. 枚举类型继承接口要使用关键字是extends 正确 6.5 包装类定义- java是面向对象的编程语言,但它所包含的8种基本数据类型却不支持面向对象的编程机制(没有属性和方法)。在java中,很多类的方法都需要接收引用类型的对象,jdk通过提供一系列的包装类将基本数据类型的值包装为引用数据类型的对象。- 8种基本数据类型对应的包装类都是数据类型的首字母大写,除了char对应Character、int对应Integer6.6 自动装箱和拆箱- 自动装箱:是指将基本数据类型的变量赋值给对应的包装类变量。- 自动拆箱:是指将包装类对象类型直接赋值给一个对应的基本数据类型变量。* 基本数据类型、基本数据包装类以及字符串之间的相互转换- 1.通过引用数据类型字符串String类的valueof()方法可以将8种基本数据类型转换为对应的字符串类型。- 2.通过8种包装类的静态方法valueof()既可以将对应的基本数据类型转换为包装类,也可以将变量内容匹配的字符串转换为对应的包装类(Character包装类除外)。- 3.通过8种包装类的有参构造方法同样既可以将对应的基本数据类型转换为包装类,也可以将变量内容匹配的字符串转换为读音的包装类(Character包装类除外)。- 4.通过8种包装类的静态方法parseXxx()可以将变量内容匹配的字符串转换为对应的基本数据类型。- 5.包装类都重写了object类中的toString()方法,以字符串的形式返回被包装的基本数据类型的值。6.7-1下列选项中继承自Number的是哪个?A. Integer和long B. Character和 Integer C. Byte和Integer 正确 D. long和short -2关于Java中的Float数据类型,下列说法错误的是哪个?A. Float是一个类 B. Float在java.lang包中 C. Float a = 1.0是正确的赋值方式 正确 D. Float a = new Float(1.0)是正确的赋值方式 -3下列选项中,无法正确实现将包装类型转换为基本数据类型的是哪个?A. int i = new Integer(1).intValue(); B. boolean b = Boolean.valueOf(false).booleanValue(); C. char c = Character.valueOf("c").charValue(); 正确 //character没有这个方法 D. float f = Float.valueOf("1.23").floatValue(); 6.8 单例模式- 设计模式(Design pattern)代表了最佳实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的经验和错误总结出来的。- GOF(四人帮Gang of Four),1994年4人合著了Design patterns的书,首次提出了设计模式的概念,基于以下的面向对象设计原则:● 对接口编程而不是对实现编程;● 优先使用对象组合而不是继承。总共23种设计模式,这些模式可以分为三大类:创建型模式(Creational Patterns)、结构性模式(Structural Patterns)、行为型模式(Behavioral Patterns)。★ 单例模式(Singleton Pattern)是java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。* 注意:- 1.单例类只能有一个实例;- 2.单例类必须自己创建自己的唯一实例;- 3.单例类必须给所有其他对象提供这一实例。* 实现:- 创建一个SingleObject类。SingleObject类有它的私有构造函数和本身的一个静态实例。- SingleObject类提供了一个静态方法,供外界获取它的静态实例。SinglePatternDemo类使用SingleObject类来获取SingleObject对象。* 方式一:懒汉式6.9 策略模式- 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。- 意图:定义一系列的算法,把它们一个个封装起来,别切使他们可以相互替换。- 主要解决:在有多种算法相似的情况下,使用if...else所带来的复杂度和难以维护。- 何时使用:一个系统有许多许多类,而区分它们的只有它们直接的行为。- 如何解决:将这些算法封装成一个一个的类,任意的替换。- 关键代码:实现同一个接口。本质是多态的体现。* 优点:1.算法可以自由切换;2.避免使用多重条件判断;3.扩展性良好。* 缺点:1.策略类会增多;2.所有策略都需要对外暴露。# 使用场景:- 1)如果在一个系统里有许多类,他们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。- 2)一个系统需要动态地在几种算法中选择一种。- 3)如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。6.10 工厂模式* 工厂模式(factory pattern)是java中最常用的设计模式之一。属于创建型模式,它提供了一种创建对象的最佳方式。- 在工厂模式中,创建对象时不会对客户暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。- 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。- 主要解决:主要解决接口选择的问题。- 何时使用:我们明确地计划不同条件下创建不同实例时。- 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。* 关键代码:创建过程在其子类执行。* 优点:1.一个调用者想创建一个对象,只要知道其名称就可以了;2.扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以;3.屏蔽产品的具体实现,调用者只关心产品的接口。* 缺点:每增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。# 使用场景:- 1)日志记录器:记录可能记录到本地硬盘、系统事件、远程服务等,用户可以选择记录到什么地方。- 2)数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库有变化时。- 3)设计一个连接服务器的框架,需要三个协议POP3、IMAP、HTTP,可以把这三个作为产品类,共同实现一个接口。* 注意事项:- 作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。6.11 代理模式* 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建拥有现有对象的对象,以便向外界提供功能接口。- 意图:为其他对象提供一种代理以控制对这个对象的访问。- 主要解决:在直接访问对象时带来的问题。比如要访问的对象在远程机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。- 何时使用:想在访问一个类时做一些控制。- 如何解决:增加中间层。* 关键代码:实现与被代理类组合。* 优点:1.职责清晰;2.高扩展性;3.智能化* 缺点:1.由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。2.实现代理模式需要额外的工作,有些代理模式的实现非常复杂。# 使用场景:- 1).远程代理- 2).虚拟代理- 3).Copy-on-Write代理- 4).保护(Protect Access)代理- 5).Cache代理- 6).防火墙(Firewall)代理- 7).同步化(Synchronization)代理- 8).智能引用(Smart Reference)代理6.12 门面模式* 将一个复杂系统划分为几个较小的子系统。门面模式也叫外观模式(Facade Pattern),属于结构型模式,它向现有的系统添加一个可以访问系统的接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
发布时间 2021/07/06 15:43:54 最后回复 @Wu 2021/08/09 16:36:10 版块 社区活动
6919 156 1
他的回复:
华为云ID:yun1025933139第一周笔记(7.5-7.11)第1章 类和对象1.1 面向过程和面向对象- 面向过程就是分析出解决问题的步骤,然后使用函数把这些步骤一步步实现。重点在完成的没恩过程上。- 面向对象,构成问题的事物分解成各个对象,描述某个事物在整个解决问题的步骤中的行为。面向对象关注的是解决问题所需要的对象。面向过程就是自己办事,面向对象就是托人办事。1.2 现实世界的面向对象- 模板就是类1.3 java的类和对象- java的类可以看做是一个模板,用于描述一类对象的行为和状态。对象是具体的物体,具有唯一性。必须先有类再有对象:类名 对象名 = new 类名();- new关键字表示创建一个对象;表示实例化对象;表示申请内存空间。第2章 类和对象的组成2.1 实例变量和静态变量- 实例变量声明在一个类中,但在方法、构造方法和语句块之外;无static修饰;数值型变量默认值为0;布尔型变量默认值为false;引用类型默认值为null;实例变量属于该类的具体对象,必须产生该类对象,才能调用实例变量。(对象.实例变量)- 静态变量,独立于方法之外,用static修饰的变量,也叫类变量。static不能修饰局部变量(定义在方法中的变量就是局部变量)。属于整个类共有的,用static修饰。2.2 匿名构造块和构造函数- java构造函数也叫构造方法,是java中一种特殊的函数;构造函数没有返回类型,函数名和类名保持一致;new对象产生后,就调用了对象的属性和方法。- 作用:一般用来初始化成员属性和方法,格式:* 修饰符 类名 (参数列表) { }* 直接类名 (参数列表) { }public class Employee {public Employee(){} //默认无参构造函数public Employee(String name,int age){ //有参构造函数return; //构造函数中可以有return关键字,但是不能有具体的返回值类型} }- 构造方法不是手动调用的,是对象被创建的时候jvm调用的;如果一个类没有定义构造方法,jvm在编译的时候会给这个类默认添加一个无参构造方法;如果定义了构造方法,那么jvm不会再创建无参构造方法;创建对象的时候,有几个参数,就要有相应的构造方法,也是对应的要有几个参数;构造函数可以调用构造函数。- 匿名代码块{},匿名代码块的作用是对对象统一初始化,对象创建之前都会执行这个代码块。一个类中可以有多个匿名构造块,按顺序执行。2.3 构造函数重载- 构造函数重载是多态的一个典型的特例。多态:同一个方法名,不同的实现结果。类中有多个构造函数,参数列表不同(参数的个数、类型、顺序不同),重载构造函数来表达对象的多种初始化行为。2.4 方法定义和调用- 方法是类或对象的行为特征的抽象。java中的方法不能独立存在,必须定义在类体中。权限修饰符 返回值类型 方法名 (参数类型 参数名) {//方法体//返回值}- 方法定义的先后顺序无所谓,方法的定义不能产生嵌套包含关系(方法的内部不能再定义方法),方法定义中的返回值与传递的参数类型均为方法中定义的数据类型,在方法中可以进行返回数据的处理。- 方法的调用,方法定义了不会执行,需要调用才会执行。方法调用:本类中用:方法名(参数列表);外部类中用:外部类.方法名(参数列表)2.5 方法重载和编译时多态- 方法的重载,一个类中多个方法名相同,参数的列表不同(参数的个数、类型、顺序不同)。与修饰符无关,与返回值类型无关。- 早期绑定就是指被调用的目标方法如果在编译器可知,且运行期保持不变时,即可将这个方法与所属的类型进行绑定。重载的方法是早期绑定完成,调用重载方法,在编译时根据参数列表就可以确定方法。方法的重载也叫编译时多态。2.6 面向对象的封装- 封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。封装的原则:1.将不需要对外提供的内容都隐藏起来;2.把属性都隐藏,提供公共方法对其访问。封装的好处提高了数据访问的安全性,隐藏了实现细节。- 封装机制:高内聚、低耦合。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合就是仅暴露方法给外部使用。禁止直接访问一个对象中数据的实际表示,而应通过操作方法来访问,这称为数据的隐藏。第3章 this关键字3.1 this访问本类属性- this代表当前对象的一个引用。所谓当前对象,指的是调用类中方法或属性的那个对象。this只能在方法内部使用,表示对“调用方法的那个对象”的应用。this.属性名表示本对象自己的属性。3.2 this调用本类方法- this调用类的重载构造函数,必须位于构造函数的第一行。- this.方法名,表示调用当前对象自己的方法。3.3 this关键字使用注意* this不能用于静态方法和静态块。main方法也是静态的,所以this也不能用于main方法。第4章 static关键字4.1 static静态变量- static变量也称为静态变量,也叫做类变量。静态变量被类的所有对象共享,内存中只有一个副本,当且仅当在类初次加载时会被初始化,静态变量属于类,通过类名可以调用静态变量类名.静态变量名,也可以通过对象名.静态变量名调用。* 实例变量和静态变量的区别- 静态变量属于类,该类不生产对象,通过类名就可以调用静态变量- 实例变量属于该类的对象,必须产生该类对象,才能调用实例变量- 静态变量随类的加载存在于方法区中- 实例变量随对象的建立存在于堆内存中- 静态变量在程序开始时创建,在程序结束时销毁- 实例变量在对象创建的时候创建,在对象被销毁时销毁4.2 静态方法- static修饰的方法叫静态方法,也叫做类方法。静态方法中不能直接访问类的非静态成员变量和非静态成员方法。静态方法中不能使用this关键字,通过类名调用静态方法,也可以通过对象名.静态方法名调用。4.3 静态块- 静态代码块在类加载时执行,并且只执行一次。静态代码块在类中可以有多个,静态代码块中不能有this关键字。第5章 类的生命周期和实战5.1 类的生命周期- 1)加载(Loading),java源文件编译成class文件,jvm将class文件读入内存,放入方法区。- 2)连接(Linking)[验证(Verification)>准备(Preparation)>解析(Resolution)]- 3)初始化(Initialization)* 以上三个阶段就是类加载阶段Class Loading- 4)使用(Using)- 5)卸载(Unloading)5.2 类的设计和分析第6章 java方法参数和值传递6.1 java方法的参数类型- 参数是基本数据类型,传过来的就是这个参数的一个副本,函数不会改变原始对象。- 参数是引用类型,传过来的就是引用参数的副本,这个副本存放的是参数的地址,函数中可以改变原始对象。- 可变参数列表(int...a)只能有一个,且只能放在参数列表的最后。6.2 java方法的参数传递