对面向对象与面向过程的认识
- 面向对象
- 面向对象是一种编程范式,是一种程序设计思想。
- 除了面向对象以外,还有面向过程、指令式编程和函数式编程等。
- 现在主流的编程思想是面向对象和面向过程。
- 早期程序比较简单,先有面向过程,后来程序越来越复杂,弊端比较多,所以诞生了面向对象这一编程思想。
- 面向对象(OOP)
- 面向对象是以类为单位进行组织的,将同一类事物的属性和行为封装到一个类中,解决某一类问题时,提供更多细节。
- 类与类之间还可以存在继承关系,程序的扩展性更好,维护性更强。
- 面向对象是一种宏观的设计思想,分析完成这件事情,需要哪些类。
- 面向过程是一种做具体的设计思想,是具体落地实- 面向过程
- 面向过程(POP)
- 核心是将实现功能的过程尤其是实现的步骤,封装成函数,在每一步执行时,调用对应的函数即可。
- 典型语言:C语言。
- 以函数为单位进行代码组织的,相对于面向对象的语言扩展能力差。
类与对象
- 类
什么是类(类是具有相同特征事物的抽象定义)。
eg. 人类:定义姓名、性别(属性/变量),吃饭、学习、工作(动作、功能→方法)。
类就是一个模板,用来记录某种事物的属性和行为。
- 对象
什么是对象(通过类这个模板,创建出个体的实例,使用类的人类是概念态,张三、李四是具体的人也就是实例。
实例就是具体存在的东西,“万事万物,皆为对象”万事万物就是实在的实例。现实生活中,是先有对象,后有类。
类中的成员
-
- 成员变量
-
- 成员方法
-
- 构造方法
包
- 含义:
提供了类的多层命名空间,用于解决类的命名冲突、管理的问题。
- 作用:
- - 控制访问权限
- - 按照不同功能管理类
- - 避免类重名
- 命名规则:
- eg. Scanner
- import java.util.Scanner; -- 全类名=包名+类名(类的简称)
- 第一级:该项目的类型,如com、org、gov等
- 第二级:项目的开发或运行的公司名称
- 第三级:项目的名称,如:bms、oa、erp、cms
- 第四级:项目模块的名称
代码块
在类中声明,类似于没有名称的方法体,代码分实例块和静态块。
若类加载了,静态块也就执行了。
每一次创建对象,自动执行实例块。
抽象类
- 含义:用abstract修饰的类不能创建对象。如果一个类中没有包含足够的信息,那么这个类是个抽象的类。抽象方法(父类中有些方法的实现子类与父类都不相同,就需要对父类中的某个方法进行重写覆盖,那么父类的实现就显得多余,可以把这类方法定义为抽象方法,只有声明没有方法体)。
- 作用:
- 实现多态性,使得不同子类对象对同一方法调用做出不同响应,提高了程序的扩展性和可维护性。
- 让子类能够按照自身逻辑对继承的方法进行定制化实现,增强了代码的灵活性。
接口
- 含义:
使用interface修饰的类,接口一般也是一种抽象,所以,接口是不能创建对象,可以定义常量、抽象方法、静态方法、默认方法。
- 特点:
- 一个类要实现接口,要么重写接口中的抽象方法,要么再将该类定义为抽象类。
- 一个类可以实现多个接口。
- 一个接口可以继承多个接口。
关键字(面向对象相关)
- this关键字:
(代表当前对象)。使用this关键字,调用当前程序,调用的是当前对象中的成员变量,这样可以在方法中访问成员变量。
- eg. public Person(String name, int age) {
- this.name = name;
- this.age = age;
- }
- eg. 使用this,在一个构造方法中调用另一个构造方法。
- public Person() {
- this("王五", 50);
- }
- static关键字
- 含义:
静态,可以修饰类的成员变量、成员方法、代码块、内部类。
- 特点:
- 随着类的加载而加载。
- 优先于对象存在。
- 修饰的成员被所有对象所共享。
- 可不创建对象,直接使用类名访问。
- 注:static修饰的成员在内存中只有一个,静态变量属于类,和类一样在内存只有一份。
super关键字
(是超级的,表示用来访问父类的信息。)在子类方法中,使用super关键字调用父类的方法或成员。
- 可以访问父类中定义的公开成员变量、定义的成员方法。
- 可以在子类的构造器中调用的是父类的构造器。
final关键字
- 含义:
表示最终,用于修饰类、方法、属性和参数。
- 修饰:
- 类:不能被继承(只为抽象类或接口,不可被修饰)。可以修饰类,修饰的类不能被其他类继承(如Java中的String类,就是被final修饰)。抽象类、接口是不能用final修饰。
- 方法:可以修饰方法,修饰的方法子类不能重写。
- 属性:定义成变量,修饰后变量就变为常量,值一旦确定就不能改变。
权限修饰符
- 修饰符的对比:
- 修饰符:同类、同包、子类、不同包
- public:√、√、√、√
- protected:√、√、√、×
- default:√、√、×、×
- private:√、×、×、×
- 修饰符的认识:
- public:可修饰类、成员变量、成员方法、内部类。
- protected:受保护权限,可以修饰成员变量、成员方法、内部类。
- default(什么都不写):默认权限,可以在本类、同包的类、子类中访问到。
- private:私有权限,可以修饰成员变量、成员方法、内部类。
方法重载与方法重写
方法重载
- 含义:
在一个类中,有多个同名方法称为方法的重载。
- 区分:
可以通过参数进行区分:
- - 参数的个数
- - 参数的顺序
- - 数据类型
方法重写
- 使用原因:
当父类的方法自身实现不能满足子类的需求就要进行方法的重写,自己实现自己的功能。
- 重写规则:
- 子类重写父类方法时,重写的方法名称、参数列表、返回类型(协变返回类型情况除外)必须与父类被重写的方法完全相同。
- 子类重写方法的访问权限不能比父类中被重写方法的访问权限更严格。
- 子类重写方法抛出的异常不能比父类被重写方法抛出的异常范围更大。
面向对象的特征
封装
- 含义:
在编程中有两种含义:
包装,例如将一段重复使用的代码包装到一个方法中称为包装。
面向语言中的封装:使用不同的访问权限修饰符控制类中的成员是否可以对外可见。面向对象封装:将类中的某些信息隐藏在类的内部,不让外界知道,或不让外界直接访问,提供专门的公共方法去访问。
- 作用:
- 隐藏类的信息。
- 方便加入控制语句。
- 通过特定的方法访问。
- 方便修改实现。
- 实例:
java
public class Demo1 {
private String name; //将类的成员变量访问权限设置为私有
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
继承
- 作用
- ①减少了代码冗余,提高代码的复用性
- ②更有利于功能的扩展
- ③让类与类之间产生is - a关系,为多态的使用提供了前提
- 规则
- 在Java中:
- 一个类,只能使用extends关键字直接继承一个类
- 一个类,可以间接的继承多个类
- 一个类,可以被多个类继承
- 实例
- eg. Cat extends Animal
多态
- 含义:
父类引用指向子类对象,从而产生多态形式。
- Animal dog = new Dog();
- Animal cat = new Cat();
(二者存在直接或间接的继承关系时,父类引用指向子类的对象,即形成多态)
- 向上转型:
eg. Animal x = new Cat(子类转父类)
- (用父类引用表示子类对象)
- 编译时,调用的是父类中定义的方法;cat.eat()
- 运行时,运行的是右边对象类中的方法。
- eg. public void feed(Animal animal){
- animal.eat();
- }
- 好处:提高代码的扩展性。
- 向下转型:
- (超实现多态,将子类型都转为父类类型,在编译期间用父类类型调用不到子类中定义的方法)
- 为了调用子类中自己的方法,需要把父类类型转为子类类型
- eg. Dog dog = (Dog)animal