一.类和对象
1.面向对象开发
个人感觉是是拿着别人已经准备好的东西,来做事情,不用管其中的过程是怎么实现的
创建对象,用对象去调用其中的方法 只注重结果 不注重过程是怎么实现的
是一种以对象为中心的编程思想,通过指挥对象实现具体的功能.
2.面向过程开发
个人感觉是解决问题的过程需要一步一步的实现 可能在C语言中应用较多
注重过程 是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的.
3.类与对象的关系
类是对象的模板 对象是类的具体实现
类是具备相同属性的和行为的事物的抽象
对象是是能够看得到摸的着的真实存在的实体
类中的属性通过成员变量来体现
类中的行为通过成员方法来体现
4.单个对象内存图
5.多个不同对象的内存图
总结:
多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份
6.成员变量和局部变量
两者区别
a.在类中的位置不同
成员变量:类中方法外
局部变量:在方法中
b.作用域不同
成员变量:作用域在整个类中 ,类中的成员都能调用
局部变量:作用域在方法中,出了方法就不能修改了
c.生命周期不同
成员变量:随着对象的存在而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的运行结束而结束
d.初始值不同
成员变量:基本数据类型0 , 0.0 ,false, 引用数据类型 null
局部变量:没有默认初始化值,必须先定义,赋值才能使用
7.面向对象的三大特征之—封装
java的三大特征 封装,继承多态
封装的好处:
1.提高了代码的安全性
private修饰词限制了外界修改内部的成员
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
2.提高了代码的复用性
把代码用方法进行封装,封装可以将功能封装成类,从而通过基类与派生类的机制来提高代码的复用性
3.隐藏了代码的复杂性
将复杂的代码隐藏在实体类中,不让外部看到内部复杂的实现步骤
8.this关键字
作用:
主要用于区别成员变量和局部变量的重名问题
- 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
- 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
9.private关键字
被private修饰的成员变量,成员方法被私有了,只能通过提供get\set方法来操作其中的属性
10.构造方法
空参构造
格式:
public 类名{
}
满参构造
格式:
public 类名(数据类型 变量名){
}
构造方法的作用:
- 创建对象时候给类的(属性)成员变量初始化值
执行时机 :
- 创建对象的时候调用,每创建一次对象,就会执行一次构造方法
- 不能手动调用构造方法
构造方法的创建 :
如果没有定义构造方法,系统将给出一个默认的无参数构造方法
如果定义了构造方法,系统将不再提供默认的构造方法
构造方法的创建 :
如果没有定义构造方法,系统将给出一个默认的无参数构造方法如果定义了构造方法,系统将不再提供默认的构造方法
推荐的使用方式 :
无论是否使用,都手动书写无参数构造方法,和带参数构造方法
11.标准类(JavaBean)
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,long和class方法获取。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制发现和操作这些JavaBean 的属性。
javaBean在-- MVC设计模型 --中是model,又称模型层,在一般的程序中,我们称它为数据层,就是用来设置数据的属性和一些行为,然后我会提供获取属性和设置属性的get/set方法
MVC的概念,即M-model-模型:JavaBean;V-view-表现:JSP页面;C-control-控制和处理:Servlet。
JavaBean的好处:
1.提高代码的可复用性:对于通用的事务处理逻辑,数据库操作等都可以封装在JavaBean中,通过调用JavaBean的属性和方法可快速进行程序设计。
2.程序易于开发维护:实现逻辑的封装,使事务处理和显示互不干扰。
3.支持分布式运用:多用JavaBean,尽量减少java代码和html的混编。
4.可以便捷地传递数据
12.String类
String类的常用方法:
1.char charAt(int index) 返回指定索引处的 char值。
2. int compareTo(String anotherString) 按字典顺序比较两个字符串。 正数为大 负数为小 相等为0
3. String concat(String str) 将指定的字符串连接到该字符串的末尾。 返回的是一个新串
4. boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结尾。
5. boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开头。
6. boolean equals(Object anObject) 将此字符串与指定字符串进行比较。区分大小 写
7. boolean equals(Object anObject) 将此字符串与指定对象进行比较。 不区分大小写
8. byte[] getBytes() 获取字节数组
9. int indexOf(int ch) 返回指定字符第一次出现的字符串内的索引。
10.boolean isEmpty() 字符串是否为空
11.int length() 返回此字符串的长度。
12.String replace(char oldChar, char newChar) 将旧的字符串内容替换为新的字符串内容 返回的是一个新串
13.String[] split(String regex) 将字符串按照指定的格式拆分
14.char[] toCharArray() 将此字符串转换为新的字符数组。
15.String toLowerCase() 将此 String所有字符转换为小写。 返回的是一个新串
16.String toUpperCase() 将此 String所有字符转换为大写. 返回的是一个新串
17.String trim() 删除任何前导和尾随空格。
18.String substring(int beginIndex) 截取字符串 beginIndex:开始索引
不含头含尾
String substring(int beginIndex, int endIndex) 截取字符串 不含头不含尾
字符串的比较
- == 比较基本数据类型:比较的是具体的值
- == 比较引用数据类型:比较的是对象地址值
- public boolean equals(String s) 比较两个字符串内容是否相同、区分大小写
- boolean equals(Object anObject) 比较两个字符串内容是否相同。 不区分大小写
创建字符串对象的区别对比
- 通过构造方法创建
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同 - 直接赋值方式创建
以“ ”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
13.StringBuilder类
概述 : StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的
StringBuilder和String的区别
String字符串在创建之后其中的内容不可改变
StringBuilder在创建之后其中的内容可以改变
StringBuilder中的常用方法
1.将String对象转为StringBuilder
StringBuilder sb = new StudentBuilder(String s);
2.将StringBuilder对象转为String对象
String s1=sb.toString;
3.public StringBuilder append()在StringBuilder对象后面追加内容 可以链式调用 返回对象本身
sb.append().append()
4. public StringBuilder reverse() 字符串反转 将其中的字符串反着打印
14.ArrayList类
ArrayList的常用方法
构造方法
ArrayList() 创建一个初试容量为10的集合 会自动扩容 不会出现索引越界异常
常用方法
1.public boolean add() 给集合中添加元素追加到集合的结尾 返回结果
2.public boolean remove(int index) 根据索引删除集合中元素
3.public boolean remove(Obect obj) 根据对象删除集合中元素
4.E get(int index) 返回此列表中指定位置的元素。
5.void clear() 从列表中删除所有元素。
6.void add(int index, E element) 在此列表中的指定位置插入指定的元素。
7.boolean contains(Object o) 如果此列表包含指定的元素,则返回 true 。 判断集合中有无此对象
8.int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
9.boolean isEmpty() 如果此列表不包含元素,则返回 true 。 判断集合是否为空
10.boolean retainAll(Collection<?> c) 仅保留此列表中包含在指定集合中的元素。
11.E set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
12.int size() 返回此列表中的元素数。
15.Git版本控制工具
作用:版本控制,协同开发
Git的基本工作流程
1.从远程仓库克隆(clone)到本地仓库
2.代码起初放在工作区workSpace
3.将代码Add添加到暂存区(Index)
4.暂存区将代码提交(commit)到本地仓库(Repository)
5.推(push)到远程仓库(Remote Repository)
6.拉取(pull)将远程仓库中更新的内容拉取到本地仓库
16.分类思想
分工协作,专人干专事
创建项目的流程(尽量做到见名知意)
1.打开IDEA界面
2.create new project 创建新的项目 最好选择创建空的项目 避免出现路径错误
3.create new moudle 创建新的模块
4.create package 创建包 具体包名前面一般是公司域名反着写
5.创建具体的包 根据包名存储具体代码
常见包名
a.controller 视图层 存放的代码是与客户界面打交道的代码
b.service 业务层 存放的代码是逻辑业务相关的代码
c.dao 持久层 存放的代码是和数据库打交道的代码
d.domain 存放的是JavaBean类 实例类
e.entry 运行测试代码的包
f.lib 存放第三方提供的jar包
g.img 存放图片的包
17.static(静态)关键字
所有被static关键字修饰的成员都属于类不属于对象 会被存放在静态区
(只能通过类名.直接调用)
static关键字不能修饰类(只有在内部类情况下才能修饰)
被static修饰的内部类可以直接作为一个普通类来使用,而不需实例一个外部类
static修饰的方法(静态方法)特点:
- 静态方法只能访问静态的成员
- 非静态方法可以访问静态的成员,也可以访问非静态的成员
- 静态方法中是没有this关键字
static修饰的成员变量(静态成员)特点:
- 数据会被所有成员共享
- 被static修饰的成员变量属于类,不属于这个类的某个对象
- 其中的成员修改数据的话其他的对象中的数据会跟着发生改变
static修饰的特点
- 随着类的加载而加载,优先于对象存在
- 可以通过类名调用
- 被类的所有对象共享
18.面向对象的三大特征之—继承(extends)
父类别名基类,超类 子类别名派生类
概念:
继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法
继承的好处:
1.提高了代码的复用性
将相同的代码抽取到了父类中 子类直接拿来用就行了
2.提高了代码的维护性
只需要修改父类中的代码子类就会拥有父类的新属性
继承的弊端
提高了父类与子类代码之间的耦合性 父类中的属性改变子类就被动改变 削弱了子类的自主性
继承的特点:
1.只能单继承 子类只能有一个直接父类
2.可以多层继承 可以子-父-Obeject的继承逻辑
3.不允许多继承 子类不允许存在多个父类
继承中变量的访问特点(掌握)
在子类方法中访问一个变量,采用的是就近原则。
- 子类局部范围找
- 子类成员范围找
- 父类成员范围找
- 如果都没有就报错(不考虑父亲的父亲…)
super关键字
this&super关键字:
- this:代表本类对象的引用
- super:代表父类存储空间的标识(可以理解为父类对象引用)
this和super的使用分别
- 成员变量:
- this.成员变量 - 访问本类成员变量
- super.成员变量 - 访问父类成员变量
- 成员方法:
- this.成员方法 - 访问本类成员方法
- super.成员方法 - 访问父类成员方法
- 构造方法:
- this(…) - 访问本类构造方法
- super(…) - 访问父类构造方法
继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类中无参的构造方法
子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认都是:super()
this(…)super(…) 必须放在构造方法的第一行有效语句,并且二者不能共存
继承中成员方法的访问特点
通过子类对象访问一个方法
- 子类成员范围找
- 父类成员范围找
- 如果都没有就报错(不考虑父亲的父亲…)
方法重写
方法重载:
在同一个类中方法名,参数列表,返回值类型全部一致
检验方法是否重载的注解@Overload
方法重写:
在子父类继承关系或者接口与实现类实现前提下 方法名,参数列表返回值类型一样
检验方法是否是重写的注解@Override
方法重写的注意事项
- 私有方法不能被重写(父类私有成员子类是不能继承的)
- 子类方法访问权限不能更低(public > 默认 > 私有)
- 静态方法不能被重写,如果子类也有相同的方法,并不是重写的父类的方法
19.权限修饰符
public(公共的)> product(受保护的)>default(默认的)>private(私有的)
20.抽象类(abstract)
概述:
当我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了!
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类!
抽象类的特点:
- 抽象类和抽象方法必须被abstract关键字修饰
- 有抽象方法的类必须是抽象类
- 抽象类中可以没有抽象方法
- 抽象类可以有构造方法
- 一个类继承了抽象类 要么重写父类中的抽象方法 要么本身就是抽象类
abstract和final关键字不能同时使用
21. 模板设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
模板设计模式
把抽象类整体就可以看做成一个模板,模板中不能决定的东西定义成抽象方法
让使用模板的类(继承抽象类的类)去重写抽象方法实现需求
固定的东西不需要改变 我们只需要改变需要变动的
模板设计模式的优势
模板已经定义了通用结构,使用者只需要关心自己需要实现的功能即可
开闭原则
开放对代码的拓展性 关闭对原有代码的修改
22.final关键字
final修饰的类不能被继承
final修饰得到成员方法不能被重写
final修饰的基本数据类型是常量 值不能改变
final修饰的引用数据类型地址值不能改变 但是地址里面的内容可以改变
final关键字一般配合static关键字一起使用
23.代码块
概述:
在Java中,使用 { } 括起来的代码被称为代码块
局部代码块
- 位置: 方法中定义
- 作用: 限定变量的生命周期,及早释放,提高内存利用率
构造代码块
- 位置: 类中方法外定义
- 特点: 每次构造方法执行的时,都会执行该代码块中的代码,并且在构造方法执行前执行
- 作用: 将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性
静态代码块
- 位置: 类中方法外定义
- 特点: 需要通过static关键字修饰,随着类的加载而加载,并且只执行一次
- 作用: 在类加载的时候做一些数据初始化的操作
24.接口(interface)
概述:
接口里面存放的基本都是方法
接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
Java中接口存在的意义
- 用来定义规范
- 用来做功能的拓展
- 弥补Java不能多层继承的缺陷
接口的特点
接口使用关键字interface
类实现接口使用implements关键字
接口不能实例化(创建对象)
我们可以创建接口的实现类来实现
接口的子类
要么是重写所有抽象方法
要么子类本身就是抽象类
接口的成员特点
成员变量
只能是常量
默认修饰符:public static final
构造方法
没有,因为接口主要是扩展功能的,而没有具体存在
成员方法
只能是抽象方法
默认修饰符:public abstract
类和接口的关系
类与类之间的关系:
只能单继承,不能多继承,但是能多层继承
类与接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口与接口的关系
继承关系,可以单继承,也可以多继承
接口组成更新
接口中的默认方法(Java 8):
- 格式
public default 返回值类型 方法名(参数列表) { } - 作用
解决接口升级的问题
静态方法(Java 8)
格式
public static 返回值类型 方法名(参数列表) { }
注意事项 - 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
- public可以省略,static不能省略
私有方法(Java 9)
格式1
private 返回值类型 方法名(参数列表) { }
格式2
private static 返回值类型 方法名(参数列表) { }
注意事项 - 默认方法可以调用私有的静态方法和非静态方法
- 静态方法只能调用私有的静态方法
25.面向对象的三大特征之—多态
什么是多态
同一个事物在不同形态下的不同行为
多态的前提
- 子父类继承关系或接口实现关系
- 要有方法重写
- 父类变量(引用)指向子类对象
多态中的成员访问特点
成员访问特点
成员变量
编译看父类,运行看父类
成员方法
编译看父类,运行看子类
多态的好处和弊端
- 好处
(1)简化了代码
(2)提高了代码的维护性
(3)提高了代码的扩展性 - 弊端
不能使用子类的特有成员多态中的转型
- 向上转型
父类引用指向子类对象就是向上转型 - 向下转型
子类型 对象名 = (子类型)父类引用;
多态出现转换异常问题解决
使用 instanceof
使用格式
变量名 instanceof 类型
通俗的理解:判断关键字左边的变量,是否是右边的类型,返回boolean类型结果
26.内部类
概念:
在类中的一个类
格式:
class 外部类名{
修饰符 class 内部类名{
}
}
内部类的访问特点
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
成员内部类
- 成员内部类的定义位置
- 在类中方法,跟成员变量是一个位置
- 外界创建成员内部类格式
- 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
- 举例:Outer.Inner oi = new Outer().new Inner();
- 私有成员内部类
- 将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。
静态成员内部类
- 静态成员内部类访问格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
- 静态成员内部类中的静态方法:外部类名.内部类名.方法名();
局部内部类
- 局部内部类定义位置
- 局部内部类是在方法中定义的类
- 局部内部类方式方式
- 局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用
- 该类可以直接访问外部类的成员,也可以访问方法内的局部变量
匿名内部类
匿名内部类的前提
- 存在一个类或者接口,这里的类可以是具体类也可以是抽象类
匿名内部类的格式
- 格式:new 类名 ( ) { 重写方法 } new 接口名 ( ) { 重写方法 }
匿名内部类的本质
- 本质:是一个继承了该类或者实现了该接口的子类匿名对象
- 匿名内部类的细节
- 匿名内部类可以通过多态的形式接受
匿名内部类在开发中的使用
- 当发现某个方法需要,接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去,来简化传统的代码
27.Lambda表达式
函数式编程思想概述
在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿数据做操作”
面向对象思想强调“必须通过对象的形式来做事情”
函数式思想则尽量忽略面向对象的复杂语法:“强调做什么,而不是以什么形式去做”
而我们要学习的Lambda表达式就是函数式思想的体现
Lambda表达式的标准格式
- 格式:
(形式参数) -> {代码块}- 形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
- ->:由英文中画线和大于符号组成,固定写法。代表指向动作
- 代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
- 组成Lambda表达式的三要素:
- 形式参数,箭头,代码块
Lambda表达式的省略模式
- 省略的规则
- 参数类型可以省略。但是有多个参数的情况下,不能只省略一个
- 如果参数有且仅有一个,那么小括号可以省略
- 如果代码块的语句只有一条,可以省略大括号和分号,和return关键字
Lambda表达式的使用前提
- 使用Lambda必须要有接口
- 并且要求接口中有且仅有一个抽象方法
Lambda表达式和匿名内部类的区别
- 所需类型不同
- 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
- Lambda表达式:只能是接口
- 使用限制不同
- 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
- 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
- 实现原理不同
- 匿名内部类:编译之后,产生一个单独的.class字节码文件
- Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
函数式接口
接口中有且只有一个抽象方法
验证接口是否是函数式接口的注解@FunctionalInterface