一、面向对象编程概述:
1.程序设计的思路:
面向对象时软件开发中的一类编程风格、开发范式,除了面向对象还有面向过程、指令式编程和函数式编程。
(1)面向过程的程序设计思想POP(Process-Oriented Programming)
关注的焦点是过程,过程就是操作数据的步骤,如果某个过程的实现代码重复出现,可以把这个过程抽取为一个函数,可以大大简化冗余代码,便于维护;以函数为组织单位,是一种执行者思维,适合解决简单问题,扩展能力差,后期维护难度大;
(2)面向对象的程序设计思想OOP(Object Oriented Programming):
关注的焦点是类,在计算机程序设计过程中参照现实中的事物将事物的属性特征和行为特征抽象出来,用类表示。代码以类为组织单位,每种事物都具备自己的属性和行为,是一种设计者思维,适合解决复杂问题,代码扩展性强,可维护性高;
二、Java语言的基本元素:类和对象
1.类和对象的概述:
(1)类(Class):具有相同特征的事物的抽象描述,是抽象的,概念上的定义;
(2)对象(Object):实际存在的该类事物的每个个体,是具体的,因而也称为实例;
2.类的成员概述:
面向对象程序设计的重点是类的设计,类的设计其实就是类的成员的设计。类是一组相关属性和行为的集合,也是类最基本的两个成员。
(1)属性:该类事物的状态信息,对应类中的成员变量;
(2)行为:该类事物要做什么操作,或者基于事物的状态能做什么,对应类中的成员方法;
面向对象完成具体功能操作的三步流程:
(1)创建类,并设计类的内部成员(属性和方法);
class 类名{
// 成员变量
// 成员方法
}
(2)创建类的对象;
类名 对象名 = new 类名();
(3)通过对象调用其内部声明的属性或方法完成相关的功能;
对象名.成员变量名;
对象名.成员方法名();
3.对象的内存管理:
(1)栈stack:方法内定义的变量(包括对象)存储在栈中;
(2)堆heap:new出来的结构,比如数组实体、对象的实体以及对象中的属性
(3)方法区method area:存放类的模板
创建类的多个对象时,每个对象在堆空间中有一个对象实体,每个对象实体中保存着一份类的属性,如果修改某一个对象的属性值时不会影响其他对象此属性的值。如果两个对象变量指向堆空间中的同一个对象实体,则通过其中某个对象变量修改对象的属性时会影响另外一个对象变量此属性的值。
4.类的成员之一:成员变量(field)
(1)变量的分类:成员变量和局部变量
在方法体外、类内声明的变量称为成员变量;在方法体内部等位置声明的变量称为局部变量
(2)成员变量和局部变量的对比:
a.成员变量和局部变量的声明格式相同: 数据类型 变量名 = 变量值;
b.成员变量和局部变量都有对应的作用域,离开对应的作用域后变量便会失效;
c.成员变量和局部变量的使用规则相同:成员变量和局部变量都必须先声明、后赋值、再使用;
d.成员变量和局部变量在类中声明的位置不同:成员变量声明在类内和方法外,局部变量声明在方法和构造器内部;
e.成员变量和局部变量在内存中分配的位置不同:成员变量随着对象的创建而存储在堆空间中,局部变量存储在栈空间中;
f.成员变量和局部变量的生命周期不同:成员变量随着对象的创建而创建,随着对象的消亡而消亡,局部变量随着方法对应的栈帧入栈而在栈中分配,随着方法对应的栈帧出栈而消亡;
g.成员变量和局部变量的权限修饰符使用不同:成员变量可以使用权限修饰符修饰,而局部变量不可以使用权限修饰符修饰
h.成员变量和局部变量的初始默认化值不同:成员变量都有默认初始化值,而局部变量而没有默认初始化值;如果没有给成员变量赋值则使用默认初始化值,而如果没有给局部变量赋值而直接使用则会报错
5.类的成员之二:方法(method)
(1)方法(method,函数)的理解:
方法是类或对象行为特征的抽象,用来完成某个功能操作,在某些语言中也称为函数或者过程。将功能封装为方法的目的是可以实现代码重用,减少冗余,简化代码。Java里的方法不能独立存在,所有的方法都必须定义在类中。
(2)方法声明的格式:
权限修饰符 [其他的一些修饰符] 返回值类型 方法名(形参列表)[throws 异常类型]{
//方法体
}
[]内部的不是必须的
(3)方法声明的细节:
a.Java规定的四种权限修饰符:private\缺省\protected\public
b.返回值类型:描述当调用完毕此方法后是否需要返回一个结果,无返回值时使用void即可;有返回值时需要指明返回的数据类型,可以是基本的数据类型也可以是引用数据类型,同时需要在方法内配合使用"return + 返回值类型的变量或者常量"
c.方法名:属于标识符,需要满足标识符的规定和规范,要做到见名知意
d.形参列表:形参属于局部变量,且可以声明多个形参,格式如下:
(形参类型1 形参1,形参类型2 形参2,...)
没有形参时,形参列表的一对小括号()不能省略;有形参时,根据方法调用时需要的不确定的变量的类型和个数确定形参列表中形参的类型和个数
e.方法体:当调用一个方法时真正执行的代码,体现了方法的功能;
(4)调用实例方法:
方法调用语法格式:
对象.方法名([实参列表]);
(5)使用的注意点:
a.方法必须先声明,后使用,且方法必须定义在类的内部;
b.方法调用一次就执行一次,不调用不执行;
c.方法中可以调用类中的方法或属性,但不可以在方法中定义其他的方法
(6)return关键字:
a.作用1:结束一个方法;
b.作用2:结束一个方法的同时返回数据给方法的调用者(方法声明中如果有返回值类型,则方法内需要搭配return使用)
c.return后面不能带有具体的执行语句
(7)方法调用的内存解析:
形参:方法在声明时一对()内声明的一个或多个形式参数
实参:方法在被调用时实际传递给形参的变量或常量
6.对象数组:
数组的元素可以是基本数据类型,也可以是引用数据类型,当元素是引用类型中的类时,称为对象数组;
类名[] 数组名 = new 类名[数组长度];
for(int i = 0;i< 数组名.length;i++)
{
类名 对象名 = new 类名();
数组名[i] = 对象名;
}
for(int i = 0;i< 数组名.length;i++)
{
数组名[i].成员变量名1 = 值1;
数组名[i].成员变量名2 = 值2;
...
}
对象数组的内存解析:
7.方法的重载:
(1)方法重载的定义:
在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不相同即可,满足这样特征的多个方法彼此之间构成方法的重载;
(2)两同一不同:
a.两同:同一个类,相同的方法名;
b.一不同:参数列表不同,体现为参数的个数和类型不同
方法的重载与形参的名、权限修饰符、返回值类型都没有关系;
(3)在同一个类中不允许有两个相同类型的方法,两个方法方法名相同并且形参列表完全相同,则这两个方法相同。
(4)形参列表相同指的是形参个数和类型都相同,与形参名无关
8.方法的值传递机制:
(1)对于方法内声明的局部变量来说,如果出现赋值操作:
如果是基本数据类型,则将此变量保存的数据值传递出去;
如果是引用数据类型的变量,则将此变量保存的地址值传递出去;
(2)实参给形参赋值过程:
如果形参是基本数据类型的变量,则将实参保存的数据值赋给形参;
如果形参是引用数据类型的变量,则将实参保存的地址值赋给形参;
9.可变个数形参的方法:
(1)使用场景:
在调用方法时可能会出现方法形参的类型是确定的,但是参数的个数不确定,此时可以使用可变个数形参的方法;
(2)格式:
(参数类型 ... 参数名)
(3)说明:
a.可变个数形参的方法在调用时,针对于可变的形参赋的实参的个数可以为0个、1个或多个;
b.可变个数形参的方法与同一个类中,同名的多个方法之间可以构成重载;
c.可变个数形参的方法与同一个类中方法名相同,且与可变个数形参的类型相同的数组参数不构成重载;
d.可变个数的形参必须声明在形参列表的最后;
f.可变个数的形参最多在一个方法的形参列表中出现一次
10.递归方法:
(1)递归方法调用:方法自己调用自己的现象称为递归;
(2)递归的分类:直接递归、间接递归
直接递归:方法自身调用自己
间接递归:可以理解为方法A调用B方法,B方法调用C方法,C方法调用A方法;
(3)说明:
a.递归方法包含了一种隐式的循环;
b.递归方法会重复执行某段代码,但这种重复执行无须循环控制;
c.递归一定要向已知的方向递归,否则这种递归就变成无穷递归,最终发生栈内存溢出;
d.递归调用会占用大量的系统堆栈,内存耗用多,在层数较多时速度要比循环慢得多;
f.在要求高性能的情况下尽量避免使用递归,考虑使用循环迭代;
11.关键字package、import:
(1).package(包):
package称为包,用于指明该文件中定义的类、接口等结构所在的包;
语法格式:
package 顶层包名.子包名;
说明:
a.一个源文件只能有一个声明包的package语句
b.package语句作为Java源文件的第一条语句出现。若缺省该语句则指定为无名包;
c.包名属于标识符,满足标识符命名的规则和规范(全部小写)、见名知意;
d.包对应于文件系统的目录,package语句中用“.”来指明包(目录)的层次,每.一次就表示一层文件目录;
e.同一个包下可以声明多个结构(类、接口),但是不能定义同名的结构(类、接口)。不同的包下可以定义同名的结构(类、接口);
包的作用:
a.包可以包含类和子包,划分“项目层次“,便于管理;
b.帮助`管理大型软件'系统:将功能相近的类划分到同一个包中。比如:MVC的设计模式;
c.解决'类命名冲突“的问题;
d.控制访问权限
JDK中主要的包:
包名 | 含义 |
java.lang | 包含一些Java语言的核心类,如String、Math、Integer、System和Thread。提供常用功能 |
java.net | 包含执行与网络相关的操作的类和接口 |
java.io | 包含能提供多种输入/输出功能的类 |
java.util | 包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数 |
java.text | 包含了一些java格式化相关的类 |
java.sql | 包含java进行JDBC数据库编程的相关类/接口 |
java.awt | 包含构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用 |
(2)import关键字的使用:
为了使用定义在其他包中的Java类,需要使用import语句显式引入指定包下所需要的类,相当于import语句告诉编译器去哪里寻找这个类;
语法格式:
import 包名.类名;
注意事项:
a.import语句来显式引入指定包下所需要的类;
b.import语句声明在包的声明和类的声明之间;
c.如果需要导入多个类或接口那么就并列显式多个import语句即可;
d.如果使用'a.*'导入结构,表示可以导入a包下的所有的结构;
e.如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句;
f.如果已经导入java.a包下的类,那么如果需要使用a包的子包下的类的话,仍然需要导入;
g.如果在代码中使用不同包下的同名的类,那么就需要使用类的全类名的方式指明调用的是哪个类;
h.'import static'组合的使用:调用指定类或接口下的静态的属性或方法;
三、面向对象的特性——封装性(encapsulation):
1.使用封装性的原因:
随着系统越来越复杂,类会越来越多,面向对象的开发原则要遵循"高内聚、低耦合";内聚是指一个模块内各元素彼此结合的紧密程度,耦合指一个软件结构内不同模块之间互连程度的度量;高内聚是指类的内部数据操作细节自己完成,不允许外部干涉;低耦合是指仅暴露少量的方法给外部使用,尽量方便外部调用;
2.何谓封装性:
把客观事物封装成抽象概念的类,并且类可以把自己的数据和方法只向可信的类或对象开放,向没有必要开放的类或者对象隐藏信息;
3.Java如何实现数据封装:权限修饰符
实现封装就是控制类或成员的可见性范围,需要使用访问控制修饰符,也称为权限修饰符来控制。Java中定义了4种权限修饰符,分别是:public、protected、缺省、private;
权限修饰符 | 本类内部 | 本包内 | 其他包的子类 | 其他包的非子类 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
缺省 | √ | √ | × | × |
private | √ | × | × | × |
具体的修饰结构:
类:public、缺省;
成员变量、成员方法、构造器、成员内部类:public、protected、缺省、private
使用频率比较高:public、private
使用频率比较低:缺省、protected
使用场景1:将类的属性设置为私有(private),提供公共(public)的get和set方法,对此属性进行获取或修改;
使用场景2:将类中不需要对外暴露的方法设置为private;
使用场景3:单例模式中奖构造器设置为private,避免在类的外部创建实例
三、类中的构造器:
1.构造器的理解(constructor)
2.构造器的作用:
(1)搭配new关键字创建类的对象
(2)在创建对象的同时可以给对象的相关属性赋值
3.构造器使用说明:
(1)构造器声明格式:
权限修饰符 类名(形参列表){
构造器体;
}
(2)创建类以后在没有显式提供构造器的情况下,系统会默认提供一个空参的构造器,且构造器的权限与类声明的权限相同;一旦类中显式声明了构造器,则系统不再提供默认的空参构造器;
(3)一个类中可以声明多个构造器,这些构造器之间彼此构成重载的关系;
四、类中属性的赋值过程:
1.在类的属性中给属性赋值的位置:
a.在构造器中赋值;
b.通过"对象.属性"的方式赋值;
c.通过"对象.方法"的方式赋值;
d.默认赋值;
e.显式赋值
2.执行的顺序:
默认赋值——显式初始化——构造器中初始化——通过"对象.属性"的方式赋值/通过"对象.方法"的方式赋值;
3.可执行的次数:
只能执行一次:d,e,a;
能执行多次:b,c
五、JavaBean的理解:
JavaBean是一种Java语言写成的可重用组件,满足JavaBean需要满足如下的标准:
1.类是公共(public)的;
2.有一个无参的公共的构造器;
3.属性都为私有(private)的,且有对应的get和set方法;
用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。
六、UML类图:
UML用来描述软件模型和架构的图形化语言,使用UML类图可以更加直观的描述类内部结构以及类之间的关系,其中:
1.+表示public类型、-表示private类型,#表示protected类型;
2.方法的写法: 方法的类型(+、-) 方法名(参数名:参数类型): 返回值类型
3.斜体表示抽象方法或类