Java学习笔记——面向对象(上)2021.11.29更新
三条主线
- Java类及类的成员:属性、方法、构造器;代码块、内部类
- 面向对象的三大特征:封装性、继承性、多态性、(抽象性)
- 其他关键字:this、super、static、final、abstract、interface、package、import
面向过程(POP):强调的是功能行为。以函数为最小单位,考虑怎么做。
面向对象(OOP):将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做,它更强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、多态、聚合等。
思想概述
- 程序员从面向过程的执行者转化成了面向对象的指挥者。
- 面向对象分析方法分析问题的思路和步骤:
- 根据问题需要,选择问题所针对的现实世界中的实体;
- 从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类;
- 把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构;
- 将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。
两个要素:类和对象
类class:是对一类事物的描述,是抽象的、概念上的定义;
对象object:是实际存在的该类事物的每个个体,也成为实例。
面向对象程序设计的重点是类的设计。
设计类,就是设计类的成员。
属性:对应类中的成员变量;属性 = 成员变量 = field = 域、字段
行为:对应类中的成员方法。方法 = 成员方法 = 函数 = method
如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static)
对象的内存解析
属性(成员变量)VS 局部变量
- 相同点:
定义变量的格式;
先声明,后使用;
都有其对应的作用域。 - 不同点:
- 在类中声明的位置不同
属性:直接定义在类的一对{}内
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量。 - 权限修饰符不同
属性:可以在声明属性时,使用权限修饰符指明其权限(常用的权限修饰符:private、public、缺省、protected) - 默认初始化值的情况
属性:根据其类型,都有默认的初始化值;
局部变量:没有初始化值,在调用之前一定要显性赋值。 - 在内存中加载的位置
属性:加载到堆空间(非static)
局部变量:栈空间
类中方法的声明和使用
方法:描述类应该具有的功能。
public viod 方法名()——viod:表示没有返回值的
public 数据类型 方法名()——数据类型表示该方法返回的数据类型
- 方法声明:权限修饰符 返回值类型 方法名(形参列表){方法体}
权限修饰符
private、public、缺省、protected
返回值类型
- 如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return来返回指定类型的变量或常量。
- 如果没有返回值,使用viod来表示,就不用使用return了。或者“return;”
- 形参列表:方法可以声明0、1、…或多个形参。格式:数据类型1 形参1,数据类型2 形参2,…
return关键字的使用
- 使用范围:方法体中;
- 作用:结束方法、针对有返回值的方法,返回所要的数据。
- return后面不能有执行语句。
方法的使用
- 方法的使用中,可以调用当前类的属性和方法。
- 递归:方法A中又调用方法A
- 方法中不能定义方法
方法的重载overload
- 在同一个类中,允许存在一个以上同名方法,只要它们的参数个数或者参数类型不同即可。
- 特点:与返回值类型无关,只看参数列表,且参数列表必须不同(参数个数或者参数类型),调用时,根据方法参数数列表的不同来区别。
- 判断是否重载:跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系。
- 在通过对象调用方法时,如何确定某一个指定的方法:方法名–>参数列表。
可变形参的方法
Varargs机制:允许直接定义能和多个实参相匹配的形参。
- 格式:数据类型 … 变量名,如:public void show(String … strs){};
- 可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载;
- 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载;
- 必须声明在形参列表末尾;
- 可变个数形参在方法形参中,最多只有一个。
方法参数的值传机制
- Java中方法的参数传递方式只有一种:值传递。即将实际参数值的副本传入方法内,而参数本身不受影响。
- 参数是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参;
- 参数是引用数据类型:将实参基本数据类型变量的“地址值”传递给形参;
递归方法recursion
- 一个方法体内调用自身
- 方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无需循环控制。
- 递归一定要向已知反向递归,否则这种递归就变成了无穷递归,类似于死循环。
匿名对象
创建的对象,没有显示的赋给一个变量名
匿名对象只能调用一次。
封装与隐藏
- 封装性的体现:将类的属性私有化(private),同时提供公共的(public)方法来获取(getXxx)和设置(setXxx);不对外暴露的私有的方法;单例模式…
- 权限修饰符:封装性的体现,需要权限修饰符来配合
- java规定的四种权限:private、缺省、protected、public
2. 四种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类;
3. 修饰类的话,只能使用:缺省、public。
构造器(或构造方法、constructor)
- 作用:创建对象或者初始化对象的信息,new + 构造器
- 如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器;
- 定义构造器的格式:权限修饰符 类名(形参列表){}
- 一个类中定义多个构造器,彼此构成重载;
- 一旦显式的定义了类的构造器之后,系统就不再提供默认的空参构造器;
- 一个类中,至少会有一个构造器。
属性赋值的先后顺序
属性赋值的几种方法:
- 默认初始化;
- 显式初始化;
- 构造器中赋值;
- 通过“对象.方法”或“对象.属性”的方式赋值。
顺序:1234
JavaBean
是一种java语言写成的可重用组件。
是指符号以下标准的java类:
- 类是公共的;
- 有一个无参的构造器;
- 有属性,且有对应的get、set方法。
UML类图
this关键字
表示当前对象,或 当前正在创建的对象。
- 可以用来修饰:属性(理解为当前对象的属性)、方法、构造器。
- 通常情况下,都省略this.,特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用“this.变量”的方式,表明此变量是属性,而非形参。
- 调用构造器:this(形参列表),调用本类中指定的其他构造器,不能调用自己,不能成环。规定:必须放在当前构造器的首行。
package、import关键字
- package
为了更好的实现项目中类的管理,提供包的概念。
使用package声明类或接口所属的包,声明在源文件的首行。
每“.”一次,代表一层文件目录。
同一个包下,不能命名同名的接口、类。 - import:
导入指定包下的类、接口。
声明在包的声明和类的声明之间。
如果使用的类或接口时java.lang包下定义的,可以省略import。
如果使用的类或接口是本包下定义的,则可以省略。
如果在源文件中,使用了不同包下的同名的类,则除了第一个,其他必须使用全类名的方式显示。
使用“xxx.*”方式表明可以调用xxx包下的所有结构。但是如果使用的是xxx子包下的结构,则仍需要import显式全类名。
import static:导入指定类或接口中的静态结构。
MVC设计模式
将整个程序分为三个层次:视图模型层、控制器层、数据模型层
- 模型层model
- 数据对象封装;model.bean/domain
- 数据库操作类;model.dao
- 数据库。 model.db
- 视图层view
- 相关工具类;vew.utils
- 自定义view。view.ui
- 控制层controller
- 应用界面相关;controller.activity
- 存放fragment;controller.fragment
- 显示列表的适配器;controller.adapter
- 服务相关的;controller.service
- 抽取的基类。controller.base