自学内容网 自学内容网

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【285-296】

285. 为什么需要继承

286. 继承原理图

继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来声明继承父类即可。画出继承的示意图。

  • 继承的基本语法

287. 继承快速入门

写一个Student基类,让小学生类Pupil类和大学生类Graduate类继承Student基类。
Student.java

package com.Marisa.extend_;

public class Student {
    //共有属性
    public String name;
    public int age;
    private double score;//成绩
    //共有的方法
    public void setScore(double score) {
        this.score = score;
    }
    public void showInfo() {
        System.out.println("学生名 " + name + " 年龄 " + age + " 成绩 " + score);
    }
}

Pubil.java

package com.Marisa.extend_;

public class Pupil extends Student{
    public void testing() {
        System.out.println("小学生 " + name + " 正在考小学数学..");
    }
}

Graduate.java

package com.Marisa.extend_;

public class Graduate extends Student{
    public void testing() {//和 Pupil 不一样
        System.out.println("大学生 " + name + " 正在考大学数学..");
    }
}

Extends01.java

package com.Marisa.extend_;

public class Extends01 {
    public static void main(String[] args) {
        Pupil pupil = new Pupil();
        pupil.name = "田所浩二";
        pupil.age = 24;
        pupil.testing();
        pupil.setScore(50);
        pupil.showInfo();
        System.out.println("=======");
        Graduate graduate = new Graduate();
        graduate.name = "德川";
        graduate.age = 23;
        graduate.testing();
        graduate.setScore(80);
        graduate.showInfo();

    }
}

运行结果:
小学生 田所浩二 正在考小学数学…
学生名 田所浩二 年龄 24 成绩 50.0
=======
大学生 德川 正在考大学数学…
学生名 德川 年龄 23 成绩 80.0

288. 289. 290. 291. 292. 继承使用细节1,2,3,4,5

288.1 继承给编程带来的便利

  1. 代码的复用性提高了
  2. 代码的扩展性和维护性提高了

288.2 继承的深入讨论/细节问题

  1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问

  2. 子类必须调用父类的构造器, 完成父类的初始化




    在子类无参构造器中隐藏了一句话super();

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


在父类里写一个有参构造器,并注释无参构造器:

因为没用super去指定父类构造器,子类的构造器报错:

用super方法指定了父类构造器:

  1. 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)
    在父类中有三个参数不同的构造器:

    在子类的构造器中指定父类的构造器:

    【注】调用父类的无参构造器(如果有),可以不写super()

  2. super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)
    如果不放在第一行,报错:

  3. super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
    本意是先执行父类构造器,再执行子类的构造器,但是这是不允许的。(this()也只能放在构造器里,且为第一句)

  4. java 所有类都是 Object 类的子类, Object 是所有类的基类.

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

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

思考:如何让 A 类继承 B 类和 C 类? 【A 继承 B, B 继承 C】
10) 不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系

293. 继承本质详解



JVM将类信息加载到方法区

294. 继承课堂练习1


输出
a
b name
b
原因:创建B类对象,先执行的是B类的无参构造器,在B类的无参构造器中用this调用了有参构造器,然后B类继承于A类,A类是基类,而且有参构造器没用super()且A类有默认无参构造器,所以调用B类的有参构造器的时候,会先调用A类的无参构造器,输出a,然后再输出b name,这时候B类的有参构造器this执行后,继续执行B类无参构造器的剩下的语句b

295. 继承课堂练习2


和上一个题目类似,答案是
我是A类
hahah 我是B类的有参构造器
我是C类的有参构造器
我是C类的无参构造器

296. 继承课堂练习3

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

package com.Marisa.exercise;

public class Computer {
    private String cpu;// CPU
    private int memory;//内存容量
    private int disk;//硬盘容量

    public Computer(String cpu, int memory, int disk) {
        this.cpu = cpu;
        this.memory = memory;
        this.disk = disk;
    }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public int getMemory() {
        return memory;
    }

    public void setMemory(int memory) {
        this.memory = memory;
    }

    public int getDisk() {
        return disk;
    }

    public void setDisk(int disk) {
        this.disk = disk;
    }

    //返回Computer信息
    public String getDetails(){
        return "CPU=" + cpu + "\nmemory=" + memory + "\ndisk=" + disk;
    }
}

PC.java

package com.Marisa.exercise;

public class PC extends Computer{
    private String brand;

    public PC(String cpu, int memory, int disk, String brand) {
        super(cpu, memory, disk);
        this.brand = brand;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }
    public void printInfo(){
        //调用父类getDetails方法
        System.out.println("PC信息如下:");
        System.out.println(getDetails());
        System.out.println("Brand=" + brand);
        System.out.println();
    }
}

NotePad.java

package com.Marisa.exercise;

public class NotePad extends Computer{
    String color;

    public NotePad(String cpu, int memory, int disk, String color) {
        super(cpu, memory, disk);
        this.color = color;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void printInfo(){
        System.out.println("NotePad信息如下:");
        //调用父类getDetails方法
        System.out.println(getDetails());
        System.out.println("Color=" + color);
        System.out.println();
    }
}

Test.java

package com.Marisa.exercise;

public class Test {
    public static void main(String[] args) {
        PC pc = new PC("Intel Core i9 12900KF", 64, 1024, "ROG");
        pc.printInfo();
        NotePad notePad = new NotePad("高通8Gen2", 12, 512, "黑色");
        notePad.printInfo();
    }
}

运行结果:
PC信息如下:
CPU=Intel Core i9 12900KF
memory=64
disk=1024
Brand=ROG

NotePad信息如下:
CPU=高通8Gen2
memory=12
disk=512
Color=黑色


原文地址:https://blog.csdn.net/qq_30204431/article/details/142755181

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!