面向对象
一、面向过程和面向对象的思想
面向过程的思想:
将事情拆分成多个步骤,然后一步一步地完成即可。强调事情的具体步骤/过程。
该思想常见于编码过程中的方法或者函数当中。
比如:打扫教室
(1)先拿到清洁工具
(2)然后扫地
(3)然后拖地
(4)倒垃圾
(5)归还清洁工具
PS:考虑怎么做
面向对象的思想:
将事情交给某个对象去完成。
该思想常见于类、对象当中。
比如:打扫教室
(1)找清洁阿姨
PS:考虑谁去做
注意:面向过程和面向对象是相辅相成的!!!
二、类和对象
面向对象中的一句话:一切皆可对象!
类:是一个生产对象的模板。
对象:具体的事物、具体的实体、具体的实例,根据模板生产的产品
PS:一般在写代码的时候,需要先写类然后在创建对象。
面向对象的三个阶段(设计代码):
(1)OOA:面向对象分析
分析业务中存在哪些事物/实体/实例/对象,然后在根据这些事物/实体/实例/对象的公共特征抽取出一个类
公共特征包含:属性、方法(行为)
比如:
在学生管理系统中,存在许多的学生对象,每个学生具有:学号、姓名、性别、年龄等属性,也具有:吃饭、睡觉、玩手机等行为
(2)OOD:面向对象设计
如何设计类。
(3)OOP:面向对象编程
根据以上两步编写代码创建类和对象。
创建类
创建类的基本语法:
public class 类名 {...}
类当中还有属性,书写属性的语法:
【修饰符】 属性类型 属性名 【= 值】;
类当中还有方法,书写方法的语法:
创建方法的语法是一样的,参照8.14的方法部分。
PS:创建一个类就相当于创建了一种新的引用数据类型
创建对象
基本语法:
类名 对象名 = new 类名();
由于对象是根据类创建出来的,所以对象中也含有属性和方法
调用对象的属性:对象名.属性名
调用对象的方法:对象名.方法名()
构造器(构造方法)
用于初始化属性
基本语法:
public 类名(形参列表){
方法体
}
分类:
无参构造器:没有形参列表的构造器,通过它初始化对象属性时,属性值为默认值
默认值:整型->0、浮点型->0.0、字符型->空字符、布尔类型->false
引用类型->null
有参构造器:有形参列表的构造器,通过形参初始化对象属性
PS:构造器虽然有别于普通的方法,但是其可以重载
规则:
(1)当类中没有构造器的时候,Java会自动添加一个无参构造器
(2)当类中有构造器的时候,Java不会添加任何构造器
this关键字
引入:当有参构造器的形参名和属性名一样的时候,会导致形参和属性无法区分,
此时只需要在属性名前面加上this.即可,以此来标记属性名。
含义:this指代当前对象
PS:谁在使用则this指代谁
延伸:若this应用在方法中,看谁在调用这个方法,那么this指的就是谁
内存分析
三、封装
专业性解释:隐藏对象内部的复杂性,只对外提供简单的借口,以便外部调用。
目的:提高系统的可扩展性、可维护性,做到“高内聚、低耦合”。
PS:将类中的属性使用private修饰(此时属性不能直接调用),然后为
每个属性添加Get和Set方法(通过get和set方法就可以间接地操作属性)。
快速生成代码块的快捷键:alt+insert ---> constructor(构造器)、GetterAndSetter
Get系列的方法:用于获取属性值
Set系列的方法:用于设置属性值
总结:以后创建类记得使用封装!!!
public:是一个访问权限修饰符,表示公共的,即:对外公开
private:是一个访问权限修饰符,表示私有的,即:不对外公开
四、继承
概念:
(1)类是对象的抽象
(2)继承是对类的抽象
比如:有一个教务系统,涉及学生和老师
分析:对象是学生、老师
学生具有:学号、姓名、性别、年龄、专业、学习、睡觉、吃饭
教师具有:工号、姓名、性别、年龄、教研室、授课、睡觉、吃饭
但是学生和教师具有部分相同的属性和方法,所以可以提取出来
封装成一个新的类 ---> People:姓名、性别、年龄、睡觉、吃饭
总体来说,一共涉及三个类:学生、教师、People
设计:
Student:学号、专业、学习
Teacher:工号、教研室、授课
People:姓名、性别、年龄、睡觉、吃饭
由于People中的属性和方法是从Student、Teacher中提取出来的,
所以Student、Teacher继承People
编码:....
extends关键字:用于继承,该关键字放在类名后面
语法:public class A extends B{...}
说明:此时,A继承B,A为子类,B为父类
PS:使用具体的实体类继承公共类
内存分析:...
细节:
(1)当创建子类对象的时候,Java会先调用父类的构造器进行初始化
(2)在编译的过程当中,Java会在子类构造器中添加super(...)来调用
父类的构造器,所以就出现了(1)的情况
(3)关于super的使用:super()表示调用父类构造器,
super.方法名()表示调用父类方法
(4)子类会继承父类的属性和方法,但是父类使用了封装之后,虽然子类
对象中含有父类属性,但是依然不能直接调用,得使用get/set方法
(5)构造器不能被继承!!!
五、多态
方法的重写
大前提:发生在继承关系当中
要求:子类的方法名要和父类的保持一致,参数列表也要保持一致
为什么使用重写?当我们对父类的方法不满意的时候,就可以在子
类的方法中进行进行重写。
多态指的是方法的多态性,即方法具有多种状态。发生在重写的方法里。
比如:s2.eat()中的eat()方法显示的是父类People的,但是运行之后
却是子类Student的。此时eat()具有多态性。
六、Object类
Object类是所有Java类的根类,意味着所有的java对象都拥有Object类的属性和方法。
若在类的声明未使用extends指明其父类,则默认继承Object类
PS:所有的java对象都拥有Object类的属性和方法。
方法:
hasCode():获取对象hash码
toString():获取当前对象所属的类及其十六进制哈希码,
格式:类路径@十六进制哈希码
比如:p04_object_oriented.People@4554617c
应用:在项目开发当中,我们会在类中重写toString()方法来
展示当前对象的属性及其属性值。
规定:编写实体类的时候,我们要在类中书写:private修饰的属性、get和set方法、重写toString()
七、向上转型、向下转型
用于继承关系中,=左右两边的类不一样
向上转型:将子类对象赋值给父类变量
向下转型:将父类对象赋值给子类变量,但是要注意强制转换!!!
八、接口(interface)
接口的作用:
(1)对类的一个规范
(2)对类的一个功能扩展
语法:
public interface 接口名{...}
接口中的内容:
(1)被public static final修饰的常量,其中public static final可省略;
(2)抽象方法:被public abstract所修饰的,并且没有方法体的方法,其中public abstract可省略
(3)被public default修饰的非抽象方法
(4)静态方法:static修饰的方法
重点在于(1)和(2)
细节:
(1)Java类只有单继承,但是有多实现;
(2)Java类使用implements关键字实现接口;
(3)Java类实现接口之后需要重写改接口中所有的抽象方法,否则报错;
(4)Java类若有继承,也有实现,则要先继承后实现;
(5)接口和类是并列的;
(6)抽象方法的实现由实现类决定
需求:
已知乒乓球国家队、排球国家队要去参加友谊赛,要求运动员参加比赛即可,乒乓球教练要学习英语,排球教练要学习法语