一:封装
1、基本概念
通常情况下载测试类中可以给成员变量赋值一些合法但不合理(如年龄为负数、汽车行驶公里数等)的数值,而程序的执行过程无法检测和提示,此时与实际生活不符合。
为了避免上述情况的发生,就需要对成员变量的赋值操作进行合理性的判断和提示,该方法就叫做封装,通俗来说,封装就是保证成员变量合理性的机制。
2、封装的流程
①私有化成员变量,使用private关键字修饰;
②提供公有的get成员变量和set成员变量方法,在方法体中进行合理值的判断;
③在构造方法体中调用set成员变量方法进行合理值的判断;
二、继承
1、基本概念
当多个类之间有相同的特征和行为时,就可以将相同的内容提取出来组成一个新的类,让原来的这些类继承自新类即可,从而实现原来的这些类吸收新类的中成员的效果,此时在原来这些类中只需要编写自己独有的成员即可。
如:
人类:
特征:姓名、年龄
行为:吃饭、娱乐
学生类 继承 人类:
特征:学号
行为:学习
教师类 继承 人类:
特征:薪水
行为:讲课
工人类 继承 人类:
特征:工号
行为:工作
… …
人类都有共同的特征和行为方式,但是也有各个不同职业各自不同的特征和行为方式;
换句话说,继承就是一种用于提高代码复用性、可维护性以及可扩展性的机制。
在java语言中使用extends关键字来表达继承的关系。
class 子类名 extends 父类名{
…
}
如:
class Student extends Person{ //表示Student类继承自Person类
…
}
其中Person类叫做 父类/超类/基类;
其中Student类叫做 子类/派生类/孩子类;
2、注意事项
①子类可以继承父类的成员变量,包括私有成员变量,但不能直接访问;
子类不可以直接继承父类中的构造方法以及私有成员方法;
②构造子类对象时会自动调用父类中的无参构造方法,用于初始化从父类中继承下来的成员变量信息,相当于在子类构造方法中的第一行增加代码:super();
③在java语言中只支持单继承,也就是一个子类只能有一个父类,但是一个父类可以有多个子类;
④只能满足:子类 is a 父类 的逻辑才能使用继承,不能滥用继承;
三、多态
1、基本概念
多态就是指同一种事物表现出来的多种形态。
如:
图形:三角形、正方形、圆形、梯形……
饮料:可乐、雪碧、乐虎、脉动……
整数:byte a = 10;short s = 10;int i = 10;
2、语法格式
父类类型 引用 = new 子类类型();
如:
Person p = new Student();
p.show();
解析:
在编译阶段p是Person类型,因此调用Person类自己的show()方法,若没有则编译报错;
在运行阶段p真正指向的对象是Student类型,因此最终调用Student类中自己的show()方法
3、多态的效果
①对于指向子类对象的父类引用来说,在编译阶段只能直接调用父类的方法,不能直接调用子类的方法;
②对于父子类都有的非静态方法来说,最终调用了子类中的重写版本;
③对于父子类都有的静态方法,最终调用父类中的版本,与指向的对象类型无关;
4、引用类型之间的转换
①引用类型之间的转换必须发生在父子类之间,分为自动类型转换 和 强制类型转换;
②其中子类类型向父类类型的转换需要发生自动类型转换即可;
其中父类类型向子类类型的转换需要发生强制制转换才可以;
强制类型转换:
目标类型 变量名 = (目标类型)源类型的变量名;
③当没有父子类关系发生强制类型转换时则会编译报错,当拥有父子类关系发生强转时则编译通过,若目标类型并不是该引用真正指向的类型时,在运行阶段发生类型转换异常;
④为了避免上述错误的发生,通常只有进行强制类型转换就需要进行判断,格式如下:
if(引用变量名 instanceof 数据类型){
System.out.println("可以放心地进行强制类型转换了...");
}else{
System.out.println("不能进行强制类型转换!");
}
//-判断引用指向的对象是否为指定的数据类型,如是则返回true,否则返回false;
多态的实际意义
多态的实际意义在于:可以屏蔽不同子类的差异性编写通用的代码,从而产生不同的效果