自学JAVA(oop编程-继承)

继承的介绍

它是指我们子类去继承父类的属性和方法。有时候我们两个类中部分属性和方法是相同的,为了提高代码复用率,于是继承出现了。

继承的作用

继承可以解决代码复用,当两个子类中出现相同的属性和方法时,我们可以抽象出一个父类,在父类中定义属性和方法,所以的子类不需要在重新定义,只需要extends声明继承父类即可。

声明方式如下:

class 类名 extends 父类{

}

572f2b77c10a428c9d525d95f6f5b0c8.jpg

 在上图中,A类作为B类和C类的父类,D类的父类是B类,E类的父类是C类。

那么,有一个问题出现了。就是子类在继承父类时如果该属性或方法访问修饰符是私有的private,那么我们子类还能访问到该属性或方法吗?根据之前包的访问范围来看private修饰符只能在本类内访问,而我们在子类中直接访问是不行的,注意是直接访问,那我们间接访问行不行呢?答案是肯定的,我们可以通过在父类中创建公共的方法去访问私有的属性和方法。

看一段代码

public class Base {//父类中有四个属性,这四个属性的访问控制符都不同
    public int a1;
    protected int a2;
    int a3;
    private int a4=10;//这是我们私有的属性

    public int getA4() {//公共的方法去返回a4,我们子类调用这个公共的get方法即可
        return a4;
    }
    public void test(){//为了调用私有的方法,我们调用该test方法即可
       teat1();

    }
        private void teat1(){//私有的方法test1
            System.out.println("私有的方法被调用");
        }

运行结果

7c6dac5d6ea744488029849c841ef786.jpg

当我们在调用子类的构造器时,总是会先调用父类的构造器,默认情况下先调用父类的无参构造器,如果没有默认构造器则必须要用super()去指定使用那个构造器。

子类只能继承一个父类(直接继承),即JAVA是单继承机制。那么如果我有一个类a,需要继承一个类b的成员和一个类c的成员,我该怎么做呢?

答案是 让a继承b类,b类继承c就行了。

我们在描写类的继承关系之时,要满足正常的逻辑关系,如猫类是动物类的子类,那么我说music类是动物类的子类,这从JAVA语法上是可以通过的,但是music和动物类没有一点关联,谈何继承成员呢。

最后来看继承在内存里的变化

43929049d2e74dce974bdc9b9d90b3f3.jpg

 上图,son类继承Father类,Father类继承Grandpa类

fb589a2c04434ad58148d23fab3501aa.jpg

 当我们子类创建对象时,我们类要加载类信息,我们类要查找父类的信息,然后再看父类上面还有没有父类,直到加载到object类停止。

我们在分配内存信息时,先给最上面的object类分配属性和方法的内存空间,下来是父类,最后是子类

我们在创建对象时,在方法区先出现类和类的继承关系,然后在从父类到子类依次分配内存空间

当我们在用子类对象去访问一个属性例如name,但是这个name父类也有,我们访问的是哪一个呢。

查找关系在子类父类中的运用:

通过查找关系来返回信息

(1)先看子类是否有该属性,并且该属性可以访问

(2)如果子类没有该属性,则向上查找父类是否有(如果父类有,并且可以访问,则返回)

(3)如果父类没有,就按照(3)的规则,向上找上级父类,直到object。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值