5.面向对象三大特征
2022-04-25 本文已影响0人
星野君
面向对象编程有三大特征:封装、继承和多态。
一、封装
- 封装的优点
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员变量进行更精确的控制。
- 隐藏信息,实现细节。
实例:
get/set
public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
idea快捷键:alt+insert
二、继承
继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中 抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来 声明继承父类即可。
- 继承的基本语法:
class 子类 extends 父类{}
- 继承给编程带来的便利:
- 代码的复用性提高了
- 代码的扩展性和维护性提高了
- 细节:
- 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访 问,要通过父类提供公共的方法去访问
- 子类必须调用父类的构造器, 完成父类的初始化
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无 参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过
- 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)
- super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)
- super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
- java 所有类都是 Object 类的子类, Object 是所有类的基类
- 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类
- 子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制 (可以使用接口)
- 方法重写/覆盖(override)
- 子类重写父类的方法,返回类型、方法名和参数列表必须完全一致。
- 子类重写方法不能缩小父类方法的访问权限
三、多态
- 多态基于封装和继承的基础之上,
- 编译类型定义对象时就已经确定不能改变
- 运行内存是可以变化的
- 编译类型看=左边,右边是运行内存
public class Animal { public void cry() { System.out.println("Animal cry() 动物在叫...."); } }
public class Cat extends Animal { public void cry() { System.out.println("Cat cry() 小猫喵喵叫..."); } }
public class Dog extends Animal { public void cry() { System.out.println("Dog cry() 小狗汪汪叫..."); } }
public static void main(String[] args) {
//体验对象多态特点 //animal 编译类型就是 Animal , 运行类型 Dog
Animal animal = new Dog(); //因为运行时 , 执行到改行时,animal 运行类型是 Dog,所以 cry 就是 Dog 的 cry animal.cry(); //小狗汪汪叫
//animal 编译类型 Animal,运行类型就是 Cat
animal = new Cat(); animal.cry(); //小猫喵喵叫
}
多态的向下转型:
Cat cat = (Cat) animal;
cat.catchMouse();
向上转型:
Ananimal animal = new cat();
Object obj = new Cat();
- 动态绑定机制
- 当调用对象方法的时候该方法会和该对象的内存地址绑定
- 调用属性没有绑定机制,哪里声明哪里使用
- 多态参数
当方法参数是父类的时候,调用该方法可以传入该父类的任意子类。