您当前的位置: 首页 >  Java

慕晨sekurlsa

暂无认证

  • 3浏览

    0关注

    82博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JAVA基础(十六)——继承和super关键字

慕晨sekurlsa 发布时间:2022-08-14 17:05:54 ,浏览量:3

一、目录
  • 继承介绍
  • 继承原理
  • 继承使用细节
  • 继承练习
  • super关键字
  • super使用细节
  • this和super的比较
二、继承介绍

为什么需要继承? 比如有一个小场景,有两个类,一个是研究生类,另一个是小学生类。这两个类中有很多属性和方法是相同的,这样的话代码太冗余。怎么办?

这时候就用到了继承,用它来实现代码的复用性的问题。

  • 继承的基本介绍 继承可以解决代码复用。当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的变量和方法。所有的子类不需要再重新定义这些属性和方法,只需要通过extends关键字来声明继承父类即可。
  • 继承的基本语法 class 子类 extends 父类{}

注:

  1. 子类会自动拥有父类定义的属性和方法。
  2. 父类又叫超类、基类。
  3. 子类又叫派生类。
三、继承原理

在这里插入图片描述

四、继承使用细节
  1. 子类继承了所有的属性和方法,但是私有属性不能在子类中直接访问,要通过public方法来访问。

  2. 子类必须调用父类的构造器,完成父类的初始化。原因就是在子类的构造器中有一句隐藏的代码:super();,它会默认去调用父类的无参构造器。

  3. 当创建子类时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器。如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作(super(参数,[参数]…);),否则,编译不通过。

    这里有个小注意点: 类中,默认有一个隐式无参构造器,但是如果一旦在类中又写了有参构造器,那么这个隐式无参构造器就消失了,就不存在了。这时候如果需要用到无参构造器,就需要自己显示得写一个出来。

  4. 如果希望指定去调用父类的某个构造器,则显示得调用一下。

  5. super在使用时,需要放在构造器的第一行。

  6. super()和this()都只能放在构造器的第一行,因此这两个方法不能共存在一个构造器。

  7. java所有类都是Object类的子类。

  8. 父类构造器的调用不限于直接父类!将一直往上追溯到Object类(顶级父类)。

  9. 子类最多只能继承一个父类(指直接继承),即java中是单继承机制。

    那么如果想让A类既继承B类,又继承C类,该怎么做? 可以让B继承C类,然后A继承B类,这样就达到了目的。

  10. 不能滥用继承,子类和父类之间必须满足is-a的逻辑关系。(意识就是子类和父类之间必须要有一些联系,比如有很多的相同属性或方法可以共用,那就直接继承。不然虽然也extends了,但是没有意义,违背了使用继承的初衷。)

五、继承练习

编写Computer类,包含CPU、内存、硬盘等属性,getDetails方法用于返回Computer的详细信息。 编写PC子类,继承Computer类,添加特有属性:brand品牌。 编写NotePad子类,继承Computer类,添加特有属性:color。 编写Test类,在main方法中创建PC和NotePad对象,分别给对象中特有属性赋值,以及从Computer类继承的属性赋值,并使用方法打印输出信息。

package com.javaextend;

public class Test {
    public static void main(String[] args) {
        PC pc = new PC("Inter", 16, 2, "hp");
        Notepad notepad = new Notepad("AMD", 32, 1, "black");
        pc.Info();
        notepad.Info();
    }
}

class Computer{
    String CPU;
    int ROM;
    int HandDisk;

    public Computer(String CPU, int ROM, int handDisk) {
        this.CPU = CPU;
        this.ROM = ROM;
        this.HandDisk = handDisk;
    }

    public String getDetails(){
        return("CPU " + CPU + " ROM " + ROM + " G" + " HandDisk " + HandDisk + " T");
    }
}

class PC extends Computer{
    private String brand;

    public PC(String CPU, int ROM, int handDisk, String brand) {
        super(CPU, ROM, handDisk);
        this.brand = brand;
    }

    public void Info(){
        System.out.println(getDetails() + " Brand " + this.brand);
    }
}

class Notepad extends Computer{
    private String color;

    public Notepad(String CPU, int ROM, int handDisk, String color) {
        super(CPU, ROM, handDisk);
        this.color = color;
    }

    public void Info(){
        System.out.println(getDetails() + " color " + this.color);
    }
}

//CPU Inter ROM 16 G HandDisk 2 T Brand hp
//CPU AMD ROM 32 G HandDisk 1 T color black
六、super关键字
  • 基本介绍 super代表父类的引用,用于访问父类的属性、方法、构造器。

  • 基本语法

    1. 访问父类的属性和方法,但不能访问父类的private属性和private方法:super.属性名;、super.方法名(参数列表);。
    2. 访问父类的构造器:super(参数列表);,只能放在构造器的第一句,并且只能出现一句。
  • super的好处 当子类中有和父类重名的属性或方法时,为了访问父类的成员,必须通过super关键字。如果没有重名,使用super、this、直接访问的效果是一样的。

注:

super();只能在构造器中使用,但是super.xxxx表示调用父类的属性或方法,这个可以在成员方法中使用。

七、super使用细节

super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;如果多个基类中都有同名的成员,使用super访问遵循,就近原则。

八、this和super的比较

在这里插入图片描述

关注
打赏
1663680270
查看更多评论
立即登录/注册

微信扫码登录

0.0938s