JAVA---继承

继承

1. 在  Java  里,继承是面向对象编程的重要特性之一,它允许一个类(子类、派生类)继承另一个类(父类、基类)的属性和方法;

2. Java 中提供一个关键字 extends ,用这个关键字,我们可以让一个类和另一个类建立起继承关系;

public class Srudent extends Person  {}
public class 子类 extends 父类 {}

  Student 称为子类(派生类)

  Person 称为父类(父类、超类)

e.g.

//基本语法示例
// 父类
class ParentClass {
    // 父类的属性
    int parentAttribute;

    // 父类的方法
    void parentMethod() {
        System.out.println("This is a method from the parent class.");
    }
}


// 子类
class ChildClass extends ParentClass {
    // 子类的属性
    int childAttribute;

    // 子类的方法
    void childMethod() {
        System.out.println("This is a method from the child class.");
    }
}

什么时候会用到继承?

当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码。


使用继承的好处:

1. 可以把多个子类中重复的代码抽取到父类中,减少代码冗余,提高代码复用性

2. 子类可以在父类的基础上,增加其他的功能,使子类更强大。


继承的特点

Java 只支持单继承,不支持多继承,但支持多层继承。

单继承:一个子类只能继承一个父类;

不支持多继承:子类不能同时继承多个父类;

多层继承:子类 A 继承父类 B,父类 B 可以继承父类 C

                  每一类都直接或间接的继承于 Object


继承的限制

1. Java 只支持单继承,即一个类只能直接继承自一个父类。

2. 私有成员(private)不能被继承,但可以通过公共的访问器方法来访问。

示例:

class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }

    void eat() {
        System.out.println(name + " is eating.");
    }
}

class Dog extends Animal {
    Dog(String name) {
        super(name);
    }

    void bark() {
        System.out.println(name + " is barking.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Buddy");
        dog.eat();
        dog.bark();
    }
}

在这个示例中,Dog 类继承了 Animal 类,并且添加了自己的 bark 方法。在 Main类的 main方法中,创建了一个 Dog对象,并调用了它继承的 eat方法和自己的 bark方法。


子类到底能继承父类中的哪些内容?

构造方法

继承中:构造方法的访问特点

1. 父类中的构造方法不会被子类继承,但是可以通过super()调用;

2. 子类构造方法的第一行,有一个默认的super();

3. 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己;

4. 如果想要方法中父类有参构造,必须手动书写。

为什么?

1. 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类中的数据;

2. 子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化。

怎么调用父类构造方法?

子类构造方法的第一行语句默认为:super(),不写也存在,且必须在第一行


成员变量

继承中:成员变量的访问特点

就近原则

现在局部位置找,本类成员位置找,父类成员位置找,逐级向上。

如果出现了重名的成员变量怎么办?

System.out.println(name); //从局部位置开始向上找

System.out.println(this.name);  //从本类成员位置开始向上找

System.out.println(super.name);  //从父类成员位置开始向上找

成员方法

继承中:成员方法的访问特点

直接调用满足就近原则:谁离我近,我就用谁

this调用:就近原则

super调用:直接找父类


方法重写

当父类的方法不能满足子类现在的需求时,需要进行方法重写

在继承体系中,子类出现和父类一模一样的方法声明。

本质:覆盖虚方法表中的方法

如果发生重写,则会覆盖

书写格式:

在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

@Override重写注释

1. @Override是放在重写方法上的,校验子类重写时语法是否正常;

2. 加上注释后如果有红色波浪线,表示语法错误;

3. 建议重写方法都加@Override注释,代码安全,优雅!

4. 提高代码可读性。

方法重写注意事项和要求:

1. 重写方法的名称、形参列表必须与父类中保持一致;

2. 子类重写父类方法时,访问权限子类不许大于等于父类

(暂时了解:空着不写<protected<public)

3. 子类重写父类方法时,返回值类型子类必须小于等于父类;

4. 建议:重写的方法尽量和父类保持一致;

5. 只有被添加到虚方法表中的方法才能被重写。

(私有方法不能被重写

  子类不能重写父类中的静态方法,如果重写会报错)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值