Java继承

本文探讨了面向对象编程中的继承概念,如何利用继承避免代码冗余,提高复用性,并通过Java示例展示了单继承机制和子类调用父类方法。重点介绍了继承的优缺点及其实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继承

1 什么是继承

继承是面向对象三大特征之一,封装居首位,封装之后形成了独立体,独立体A和独立体B之间可能存在继承关系。

生活中的继承:

image-20210807123152196

继承时子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性,或子类从父类继承方法,使得子类具有与父类相同的行为。从上图来看,虽然食草动物和肉食动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。

为什么要使用继承?

​ 在不同的类中也可能会有共同的特征和动作,可以把这些共同的特征和动作放在一个类中,让其他类共享。因此可以定义一个通用类,然后将其扩展为其他多个特定类,这些特定类继承通用类中的特征和动作。

2 继承的优缺点

优点:

​ 容易实现。

​ 容易扩展。

​ 提高了代码的复用性、提高了代码的可维护性。

缺点:

​ 打破封装,向子类暴露了实现的细节。

​ 耦合度变高,父类更改之后子类也要更改。

​ 只支持单继承,只能继承一个父类。

3 继承的代码怎么实现

/**
 * 这是一个动物类
 */
public class Animal {
    //名称
    private String name;
    //体重
    private double weight;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }
}
/**
 * 这是一个Dog类
 */
public class Dog {
    //名称
    private String name;
    //体重
    private double weight;
    //友好值
    private int friendly;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public int getFriendly() {
        return friendly;
    }

    public void setFriendly(int friendly) {
        this.friendly = friendly;
    }
}

以上两个类分别描述了”动物类“和”狗狗类“,狗狗类除了有动物类的基本特征外还有自己的特性,但是上面代码的编写却显得很繁冗,将其改为继承方式:

/**
 *狗狗类
 */
public class Dog extends Animal {
    //狗狗特有的属性 友好值
    private int friendly;

    //友好值的set和get方法
    public int getFriendly() {
        return friendly;
    }

    public void setFriendly(int friendly) {
        this.friendly = friendly;
    }
}
/**
 * 测试类
 */
public class AnimalTest {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("哈士奇");
        dog.setWeight(50.0);
        System.out.println(dog.getName() + "的体重为" + dog.getWeight() + "Kg");
    }
}

运行结果:

image-20210807151403140

通过以上代码,我们可以看到继承可以解决代码臃肿的问题。换句话说,继承解决了代码复用的问题。

4 继承的相关特性

  1. B 类继承A类,则称 A类为超类(superclass)、父类、基类,B 类则称为子类(subclass)、派生类、扩展类。

  2. Java 中的继承只支持单继承,不支持多继承,C++中支持多继承,这也是 Java 体现简单性的一点,换句话说,Java 中不允许这样写代码:class B extends A,C{ }。

  3. 虽然 Java 中不支持多继承,但有的时候会产生间接继承的效果,例如:class C extends B,class B extends A,也就是说,C 直接继承B,其实C 还间接继承A。

  4. Java 中规定,子类继承父类,除构造方法和被private 修饰的数据不能继承外,剩下都可以继承。

  5. Java 中的类没有显示的继承任何类,则默认继承Object 类,Object 类是Java 语言提供的根类(老祖宗类),也就是说,一个对象与生俱来就有Object 类型中所有的特征。

5 通过子类对象调用继承过来的方法

/**
 * 动物类:属性:名称、体重
 *        方法:eat()
 */
public class Animal {
    //名称
    private String name;
    //体重
    private double weight;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public void eat() {
        System.out.println(name + "在进食");
    }
}
/**
 *狗狗类继承动物类
 */
public class Dog extends Animal {
    //狗狗特有的属性 友好值
    private int friendly;

    //友好值的set和get方法
    public int getFriendly() {
        return friendly;
    }

    public void setFriendly(int friendly) {
        this.friendly = friendly;
    }
}
/**
 * 测试类
 */
public class AnimalTest {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("哈士奇");
        dog.setWeight(50.0);
        System.out.println(dog.getName() + "的体重为" + dog.getWeight() + "Kg");
        //狗狗类对象会不会继承动物类的eat()方法?
        dog.eat();
    }
}

运行结果:

image-20210807153347125

通过以上代码证明,通过子类对象可以调用继承过来的父类方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值