面向对象的三大特性
1. 封装
-
封装可以隐藏对象的属性和其方法的实现细节,仅对外公开接口,控制其访问级别。
-
封装的目的:增强安全性和简化编程。
-
封装性在代码中的体现就是公有方法调用私有属性成员。
//类 public class Student { //属性 private int stuId; //学号 //获得学号 public int getStuId() { return stuId; } //给学号赋值 public void setStuId(int stuId) { this.stuId = stuId; } //动作(方法) public static void study(){ //学习 System.out.println("I am studying !"); } }
-
由于
stuId
为Student
类的私有属性,其他类不能使用对象.属性名
的方法调用stuId
,但可以使用对象名.getStuId()
获得stuId
。 -
对于
setStuId
方法,可以在其中添加属性安全性检查,增强程序的安全性,比如下面的代码:public void setStuId(int stuId) { if(stuId < 0){ return error; } this.stuId = stuId; }
-
-
封装的优点
- 提高系统安全性,保护数据。
- 隐藏代码实现细节。
- 统一接口。
- 增加系统的可维护性。
2. 继承
-
继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
-
继承的本质就是 “扩展”,使用
extends
关键字来实现。 -
继承是两个类之间的一种关系,一个为父类(基类),一个为子类(派生类)。
-
区别于实例化对象
- 学生分为小学生和中学生,其中学生是父类,小学生和初中生是子类。
- 张三是小学生,李四是中学生,张三和李四分别为小学生和中学生的对象。
-
继承的特点:
-
子类可以继承父类的所有非私有的属性和方法。
-
Java 中的所有类都直接或者间接继承
Object
类,通俗点讲就是,Object
类是 Java 中所有类的祖宗。 -
Java 中只有单继承,没有多继承(一个子类只能有一个直接父类,一个父类可以有多个子类)。
-
创建子类对象会执行父类和子类的构造器,且父类构造器必须先于子类构造器执行。
-
子类继承父类的属性或者方法,访问权限只能不变或者扩大,不能缩小。如:父类的
protected
属性,子类继承后只能是protected
或public
,不能是default
或private
。public > protected > default > private
-
-
super
关键字-
super
指代当前类的父类的对象的引用,可使用super.方法名()
调用父类的方法(非私有),使用super.属性名
调用父类的属性(非私有)。
-
-
super 调用父类的构造方法,必须在构造方法的第一个。
-
super
和this
对比参数 this super 作用域 子类、父类的方法都可以 只能出现在子类的方法中 指代对象 当前类的对象 当前类的父类的对象 前提 有无继承皆可使用 只能在继承条件下使用 构造方法 this() 当前类的构造 super() 当前类的父类的构造 兼容性 this 和 super 不能同时调用构造方法 this 和 super 不能同时调用构造方法 -
方法重写
-
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写![1]
-
重写与重载的区别
参数 重写 重载 作用域 只能在子类重写父类(前提是继承关系) 同一类或者子类 参数列表 相同 不同 访问权限 不能比父类低 可以随意更改 构造方法 不能被重写 可以重载 限制 不能重写 private、final、static 修饰的方法 无限制 抛出异常 可以被缩小,不能被扩大 可以声明新的或更广的检查异常
-
3. 多态
-
多态为不同数据类型的实体提供统一的接口,使同一个事件发生在不同的对象上会产生不同的结果。
-
多态指方法的多态,属性没有多态。
-
多态存在的三个必要条件:
- 继承
- 重写
- 父类引用指向子类对象:Parent p = new Child();
-
多态方法调用:
- 首先检查父类中是否有该方法,如果没有,则编译错误。
- 如果有,而且子类并未重写该方法,调用父类方法。
- 如果有,而且子类重写了该方法,再去调用子类的同名方法。
-
多态的优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
4. 参考资料
[1] 佚名. Java 重写(Override)与重载(Overload)[EO/BL]. https://www.runoob.com/java/java-override-overload.html, ???-??-??/2021-03-21.
[2] 佚名. Java 多态[EB/OL]. https://www.runoob.com/java/java-polymorphism.html, ???-??-??/2021-03-21.