欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java面向对象封装、继承、多态的总结

程序员文章站 2022-07-15 16:50:20
...

一:封装
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;

多态的实际意义
多态的实际意义在于:可以屏蔽不同子类的差异性编写通用的代码,从而产生不同的效果