【JAVA】继承

发布于:2022-12-18 ⋅ 阅读:(215) ⋅ 点赞:(0)

1.啥是继承

2.父类成员访问

3.super关键字(VS this)

4.父类构造方法

什么是继承?

继承在生活中有很多情况,比如继承了你爹的遗产,或者是你遗传了你爸爸的基因,简单来说你就拥有了你爸爸的一部分,而代码中的继承也大同小异,

比如,写两个类,分别是狗类和鸟类

class Dog{
    public String name;
    public int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println(name + " 正在吃狗粮");
    }
    
    public void swim(){
        System.out.println(name + " 正在狗刨游泳");
    }
}

class Bird{
    public String name;
    public int age;

    public Bird(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println(name + " 正在吃虫子");
    }
    
    public void fly(){
        System.out.println(name + " 正在飞");
    }
}

狗和鸟都是动物,从两个类来看,它们都有名字name,年龄age,并且都会eat吃这个方法,name,age,eat这些都是它们的共性,所以我们可以把它们的共性抽取出来放在Animals类里面,Animals是动物,而鸟和狗从属于Animals,这就出现了包含关系,所以Animals中的eat吃可以被鸟和狗继承,而在代码中的表现就是,鸟和狗继承了Animals后,就拥有了Animals里的eat,而不用再单独给猫狗类分别写eat,当然,Animals中的成员变量也可以被继承

实现继承关系后(相对而言)

Animals类被称为父类/超类/基类

Dog类和Bird类被称为子类/派生类

我们用extends关键字来继承

class Animals{
    public String name;
    public int age;

    public void eat(){
        System.out.println(name + "正在吃饭");
    }
}
class Dog extends Animals{
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void swim(){
        System.out.println(name + " 正在狗刨游泳");
    }
}

class Bird extends Animals{

    public Bird(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void fly(){
        System.out.println(name + " 正在飞");
    }
}

public class Demo1 {
    public static void main(String[] args) {
        Dog dog = new Dog("狗子",3);
        Bird bird = new Bird("小鸟",2);

        dog.eat();
        bird.eat();
    }
}

从代码来看,狗和鸟继承Animals类后,不需要再写父类里有的成员(name,age,eat)

继承的本质就是:共性的抽取,实现对代码的复用


访问父类的成员

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

(1).父类变量与子类变量不重名

(2).父类和子类变量重名

 父类和子类中如果出现重名变量,则会优先访问子类的变量

那要是非要在重名的情况下访问父类的变量,则用super关键字来进行访问

 用super就可以访问到父类的重名变量

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


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

(1).子类方法与父类方法不重名

class Base{
    public void methodA(){
        System.out.println("父类方法");
    }
}
class Derived extends Base{
    public void methodB(){
        System.out.println("子类方法");
    }
    public void methodC(){
        methodA();
        methodB();
    }
}

public class Demo2 {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.methodC();
    }
}

总结:成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时再到父类中找,如果父类中也没有则报错。

(2).子类方法与父类方法重名

 与访问重名的父类变量一样,会优先访问子类里的重名方法

子类方法可以与父类方法实现方法重载,代码会根据重载方法的参数来实现对应方法

 同样的,如果我们非要访问父类的重名方法也同样是调用super关键字来访问

 

         总结:

通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。

通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错;

不能在非静态的方法里访问静态的成员方法,如果访问的方法是静态的,子类方法,得先创建子类对象,调用对象来访问,而访问静态的父类方法,可以用类名来访问

 


super关键字

super关键字,该关键字主要作用:在子类方法中访问父类的成员。

【注意事项】

1. 只能在非静态方法中使用

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

 在上面的代码调用过super作为示例,这里不过多介绍


父类构造方法

父子父子,先有父再有子,即:子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。

class A{
    int a;
    int b;

    public A(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public void methodA(){
        System.out.println("这是父类的成员方法");
    }
}

class B extends A{

    public B(int a, int b) {
        super(a, b);
    }

    int c;
    int d;

    public void methodB(){
        System.out.println("这是子类的成员方法");
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到