Java面向对象(OOP)
学习面向对象的三条主线
1、Java中类及类的成员
2、面向对象的三大特征
3、其他关键字的使用
Java中类及类的成员
1、成员变量(或属性)
2、方法(函数)
3、构造器(或构造方法)
4、代码块(或初始化块)
5、内部类
面向对象的三大特征
封装性、继承性、多态性(+抽象性)
其他关键字的使用
this、super、abstract、interface、package、import ......
(三条主线同时推进)
面向对象
将功能封装进对象,强调具备了功能的对象,以类或对象为最小单位,考虑谁来做
面向对象中最基本的两个要素
- 类、对象
- 类:是对一类事物的描述,是抽象的、概念上的定义
- 对象:由类派生出来的,是实际存在的该类事物的每个个体,因而也被称为实例
- 万事万物皆为对象
类
- 属性:对应类中的成员变量- field-(域-字段)
- 行为:对应类中的成员方法-函数- method
- 类的创建及提供类的成员:属性和方法
- 创建类的对象-实例化类-类的实例化
- 调用类的相关结构:“对象.属性”或“对象.方法”
类中方法的声明和使用
1、方法的声明格式:
权限修饰符 返回值类型 方法名(形参列表){
//方法体
}
2、细节说明:
2.1、权限修饰符:指明所修饰的结构可被调用的范围大小
技巧:暂时声明方法时用public
2.2、返回值类型:有具体的数据类型 或 void(无返回值)
1. 根据需要选择返回值类型
2. 如果指明了具体的数据类型,则必须在方法执行的最后,返回要求的数据类型的变量或常量
3. 方法体中执行到return结束方法
4. void中也可以用return
2.3、方法名,属于标识名
2.4、形参列表:可以根据需要,声明方法时,提供形参列表。 如果需要声明多个形参,使用逗号隔开
封装性
封装性思想的体现
- 私有化类的属性,提供get() 和set()去访问和设置
- 类中提供私有的方法,表明此方法只能在类内部中被调用
- 如果类只希望在本包内被调用,则可声明为缺省状态
- 单例模式
Java规定的四种权限修饰符——广义上封装性的体现
- 权限从小到大为:private < 缺省 < protected < public
- 具体修饰范围:
说明:任何地方:本project内有效 - 权限修饰符可以用来修饰的结构说明:
- 四种权限可以修饰类内部的成员:属性、方法、构造器、内部类
- 类本身可以使用两种权限修饰:缺省、public
说明:
修饰相应的结构,体现这个结构被调用时,可见性的大小
构造器(构造方法):Constructor
构造器的作用
- 创建类的对象
- 初始化对象的属性
使用说明
- 如果我们没显式的提供类的构造器的话,则系统会默认给类提供一个默认的构造器:无参数的
- 我们如果显式的声明类的构造器的话,格式为:权限修饰符 类名(形参列表){}
- 同一个类的构造器之间构成重载。
- 我们如果显式的提供了类的构造器,则系统不再提供默认的空参的构造器
- Java的类中一定存在构造器
构造器
-
构造器的理解
contructor :n. 建设者、建造者
contract:v. 建设、建造
contraction:n. 建设、建造 -
构造器的作用
- 搭配new关键字,创建类的对象
- 在创建对象的同时,可以给对象的相关属性赋值
- 构造器的使用说明
构造器的声明格式:权限修饰符 类名(形参列表){}
创建类以后,没有显示提供任何构造器的情况下,系统会默认提供一个空参的构造器,且构造器的权限与类的权限相同
一旦类中显示声明了构造器,系统不再提供空参构造器。
阶段小结
-
在类的属性中,有哪些位置可以给属性赋值
1⃣️默认赋值2⃣️显式赋值
3⃣️构造器中赋值
4⃣️通过“对象.方法”的方式赋值
5⃣️通过“对象.属性”的方法赋值
-
这些位置执行的先后顺序是怎样的?
1⃣️->2⃣️->3⃣️->4⃣️/5⃣️
- 以上操作在对象创建过程中可以执行的次数如何?
1⃣️、2⃣️、3⃣️只能执行一次
4⃣️、5⃣️可以多次执行
JavaBean
概念
- 类是公共的
- 有一个无参的公共构造器
- 有属性,且有对应的get、set方法
对象数组
概念
数组元素可以是基本数据类型,也可以是引用数据类型。当数组元素是引用数据类型中的类时,称之为对象数组。
面向对象特征之二:继承
理解:
生活上:财产的继承
代码层面:
- 自上而下:定义了一个类A,在定义另一个类B时,发现B的功能包含A功能,则考虑B继承A
- 自下而上:定义了类B、C、D等,发现BCD有相同的属性方法,则可以考虑抽取出来封装到类A中,让类BCD继承类A
继承的好处
- 继承的出现,减少的代码的冗余,提高了代码的复用性
- 继承的出现,更有利于代码的扩展
- 继承的出现,让类与类之间产生了 is-a 的关系,多态的使用提供了前提
- 继承描述事物间的所属关系,这种关系是 is-a 的关系。可见父类更用通用、更一般,子类更具体
继承中的基本概念
父类:superClass、超类、基类
子类:subClass、派生类
有了继承之后
子类就获取到了父类中声明的所有属性和方法
但是,由于封装性的影响,子类可能不能直接调用父类中的属性或方法
子类在继承父类之后还可以扩展自己特有的功能(增加特有的属性、方法)
extends:延展、扩展、延伸
子类和父类的理解要区别于集合与子集
不要为了继承而继承,在继承前要判断一下是否有“is a”的关系
默认的父类
Java中声明的类如果没有特殊声明其父类,则默认继承于java.lang.Object
补充
Java是支持多层继承的
直接父类、间接父类
Java中的子父类概念是相对的
Java中的一个父类可以有多的子类,但是一个子类只能有一个父类(Java的单继承性)
方法的重写(overwrite/override)
为什么需要方法的重写
子类在继承父类以后,就获取了父类中声明的所有方法。但是父类中的方法可能不太适用于子类。换句话说,子类需要对父类中继承过来的方法进行覆盖、覆写的操作。
何为方法的重写
子类对父类继承过来的方法的覆盖、覆写的操作就称为方法的重写
方法的重写应遵循的规则
【复习】方法声明的格式:
权限修饰符 返回值类型 方法名(含参列表)[throws 异常类型] {//方法体}
具体规则:
- 父类中被重写的方法与子类中重写的方法的方法名和形参列表必须相同
- 子类中重写的方法的权限修饰符不小于父类中被重写的方法的权限修饰符
- 子类不能重写父类中声明为private的方法
- 返回值类型
父类被重写方法的返回值类型是void,则子类中重写方法的返回值也必须是void
父类被重写方法的返回值类型是基本数据类型,则子类中重写方法的返回值类型必须与被重写的返回值类型相同
父类被重写的返回值类型为引用数据类型(比如类),则子类中重写方法的返回值类型可以与被重写的返回值类型相同 或 是被重写的返回值类型的子类
- 子类重写的方法抛出的异常类型可以于父类被抛出的异常类型相同或是父类被抛出的异常类型的子类