菜鸟学JAVA之——继承

继承

Java中, 类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。

继承关键字:extends意为扩展,继承就是子类对父类在原有基础上的扩展

A继承了B,那么A就包含了B中的所有的属性和方法

下面用代码实现了解一下继承

父类

public class Animal {
    String color;
    public String type;

    public void eat() {
        System.out.println("会吃的就是动物");
    }
    
    public static void haha() {

    }


}

子类

public class Dog extends Animal {
    public String name;
    public void jiao() {

    }
    //重写,要想让子类实现的方案跟父类的不一样,就必须要重写。
    @Override   //这是一个注解
    public void eat() {
        System.out.println("狗吃肉");
    }
}

子类的子类

public class ZHTYQ extends Dog {

    public int price;

    public void eat() {
        System.out.println("中华田园犬食物链很杂!");
    }
    public void work() {
       
    }
}

场景类

public class Foo {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Dog dog = new Dog();
        
        animal.eat();//输出:会吃的就是动物
        dog.eat();//输出:狗吃肉
        
        ZHTYQ zhtyq = new ZHTYQ();
        zhtyq.haha();  //可以调用,但这个haha()不是被继承的,
                      // 如果是继承那么这个方法就是你的,而这个方法是大家的,
                      // 所有人都是从元数据区拿的
        
        zhtyq.eat();//输出:中华田园犬食物链很杂!
        Animal animal = new ZHTYQ();//animal声明的类型是动物,但是给过来的东西是中华田园犬,
                                    //不能把animal当成中华田园犬用,应该把他当作动物用,
                                    //动物具有的属性方法才能用
        animal.eat();  //打印出狗吃肉,这是因为这个方法是动态方法,对象去执行这个方法,
                       //对象是中华田园犬
        //animal只是入口在栈里,ZHTYQ在堆里,栈的吃方法在堆里执行,栈只是告诉你能指进去
        //那么为什么不能调用堆里ZHTYQ里的work方法呢,这是因为栈找不到区堆里work方法的路
        //如果这里还不理解可以看下面的内存分析
    }
}

对Animal animal = new ZHTYQ();的一个解释

在这里插入图片描述

私有属性能不能被继承?(争论)

两个观点:

1.不能。子类中不能调用父类中继承过来的私有属性

class Human {
    private int a = 1;
    public void print() {
        System.out.println("你好!");
    }

    public void foo() {
        this.print();
    }
}

class Man1 extends Human {
    public void print() {
        System.out.println("我好!");
    }
}

public class Mian1 {
    public static void main(String[] args) {
        //System.out.println(new Man1().a);  报错
        new Man1().foo();//如果父类print是私有的,子类没有重写它,this调用的还是原来父类的print,输出你好!,如果父类的print是公共的,则被重写,输出我好!
    }
}

私有的不能被继承,因为继承了就一定能重写,而这里父类的print方法私有化后不能被子类重写

2.能。私有属性可以继承,可以在公开方法对私有属性的赋值,并且可以将其拿出。能继承但是不能在子类中直接调用

构造方法能被继承吗?

一般方法可以继承重写

构造方法不能被继承,因为构造方法的方法名必须和类名保持一致,不一致的就不是构造方法

如果构造方法能继承,但他的方法名跟类名不一样,所以他就不是构造方法,所以构造方法不能被继承

super与this

Java的类范畴继承是单继承(一个子类只能继承一个父类)

super代表当前类的父类对象

链式继承,super()向上一个父类找,如果找不到就往上上个父类找直到找到为止

this指代本类对象,

super总结
1.super 可以调用父类的构造方法,格式为 super()。Java 会根据 super() 括号内的参数个数和参数类型调用相应的父类构造方法。
2.super 可以调用父类的属性和方法。
3.即使子类构造方法中未使用 super调用父类的构造方法,Java 仍然会在子类的构造方法中隐式地添加 super()。

4.子类对象创建之前必须先创建父类对象 (子类对象是对父类对象的扩展)。因为需要先创建父类对象,所以super()必须写在第一行

这里写的比较凌乱,主要需要通过代码实现来理解,大家可以在阅读一下以下三篇文章具体学习继承
https://blog.csdn.net/qq_38182125/article/details/84961649
https://blog.csdn.net/qq_38182125/article/details/84961649
https://www.baidu.com/link?url=gO7UsA_Q5oAGHPW8WiI5Dx2voKO8xI8QVpdIZ2Uyu76KEb97iVn87GlDcQdbpfSDalvroXO4BkeLRk-q-DavJa&wd=&eqid=cef13ff8003056b0000000035dd3ca09

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值