1.什么时候会用到java的继承?

本质:java继承的本质为代码的复用,子类继承父类的全局变量和方法(public,protected)

        例如上边的代码,第一个先定义Animal结构,结构中含有字符串name、color,还有方法run()和eat()。第二三四个定义Cat、Dog、Cow结构,也同样定义name、color、run()和eat(),但是相同的代码写了许多遍是不是就显得比较复杂?

        这就要用到java的继承了,例如要用Cat来继承Animal结构里的全局变量与方法,在定义Cat的时候只需要public class Cat extends Animal{......}就可以了。此时的Cat就可以调用Animal中的color、name、eat()和run()方法了。

2.继承并创建对象在内存中会发生什么?

       

        在Animal animal=new Animal()之后(在堆中创建了一块内存空间),Animal内存空间里边会有变量color、name和方法run()、eat(),此时main()中的Animal0x1对应着堆中的0x1内存空间。我们还创建了一个Cat类和Dog类(java是面向对象的语言,所谓对象就是堆中的对应的内存空间,数据来自于对象当中),就拿Cat来说,Cat会在堆中创建内存空间:

有父类的对象(右)和子类的对象(左)。

此处创建的父类方法有Animal当中的变量与方法,此处的父类对象只属于Cat。这样Cat就可以调用Animal中的变量与方法了。

同上,Dog也是这样的。

创建子类对象的同时一定会去创建父类对象

3.那么创建父类对象和创建子类对象谁优先呢?

因为方法重写的存在,会先创建父类再创建子类。

4.方法重写和方法重载

方法重写:即方法覆盖,父类拥有的方法被子类重写(父类当中的方法不一定完全适用于子类)。

例如在Animal中的run()方法中写入输出“所有的动物都会跑”,在Cat中的run()方法中写入输出“猫用四只脚跑步......”,此时运行输出的结果将会是“猫用四只脚跑步”。

        如图,在堆中创建父类对象之后,父类对象有run()、eat()、name和color,创建子类对象时,子类对象中的run()方法会把父类当中的对象覆盖掉,所以会优先创建父类对象。

此处引申相关概念:方法重载

方法重载:发生在同一个类当中,方法名称相同,参数列表不同的方法。

如图先创建一个jump()方法,打印“猫跳高了......”,再创建一个jump()方法,打印“猫跳高了......”,此处因为重复定义(会撑爆内存)就会报错。但是如果要想再定义一个jump()方法,我们可以在()当中添加一个参数,例如jump(int a),此时这两个就不是同一个方法了。

但是jump(String name)和jump(String color)会报错,因为看的是数据类型而不是变量名。

java程序是根据方法的签名来验证这是不是同一个方法。

                                 ↓

                   (方法名+参数列表(数据类型))

方法重写和方法重载的区别是?

(1).发生范围上:方法重写是父子类之间;

                        方法重载是同一类的内部(包括同类的不同方法)。

(2).方法签名上:方法重写是完全一致的,即方法名、参数列表(数据类型)、返回值的类型要                                 兼容;

                                方法重载是方法名相同,参数列表不同,即参数的个数/类型/顺序不同。

(3).返回值上:方法重写是子类方法的返回值需是父类方法返回值的子类;

                     方法重载并没有强制要求。

(4).访问修饰符上:方法重写是子类方法权限不能低于父类方法(父类public子类就不能是                                             private);

                            方法重载是没有限制的。

(5).示例:方法重写:父类Animal有run(),子类Dog重写run()实现“狗跑”逻辑;

              方法重载:同一类中add(int a,int b)与add(double a,double b)。

super关键字——代表父类,一般用在子类中,调用父类中的方法和变量。

this关键字——this指代当前对象

为什么会有this关键字?

this属性名称:Java为解决变量名的命名冲突和不确定性问题,引入关键字this代表其所在方法的当前对象的引用。——代表当前对象调用某一变量;

this方法名:代表当前对象用某一方法。

this()注意事项:(1)不能在普通方法中且只能在构造方法中使用;

                               (2)在构造方法当中必须是第一条语句;

                               (3)不能和super()一起使用。

5.java继承层次

只支持单继承,即一个子类只有一个父类(通俗来讲一个孩子一个爹),一个父类能有多个子类(一个爹可以有多个孩子)。

如果一个子类可以有多个父类,不仅不知道子类继承的哪个父类,内存还会撑爆!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐