Java中的继承和多态

目录

一. 什么是继承?

二. 怎样继承?

三. 父类成员的访问

1. 子类中访问父类的成员变量

2.子类中访问父类的成员方法

 3,super 关键字

四. 子类的构造方法

五. 继承的方式

六. 什么是多态

七. 如何实现多态

1.发生向上转型的时机 

 2.什么是重写 

3.向下转型

八. 多态的优缺点


一. 什么是继承?

顾名思义,就是通常我们理解继承的概念,是面向对象中复用某个类下属性和方法的有效手段,当子类继承父类的时候,子类就拥有了父类的属性和方法。

比如动物包含了姓名,年龄,吃东西等属性和功能,其中小狗作为动物的子类,则小狗就拥有了动物的属性和功能。

二. 怎样继承?

Java中的继承和多态_第1张图片

这个代码定义了两个类,一个父类(Animal类),一个子类(Cat类)通过extends关键字来实现继承。在子类中,继承了父类的name 和 age 属性和eat( )方法,同时在子类中也可以有自己的属性和方法

总结:继承是一种思想,是对共性的抽取从而达到代码的复用效果


三. 父类成员的访问

1. 子类中访问父类的成员变量

Java中的继承和多态_第2张图片

1. 如果访问的成员变量子类中有,优先访问自己的成员变量。
2. 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
3. 如果访问的成员变量与父类中成员变量同名,则优先访问自己的

总结:成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。


2.子类中访问父类的成员方法

Java中的继承和多态_第3张图片

访问父类的成员方法和访问父类的成员变量类似

1. 如果子类和父类有相同的方法名,则优先访问子类自己的

2. 如果访问的成员方法子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。

3. 遵循就近原则

 3,super 关键字

当子类和父类有相同的成员变量或者成员方法时,我们说采用就近原则,优先访问子类自己的成员变量和方法,但当我们使用super关键字也可以访问父类的成员变量和方法。

1. 访问父类的成员变量

Java中的继承和多态_第4张图片

 2.访问父类的成员方法

Java中的继承和多态_第5张图片

Java中的继承和多态_第6张图片

注意事项

1. 只能在非静态方法中使用,用来访问非静态成员方法和字段

2. 在子类方法中,访问父类的成员变量和方法 


四. 子类的构造方法

但我们在给子类构造对象时,需要先调用基类构造方法,然后执行子类的构造方法。

Java中的继承和多态_第7张图片

注意

子类构造方法中默认会调用父类的无参构造方法:super(),

如果父类也没有写构造方法,编译器也会提供一个不带参数的构造方法
用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,
并且只能出现一次

Java中的继承和多态_第8张图片

注意

1. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败

2. 当父类不提供构造方法时,编译器会自动提供一个不带参数的构造方法,当父类有带有参数的构造方法的时候,会优先使用带参数的构造方法

五. 继承的方式

1. 单继承

Java中的继承和多态_第9张图片

2. 多层继承Java中的继承和多态_第10张图片 一般我们不希望出现超过三层的继承关系

 3. 不同类继承同一个类

Java中的继承和多态_第11张图片

4,多继承

Java是不支持多继承的 ! ! ! 

Java中的继承和多态_第12张图片


六. 什么是多态

多态是同一个行为具有多个不同表现形式或形态的能力。

Java中的继承和多态_第13张图片

 对于一台打印机来说,都具有打印的功能,但不同的打印机呈现出来的效果是不一样的,同一个事件发生在不同的对象上会产生不同的结果。这就是多态。 

七. 如何实现多态

在java中要实现多态,必须要满足如下几个条件,缺一不可:
1. 必须在继承体系下,发生向上转型
2. 子类必须要对父类中方法进行重写
3. 通过父类的引用调用重写的方法

Java中的继承和多态_第14张图片

 我用这个图详细解释一下发生多态的关键.

在上图中有一个父类 Shape 类,实现了draw( ) ,Circle类,Triangle 类,Square类继承了Shape类,并且重写了父类的draw( )

Java中的继承和多态_第15张图片

1.发生向上转型的时机 

向上转型实际就是创建一个子类对象,将其当成父类对象来使用。

1. 直接赋值的时候发生向上转型

2.方法的参数

Java中的继承和多态_第16张图片

 3.通过返回值实现向上转型Java中的继承和多态_第17张图片

 向上转型的优点:让代码实现更简单灵活。
 向上转型的缺陷:不能调用到子类特有的方法

 2.什么是重写 

 在Java和其他一些高级面向对象的编程语言中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。

Java中的继承和多态_第18张图片

注意事项:

1. 方法的返回值,参数列表,方法名和父类的一样

2. 被重写的方法的访问修饰限定符 在子类中药大于等于父类的

3. 访问修饰限定符权限大小 : private < 默认权限 < protected < public

4.被 private修饰的方法不能被重写.因为private 修饰的方法只能在当前类中使用,如果被其他类继承,当前类是不能访问到的.

5.被final 修饰的方法是不能被重写的

6. 被static 修饰的方法是不能被重写的

6. 构造方法也是不能被重重写的. 因为构造方法是不能被继承的.子类对象在初始化的时候要先帮助父类进行初始化.

3.向下转型

向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的

向下转型是非常不安全的,我们在平常也很少会用到. 

八. 多态的优缺点

优点

1. 能够降低代码的 "圈复杂度", 避免使用大量的 if - else

例如我们现在需要打印的不是一个形状了, 而是多个形状. 如果不基于多态, 实现代码如下

public static void drawShapes() {
    Rect rect = new Rect();
    Cycle cycle = new Cycle();
    Flower flower = new Flower();

    String[] shapes = {"cycle", "rect", "cycle", "rect", "flower"};

    for (String shape : shapes) {
        if (shape.equals("cycle")) {
            cycle.draw();
        } else if (shape.equals("rect")) {
            rect.draw();
        } else if (shape.equals("flower")) {
            flower.draw();
        }
    }
}

如果使用使用多态, 则不必写这么多的 if - else 分支语句, 代码更简单

public static void drawShapes() {

// 我们创建了一个 Shape 对象的数组.
Shape[] shapes = {new Cycle(), new Rect(), new Cycle(),

new Rect(), new Flower()};

for (Shape shape : shapes) {
   shape.draw();
}
}

缺点

代码的运行效率降低。
1. 属性没有多态性
当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性
2. 构造方法没有多态性
 

你可能感兴趣的:(java,开发语言)