Java开发学习(3)-面向对象中的继承和多态学习总结

219 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

在我们学习完Java的基础知识以后,就要开始Java的面向对象开发,首先学习和了解一下继承和多态的相关概念和语法,以及它们有哪些特性,在哪些应用场景中使用它们。

继承

继承就是子类继承父类的特征和行为,使子类对象(实例)具有父类的实例和方法,使子类具有父类相同的行为。继承需要符合的关系是:is-a,父类更通用,子类更具体。使用继承可以有效实现代码复用,避免重复代码的出现。如:学校中的老师和学生都属于人,食草和食肉动物都属于动物,可以把共有的特性可以作为父类,自有的特性为子类。

关键字

继承使用 extends 和 implements 这两个关键字来实现继承,且所有的类都是继承于Object,如果一个类没有继承关键字,默认继承Object。继承是单一继承,只能继承一个类。

语法:

class 父类 {
}
class 子类 extends 父类 {
}

继承类型

Java中不支持多继承,但是支持多重继承。如下图:

\

java-extends-2020-12-08.png

继承特性

1.子类拥有父类非 private 修饰符的属性和方法;

2.子类可以拥有自己的属性和方法;

3.子类可以自己实现父类的方法;

4.继承是单一继承,但可以多重继承;

5.提供类之间的耦合度,但是降低了代码独立性。

实例:

// 创建父类 Person
public class Person {
    String name;
    int sex;
    int age;
    public Person() {
        this.name = "Person";
        System.out.println("调用Person构造函数");
    }
    public Person(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    public String toString() {
        return "姓名:" + name + "\n年龄:" + age + "\n性别:" + sex;
    }
}
// 创建子类 Teacher
public class Teacher extends Person {
    public Teacher(String name, String sex, int age) {
        //super访问父类成员,必须第一行
        super(name, sex, age);
        System.out.println("调用父类属性age:" + super.age);
    }
    public String toString() {
        return "姓名:" + name + "\n年龄:" + age + "\n性别:" + sex ;
    }

    public static void main(String[] args) {
        Teacher tea = new Teacher();
        System.out.println(tea.toString());
    }
}

多态

多态就是同一个行为具有多个不同表现形式或形态的能力,就是同一个接口使用不同的实例而执行不同操作。

多态存在的必要条件:继承,重写,父类引用指向子类对象。

转化原则

1.子类对象可以当做父类对象使用

2.父类对象不能当做子类对象使用

3.如果父类引用的是子类对象,那么该父类引用可以通过强制转化成子类对象使用

优势

1.消除类型之间的耦合关系

2.接口性

3.可扩充性

4.可替换性

5.灵活性

6.简化性

实例:

// 创建父类 Shape
class Shape {
    void draw() {
        System.out.println("Shape.draw()");
    }
}
 // 创建子类 Circle
class Circle extends Shape {
    void draw() {
        System.out.println("Circle.draw()");
    }
    double area(double r) {
        System.out.println("Circle.area()");
        double area = Math.PI * Math.pow(r, 2);
        return area;
    }
}
 // 创建子类 Square
class Square extends Shape {
    void draw() {
        System.out.println("Square.draw()");
    }
}
// 创建测试类 Test
public class Test {
    public static void main(String[] args) {
        show(new Square());  // 以 Square 对象调用 show 方法
        show(new Circle());  // 以 Circle 对象调用 show 方法

        Shape a = new Circle();  // 向上转型
        a.draw();                     // 调用的是 Circle 的 draw
        Circle c = (Circle)a;        // 向下转型
        System.out.println(c.area(1));// 调用的是 Circle 的 area
    }

    public static void show(Shape a)  {
        a.draw();
        // 类型判断
        if (a instanceof Circle)  {  // 圆做的事情
            Circle c = (Circle)a;
            c.draw();
        } else if (a instanceof Square) { // 正方形做的事情
            Square c = (Square)a;
            c.draw();
        }
    }
}

多态的实现方式

1.重写

2.接口

3.抽象类和抽象方法

后续我们再来学习接口,抽象类的相关知识。

温馨提示

文章内容如果写的存在问题欢迎留言指出,让我们共同交流,共同探讨,共同进步~~~

文章如果对你有帮助,动动你的小手点个赞,鼓励一下,给我前行的动力。

「欢迎在评论区讨论,掘金官方将在掘力星计划活动结束后,在评论区抽送100份掘金周边,抽奖详情见活动文章」