Java面向对象--继承

白昼怎懂夜的黑 提交于 2019-12-16 03:17:46

什么是继承

把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些内容,这个关系叫继承。
注意: java只支持单继承 . 使用的方式是extends关键字

生活中的继承

生活继承图
兔子和羊属于食草动物类,老虎和狮子属于食肉动物类
食草动物和食肉动物都属于动物类。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性

继承的语法

class Parent {
}
 
class Son extends Parent {
}

为什么需要继承

先看一个实例:
兔子:属性(姓名,年龄),方法(自我介绍,吃,睡)
老虎:属性(姓名,年龄),方法(自我介绍,吃,睡)

兔子类:

public class Rabbit {
    private String name;
    private int age;
    public Rabbit(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void introduction() {
        System.out.println("大家好!我是"+name+ ",今年"+age+"岁了。");
    }
    public void eat() {
        System.out.println(name+"正在吃");
    }
    public void sleep() {
        System.out.println(name+"正在睡");
    }
}

老虎类:

public class Tiger {
    private String name;
    private int age;
    public Rabbit(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void introduction() {
        System.out.println("大家好!我是"+name+ ",今年"+age+"岁了。");
    }
    public void eat() {
        System.out.println(name+"正在吃");
    }
    public void sleep() {
        System.out.println(name+"正在睡");
    }
}

        可以看出来,代码存在重复了,导致后果就是代码量大且臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错),所以要从根本上解决这两段代码的问题,就需要继承,将两段代码中相同的部分提取出来组成 一个父类:

public class Animal { 
    private String name;  
    private int age; 
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    } 
    public void introduction() { 
        System.out.println("大家好!我是"+name+ ",今年"+age+"岁了。");
    } 
    public void eat(){ 
        System.out.println(name+"正在吃"); 
    }
    public void sleep(){
        System.out.println(name+"正在睡");
    }
}

        这个Animal类就可以作为一个父类,然后兔子类和老虎类继承这个类之后,就具有父类当中的属性和方法,子类就不会存在重复的代码,维护性也提高,代码也更加简洁,提高代码的复用性

继承之后的代码:
兔子类:

public class Rabbit extends Animal {
    public Rabbit(String name, int age) {
        super(name, age);
    }
}

老虎类:

public class Tiger extends Animal {
    public Tiger(String name, int age) {
        super(name, age);
    }
}

继承的类型

单继承
单继承
多重继承
多重继承
不同类继承同一个类
不同类继承同一个类
多继承(不支持)
多继承

为什么不支持多继承?
比如A类和B类里面都有一个同名函数,当C类继承了A、B类时,想要调用父类的函数,此时虚拟机不知道该调用A类的还是B类的

继承的特性

1、子类拥有父类非 private 的属性、方法。
2、子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
3、子类可以用自己的方式实现父类的方法。
4、Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
5、提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)

继承的优缺点

优点:

1、代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;
2、提高代码的复用性;
3、子类可以形似父类,但又异于父类;
4、提高代码的可扩展性,实现父类的方法就可以重写逻辑。

缺点:

1、继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法;
2、降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束;
3、耦合性提高了。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果--------大段的代码需要重构

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!