Java继承知识点(笔记记录)

继承

一,什么是继承

继承:是从已有的类中派生出新的类,新的类能吸收已有类的所有数据域和方法,并能扩展新的能力。(无法继承构造方法,子类可调用构造方法)

二,父类和子类

父类(超类或基类): 被继承的类。(Object类是所有类的父类)

子类(继承类或派生类): 继承者。子类可以继承父类的所有数据域和方法,并可在此基础上添加新的数据域和方法。(父类的私有数据域和方法也继承,只是不可直接访问)

父类型: 父类定义的类类型。

子类型: 子类定义的类类型。

(若Fruits类是Apple类的父类,则Apple类是Fruits类的子类型,Fruits类是Apple类的父类型)

在这里插入图片描述

注: 一个子类只可有一个父类,一个父类可以有多个子类。

三,方法重写

概念: 方法重写又称方法覆盖 。方法的重写是指两个方法的返回值、方法名、参数的类型和个数相同 (子类重写父类的方法)。 方法的重写,不能发生在同类中,只能发生在子类中。 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。(父类方法仍存在,且未改变)

重写标注:@Override,重写时加于子类方法前。

重写后还能否使用原父类方法?

答:当然可以,使用super语法调用原父类方法。

重载和重写的区别?

答:重写发生在具有继承关系的不同类中;重载可以发生在同一个类中,也可以发生在具有继承关系的不同类中。

方法重写注意点:
  • 重写方法必须也被重写方法有一样的方法签名(方法头中除开访问修饰符和返回类型的其余部分),以及一样或者兼容的返回类型。(兼容指重写方法(子)的返回类型可以是被重写方法(父)返回类型的子类型)
  • 当实例方法是可访问类型时才可重写。
  • 静态方法不能被重写。若子类有与父类相同的静态方法签名,则是子类重新定义了父类中的该静态方法(此时不是重写),那么父类中定义的静态方法将被隐藏。可以使用“父类名.静态方法名”调用隐藏的父类静态方法。
  • 重写方法(子)的访问类型不能低于被重写方法(父)的访问类型。(例如:若被重写方法为public,则重写方法必为public;若被重写方法为protected,则重写方法为public或protected)

四,super关键字

super关键字: 子类可以通过super来调用父类的可访问数据域,方法,构造方法

  • 调用数据域或方法:super.方法名(参数),super.变量名
  • 调用构造函数:super()或super(arguments)

注: 要调用父类的构造方法就必须使用super,且这个调用必须是子类构造方法中的第一条语句。

例题:

class Apple extends Fruits{
    public Apple(String a){
        System.out.println(a);
    }
}
class Fruits{
    public Fruits(String f){
        System.out.println(f);
    }
}

public class Test{
    public static void main(String[] args){
        Apple a = new Apple();
    }
}

结果:无法运行,会导致编译错误(不是运行错误)

原因:在调用子类构造方法时,会先调用父类的构造方法。当子类的构造方法中没有显式的用”super(有参或无参)“调用父类的构造方法时,会自动调用父类的无参构造方法,若父类只包含有参构造方法,则会导致编译错误。需要显式的在子类构造方法中的第一行使用super(有参)指定调用父类有参构造方法。

不管需不需要无参构造方法,最好都设计一个无参构造方法以避免程序设计出现错误

构造方法链: 在任何情况下,构造一个类的实例时(创建对象),将会调用沿着继承链的所有父类的构造方法。当构造一个子类的对象时,子类的构造方法会在完成自己的任务前,首先调用它的父类构造函数。如果父类也继承其他类,那么父类的构造函数也会如此操作。这个过程持续到沿着继承层次结构的最后一个构造方法被调用为止。(即持续到最高的父类的为止)

例题:

class Apple extends Fruits{
    public Apple(){
        System.out.println(4);
    }
}
class Fruits extends Food{
    public Fruits(){
        System.out.println(3);
    }
}
class Food extends Object{
    public Food(){
        System.out.println(2);
    }
}
class Object{
    public Object(){
        System.out.println(1);
    }
}

public class Test {
    public static void main(String[] args){
        Apple a = new Apple();
    }
}

运行结果:
在这里插入图片描述

五,final关键字

概念: 使用final修饰符表明一个类是最终类,是不能作为父类被继承的。

  • final修饰的类不能被继承
  • final修饰的方法不能被重写
  • final修饰的数据域初始化后不能再被赋值(是个常数)

注: 修饰符public, protected, private, static, abstract, final可以用在类成员(数据和方法)上,只有final修饰符还可以用在方法中的局部变量上。

六,super与this区别

​ this表示当前对象。super表示当前对象的父类。

属性/方法: this访问本类中的属性/方法,如果本类中没有此属性/方法则从父类中查找。super访问父类中属性/方法。

构造方法: this调用本类构造器;super调用父类构造器。且均放在构造器首行。

super和this()不能在同一个构造器中同时使用。均不能在static环境中使用(但this能调用static方法或属性)

注: 递归调用造成编译错误。this在哪个类中使用,表示的就是哪个类的属性。

七,继承和聚合的关系

​ 继承和聚合之间的差异,就是is-a(是一种)和has-a(具有)之间的关系。例如,苹果是一种水果,所以Apple类和Fruit类之间用继承;人具有名字,所以Person类和Name类时间用聚合。

例题:

class Mammal{}
class Raccoon extends Mammal{
    Mammal m = new Mammal();
}
class BabyRaccoon extends Mammal{}

//正确选项是哪些?
//A. Raccoon is-a Mammal.
//B. Raccoon has-a Mammal.
//C. BabyRaccoon is-a Mammal.
//D. BabyRaccoon is-a Raccoon.
//E. BabyRaccoon has-a Mammal.
//F. BabyRaccoon is-a BabyRaccoon.

答案:ABCF

八,例题

例:

class A{
    private int a = 10;
    public A(){
        run();
        run2();
    }
    public void run(){
        System.out.println(a);
    }
    public void run2(){
        System.out.println(a);
    }
}
class B extends A{
    private int a = 20;
    public B(){
        run();
        run2();
    }
    public void run(){
        System.out.println(a);
    }

    public static void main(String[] args){
        new B();
    }
}

运行结果:
在这里插入图片描述

解析: 初始化的顺序。1.静态>非静态>构造器 2.父类>子类

所以总的来说,顺序为:
在这里插入图片描述

因此,在B中调用父类A的构造方法时,B中的数据域还未初始化(即B. a = 0)

第一步,进入父类A的构造函数中,调用run()方法。因为实例化对象为子类B的对象(new B()),因此, run()方法调用的并不是父类A中的,而是子类B中的run()方法。 又此时子类B中的数据域还未初始化,因此输出的B类a是0。

第二步,调用run2()方法,因为非静态数据域初始化先于构造器,所以此时A类中的属性a已经初始化为10,run2()中输出的a就是本类中的a。

第三步,父类A构造器执行完毕,子类B的数据域得到初始化(即B. a = 20),进入子类B构造器。调用B中的run()方法输出B中的a。

第四步,子类B构造器调用父类run2()方法,输出的a为父类A的a。

若有错误,欢迎指正。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值