面向对象编程具有三大特征:
封装
继承
多态
一、封装
1、好处
狭义的封装:也就是属性的封装,避免了任意赋值的危险,提高了数据的安全性!
①隐藏一个类中不需要对外提供的实现细节
②使用者只能通过实现定制好的方法来访问数据,可以方便的加入控制逻辑,限制对属性的不合理操作
③便于修改,增强代码的可维护性
2、具体实现步骤 ★
①属性私有化(private)
②提供公共的(public)方法:set方法和get方法
示例:
class Person{
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
3、注意
一般来讲,建议所有属性进行封装。当然如果希望将属性设置成只读的,则可以仅仅提供get方法,如果是只写的,则可以仅仅提供set方法
二、继承
1、概念
一个类没有定义成员,则具备了另一个类的成员,这种现象称为继承
被继承的类称为父类或超类或基类
继承其他类的类称为子类或派生类
2、好处
①提高代码的重用性
②提高代码的维护性和扩展性
3、语法
class 类名 extends 父类类名{}
4、特点★
①子类继承了父类的所有属性和方法,包含私有的,只是访问时先遵循成员的访问权限,当然也可以通过公共的方法去访问
②子类没有继承父类的构造器
③java支持的是单继承,也就是extends后面只能有一个类名
④不能滥用继承。子类和父类必须满足 is-a的关系
⑤java中所有类都直接或间接继承了Object类
⑥类的成员的继承不限于直接父类
5、子类调用父类构造器 ★
①子类不能继承父类的构造器
②子类必须调用父类的构造器,目的是为了初始化父类的信息
③如果子类没有显式调用父类的构造器,则系统将默认调用父类的无参构造器
④如果父类没有无参构造器,则子类必须显式调用父类的有参构造器,否则报错!
语法:super(参数列表)
⑤构造器的调用,不限于直接父类,将一直往上追溯直到Object类
三、多态
1、理解
概念:一种事物有多种表现形态,前面的封装和继承都是为多态打基础的
好处:
①提高代码的重用性和扩展性
②不需要关心每个元素的实际类型,只需要知道它的通用类型,调用比较方便,扩展性更高
2、体现 ★
①方法的重载和重写 √
②对象的多态性(对象的向上转型) ★
注意:对于一个对象来讲,编译类型和运行类型出现了不一致,这种现象称为:多态
编译类型=左边的类型,由编译器检测的类型
运行类型=右边的类型,由解释器检测的类型
相关概念:
本态调用:Person p = new Person();
多态调用:Person p = new Student();
正常方法调用:Student s = new Student(); s.say();
虚拟方法调用:Person p = new Student();p.say();
3、对象转型 ★
(1)向上转型
语法:父类类型 引用名 = new 子类类型();
理解:父类的引用指向了子类对象
特点:
①编译看左边,运行看右边
能调用哪些成员,要看编译类型中定义了哪些成员
运行效果,要看运行类型中的方法执行
②属性没有重写或多态之说
(2)向下转型
语法:子类类型 引用名 = (子类类型)父类 的引用;
特点:
①不能强转父类的对象,只能强转父类的引用
②强转的父类的引用,必须指向的是该目标子类的对象
③可以调用从父类继承来的以及子类本身定义的所有成员
4、多态的应用
(1)多态数组
理解:数组的定义类型为父类类型,元素可以为子类类型
(2)多态参数
理解:方法的形参类型为父类类型,实参可以为子类类型
instanceof:用于判断某对象的运行类型是否是右边的类型XX或XX的子类型
写法:a instanceOf XX
结果:true|false
应用场景:一般放在if条件中用作判断