面向对象的三大基本特征(封装、继承、多态)

面向对象的三大基本特征(封装、继承、多态)

1 封装

将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的访问和操作。

  • 设计思想:把需要隐藏的隐藏起来,把需要展示出来的展示出来。
  • 封装的目的:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。

面向对象的三大基本特征(封装、继承、多态)_第1张图片
面向对象的三大基本特征(封装、继承、多态)_第2张图片
面向对象的三大基本特征(封装、继承、多态)_第3张图片
要修改和查看人类的信息必须通过SET、和GET方法来实现。 这是能初步体现封装的的例子。

2 继承

1 什么是继承?

面向对象三大特征之一;可以使得子类拥有父类的属性和方法,还可以在子类中重新定义,或者追加属性和方法。

2 怎么实现继承?

可以使用关键字extends实现继承

格式: class 子类 extends 父类 { }
面向对象的三大基本特征(封装、继承、多态)_第4张图片

3 使用继承能带来的哪些好处?

1 继承可以使得类和类之间产生关系;比如子类可以访问父类中除了私有的其他成员。
2 提高了代码的复用性; 多个类中相同的成员可以放到一个类中
3 提高了代码的维护性; 如果需要修改代码,只需要修改一处即可

4 使用继承的弊端?

继承让类和类之间产生了联系,类的耦合性增强,如果父类发生变化时,子类也得跟着变化,削弱了子类的独立性

5 那些地方适合使用继承?

需要先判断类与类之间是否存在is a的关系(谁是谁的一种);比如,老师和学生都是人的一种,人即是父类,老师和学生即是子类

6 super关键字:

在对象的内部使用,可以代表父类对象的引用。(父类存储空间的标识)

this和Super的区别?

this:

  • this 能出现在实例方法和构造方法中。

  • this 不能在静态方法中使用。 面向对象的三大基本特征(封装、继承、多态)_第5张图片

  • this. 可以引用本类的属性或方法。
    面向对象的三大基本特征(封装、继承、多态)_第6张图片

  • this. 在区分局部变量实例变量的时候是不能省略的,其他大部分情况下可以省略。
    面向对象的三大基本特征(封装、继承、多态)_第7张图片
    super:

  • super(实参) 的作用:初始化当前对象的父类型特征。并不是创建新对象。实际上对象只创建了一个。

  • super关键字代表:“当前对象”的那部分父类型特征。

  • super 不能使用在静态方法中

  • 当父类和子类中有相同的方法时,如果此时想在子类中访问父中的数据,须使用“super.”进行区分。

结论:
当一个构造方法第一行:既没有this()又没有super()的话,默认会有一个super();

因为:通过当前子类的构造方法调用父类的无参数构造方法。
所以必须保证父类的无参数构造方法是存在的。

父类的构造方法是一定会执行的。

this是引用、保存内存地址、也指向任何对象。
super 不是引用、不保存内存地址、也不指向任何对象。其只是代表当前对象内部的那一块父类型的特征。

7 继承中变量访问有什么特点?

在子类中访问一个变量,采用就近原则。
子类在局部范围找;子类在成员范围找;父类在成员范围找;如果都没有,就报错。

8 构造方法访问的特点?

子类所有的构造方法都会默认地访问父类的无参构造方法。
子类会继承和使用父类的数据。所以,子类在初始化之前,一定要先初始化父类的数据
每一个子类的构造方法第一条语句,都是默认的super()

如果父类中没有无参的构造方法,只有有参的构造方法,怎么处理?

1 子类中使用super(参数),调用有参的方法。
2 父类中构造一个无参的构造方法。

9方法的重写

子类如果对继承的父类的方法不满意,或者想要实现子类特有的功能,可以自己编写继承的方法,这种方式就称为方法的重写。当调用方法时会优先调用子类的方法。

值得注意的是:我们在重写方法时:返回值类型,方法名,类型及个数,这些都要与父类继承的方法相同,才叫方法的重写。

重载和重写的区别:

方法重载: 在同一个类中处理不同数据的多个相同方法名的多态手段。

方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。(不同类)

10 final关键字

  • 表示最终的意思,可以修饰成员变量,成员方法,类。
  • 效果:
  1. 修饰类:该类不可以被继承(可以有父类,不能有子类)

  2. 修饰方法: 该方法不能被重写

  3. 修饰变量:

    该变量变为了一个常量,不能再被赋值

  4. 修饰基本的数据变量:

    基本类型的数据变量,变为常量(数据值不能再改变),不能再被赋值

  5. 修饰引用的数据变量:
    引用类型的数据变量,其地址值不能再改变,但其地址下的内容可以再改变。

    final Student s = new Student(23);
    s = new Student(24); // 错误
    s.setAge(24); // 正确

3 多态

同一个对象,表现出来的多种形态

前提?

要有继承关系
方法要重写
父类的引用指向子类的对象

多态的引用:

  • 父类的引用可以指向本类的对象;

  • 父类的引用可以指向子类的对象;
    面向对象的三大基本特征(封装、继承、多态)_第8张图片
    注意:我们不能使用一个子类的引用来指向父类的对象,如:
    面向对象的三大基本特征(封装、继承、多态)_第9张图片
    为什么子类的引用不能用来指向父类的对象呢?我们能说:学生是一种人类,但是不能说人类是一种学生,人类和学生类是父类和子类的继承关系,它们的从属是不能颠倒的。当父类的引用指向子类的对象时,该对象将只是看成一种特殊的父类(里面有重写的方法和属性),反之,一个子类的引用来指向父类的对象是不可行的!

成员变量访问的特点?

编译看左边,运行看左边
编译和运行用的都是父类的变量

在这里插入图片描述面向对象的三大基本特征(封装、继承、多态)_第10张图片
面向对象的三大基本特征(封装、继承、多态)_第11张图片
结果:
面向对象的三大基本特征(封装、继承、多态)_第12张图片
可以看到,得到的是父类(左边)成员变量的值。
注意:如果父类的成员变量是私有的,调用的时候一般用get成员方法。所以得出的结果是子类(右边)的成员变量。

成员方法访问的特点?

编译看左边,运行看右边
编译时,父类要有相应的方法,运行时,运行的方法是对应子类的方法
面向对象的三大基本特征(封装、继承、多态)_第13张图片面向对象的三大基本特征(封装、继承、多态)_第14张图片面向对象的三大基本特征(封装、继承、多态)_第15张图片
在这里插入图片描述

多态的好处?

可以提高代码的扩展性
定义方法时,如果用父类作为参数,在使用方法时,他可以传递给任意的子类对象
面向对象的三大基本特征(封装、继承、多态)_第16张图片
面向对象的三大基本特征(封装、继承、多态)_第17张图片
在这里插入图片描述
面向对象的三大基本特征(封装、继承、多态)_第18张图片
在这里插入图片描述
弊端:
不能使用子类的特定的成员

向上转型和向下转型:

向上转型:

父类引用指向子类对象就是向上转型
Animal a=new Cat()

向下转型:

将父类型的引用转化为具体的子类型的对象
Cat c=(Cat) Animal
注: 当父类没有相应的方法,子类有,这时,需要调用子类的方法,就可以使用向下转型,将父类引用强转为子类。

你可能感兴趣的:(面向对象的三大基本特征(封装、继承、多态))