学习笔记 - Java 面向对象_上
学习面向对象内容的三条主线
- Java 类及类的成员:属性、方法、构造器;代码块、内部类
- 面向对象的特征:封装、继承、多态、(抽象)
- 其他关键字的使用:this、super、package、import、static、final、interface 等
类的相关概念
类和对象概述
类(Class)和对象(Object)是面向对象的核心概念。
- 类:具有相同特征的事物的抽象描述,是抽象的,概念上的定义;
- 对象:实际存在的该类事物的每个个体,是具体的,因而也称为实例(instance)。
类的成员概述
Java 中用类(Class)来描述事物。类是一组相关属性和行为的集合,是类最基本的两个成员。
- 属性:该类事物的状态信息,对应类中的成员变量
- 成员变量 <=> 属性 <=> Field
- 行为:该类事物要做什么操作,或者基于事物的状态能做什么。对应类中的成员方法
- (成员)方法 <=> 函数 <=> Method
类的实例化
概述
等价描述:类的实例化 <=> 创建类的对象 <=> 创建类的实例
格式:类类型 对象名 = new 对象实体
例如:
Phone p1 = new Phone();
Scanner scan = new Scanner(System.in);
面向对象完成具体功能的三步操作
- 创建类,设计类的内部成员(属性、方法);
- 创建类的对象;
- 通过对象调用内部声明的属性和方法,完成相关的功能
对象的内存解析


对象数组
定义
当数组的元素为引用数据类型的时候,我们称其为对象数组。
内存解析

类的属性
成员变量和局部变量相同点
- 变量声明的格式相同:数据类型 变量名 = 变量值
- 变量都有其有效的作用域,在作用域外就会失效
- 变量必须先声明,后赋值,再使用。
成员变量和局部变量不同点
- 类中声明的位置不同
- 属性:声明在类内,方法外的变量
- 局部变量:声明方法、构造器内部的变量
- 在内存中分配的位置不同
- 属性:随着对象的创建,存储在堆空间中
- 局部变量:存储在栈空间中
- 生命周期
- 属性:随着对象的创建而创建,随着对象的消亡而消亡
- 局部变量:随着方法对应的栈帧入栈,局部变量会在栈中分配;随着方法对应的栈帧出栈,局部变量消亡
- 作用域
- 属性:在整个类的内部都是有效的
- 局部变量:仅限于声明此局部变量所在的方法(或构造器、代码块内)
- 是否可以用权限修饰符进行修饰:
- 属性:可以
- 局部变量:不可以
- 是否有默认值
- 属性:都有默认初始化值,如果没有给属性进行显式地初始化赋值,则会有默认初始化值
- 局部变量:都没有默认初始化值,在使用局部变量之前,必须要显式地赋值,否则报错
类的方法
概述
方法是类或对象行为特征的抽象,用来完成某个功能操作。
将功能封装为方法可以实现代码重用,减少冗余,简化代码。
Java 里的方法只能被定义到类里。
方法声明的格式:
权限修饰符 [其它修饰符] 返回值类型 方法名(形参列表) [throws 异常类型] { //方法头
//方法体
}
注意
- Java 里的方法不能独立存在,所有的方法必须定义在类里;
- Java 里的方法不调用就不执行。每调用一次就执行一次;
- 方法内可以调用本类种的方法和属性;
- 方法内不能再定义方法
方法调用的内存解析
- 形参:方法在声明时,一对 ( ) 内声明的一个或多个形式参数,简称为形参;
- 实参:方法在被调用时,实际传递给形参的变量或常量,称为实际参数,简称实参。

每当一个方法被调用,就入栈,方法执行结束就出栈。
方法中的基本数据类型,都在栈中存储,引用数据类型在堆中存储,栈中只存储地址。
方法的重载(overload)
在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可。满足这样特征的多个方法,彼此之间构成方法的重载。
总结为两同一不同:
- 两同:同一个类、相同的方法名;
- 一不同:参数列表不同。
- 参数个数不同;
- 参数类型不同。
注意:方法的重载与形参的名、权限修饰符、返回值类型都无关。
同一个类中不允许定义两个相同的方法,即方法名相同且形参列表相同(形参列表相同指的是参数个数和类型都相同,与参数名无关)。
可变个数形参的方法
在调用方法时,可能会出现形参类型确定但个数不确定的情况,此时就可以使用可变个数形参的方法。
格式:(参数类型 ... 参数名)
说明:
- 可变个数形参的方法在调用时,所赋给实参的个数可以为 0 至多个;
- 可变个数形参和重载同时出现时,重载优先级更高;
- 可变个数形参等同于一个数组类型的形参,二者不构成重载(不能同时出现),例如:
test(int ... nums)
<=>test(int[] nums)
。在方法中调用时也是作为数组调用; - 可变个数形参必须在形参列表的末尾,且只能有一个(意味着不会有两个不同类型的可变个数形参),例如:
test(int num1, int ... nums)
;
方法的值传递机制
对于局部变量来说,如果出现赋值操作:
- 如果是基本数据类型,则将此变量保存的数据值传递出去;
- 如果是引用数据类型,则将此变量保存的地址值传递出去。
方法的参数传递与之相同:
- 如果形参是基本数据类型,则将实参保存的数据值赋给形参;
- 如果形参是引用数据类型,则将实参保存的地址值赋给形参。
递归方法
方法自己调用自己的现象就称为递归。
说明:
- 递归方法包含了一种隐式的循环;
- 递归方法会重复执行某段代码,但无需循环控制;
- 递归一定要向已知方向递归,否则就会变成无穷递归,类似死循环,最终发生栈内存溢出。
封装性
封装是把客观事物封装成抽象概念的类,并且类可以把自己的数据和方法开放给可信的类或对象,对其他类或对象隐藏信息。
Java 中通过权限修饰符对类和方法进行封装,具体的访问范围如下:
修饰符 | 本类 | 同包 | 子类 | 全局 |
---|---|---|---|---|
private | ✓ | ✕ | ✕ | ✕ |
default(缺省) | ✓ | ✓ | ✕ | ✕ |
protected | ✓ | ✓ | ✓ | ✕ |
public | ✓ | ✓ | ✓ | ✓ |
构造器
概述
构造器(constructor,也可以叫做构造方法)一般搭配 new 关键字使用,用来创建类的对象,可以给对象的相关属性赋值。
格式:权限修饰符 类名(形参列表){}
注意
-
创建类以后,在没有显示提供任何构造器的情况下,系统会默认提供一个空参的构造器,且构造器的权限与类的权限一致;
-
一旦类中声明了构造器,则系统不再提供默认的空参构造器;
-
一个类中可以声明多个构造器,彼此之间构成重载。
补充知识
类中属性赋值过程
- 默认初始化;
- 显式初始化;
- 构造器初始化;
- 通过
对象.方法
赋值; - 通过
对象.属性
赋值。
其中 1-3 是对象实例化过程,只能执行一次, 4-5 可以执行多次。
JavaBean
JavaBean 是一种 Java 语言编写的可重用组件,它满足以下要求:
- 类是公共的;
- 有一个无参的公共的构造器;
- 有属性,且有对应的 get、set 方法。
UML 类图
在软件开发中,使用 UML 类图可以更加直观地描述类内部结构(类的属性和方法)以及类之间的关系(如关联、依赖、聚合等)。
在 UML 类图中,表示方法如下:
- + 表示 public 类型, - 表示 private 类型,# 表示 protected 类型;
- 方法:方法的类型
(+ 或 -) 方法名(参数名: 参数类型): 返回值类型
; - 斜体表示抽象方法或类。
