Java新手小白入门篇 Java面向对象(三)

导读:本篇文章讲解 Java新手小白入门篇 Java面向对象(三),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Java新手小白入门篇 Java面向对象(知识点体系汇总)

  • 面向对象知识链接汇总,知识点体系(思维导图)

Java新手小白入门篇 Java面向对象(一)

  • Java面向对象(第一天)类,对象,方法的重载,练习题

Java新手小白入门篇 Java面向对象(二)

  • Java面向对象(第二天)构造方法,this关键字,内存结构初识,null,NullPointerException,引用类型数组(上),拓展,练习题

Java新手小白入门篇 Java面向对象(三)

  • Java面向对象(第三天)引用类型数组(下),继承,super,向上造型(上),拓展,练习题

Java新手小白入门篇 Java面向对象(四)

  • Java面向对象(第四天)向上造型(下),重写,访问控制修饰符,static关键字,拓展,练习题

Java新手小白入门篇 Java面向对象(五)

  • Java面向对象(第五天)final,static final,abstract关键字(抽象方法,抽象类)

Java新手小白入门篇 Java面向对象(六)

  • Java面向对象(第六天)成员内部类(不经常使用),匿名内部类(经常使用)

Java新手小白入门篇 Java面向对象(七)

  • Java面向对象(第五天)接口,拓展(类与接口的关系,抽象类与接口的区别),练习题

Java新手小白入门篇 Java面向对象(八)

  • Java面向对象(第八天)多态(对象的多态,行为的多态),拓展(面向对象)

Java新手小白入门篇 Java面向对象(九)

  • Java面向对象(第九天)简单的内存结构,面向对象三大特征

  • Java新手小白入门篇系列持续更新中…

一、引用类型数组(下)

1. 知识点概括

  • 想要给引用类型数组赋值,需要new对象
  • 若想访问数组元素(引用类型对象)的属性,需要通过数组元素打点(.)调用
    请添加图片描述

二、继承

1. 概念

继承是一种利用已有的类快速创建新的类的一种机制,新的类能够吸收已有类的属性和行为,并进行新的扩展

2. 特点

  • 作用:代码复用
  • 使用 extends 关键字来表示继承关系
  • 概念
    • 超类/父类:共有的属性和行为
      • 代码复用
      • 为所有派生类提供了统一的类型(向上造型)
    • 派生类/子类:特有的属性和行为
  • 一个父类可以有多个子类,但是一个子类只能有一个父类
    • Java只支持单一继承(类与类之间)
  • 继承具有传递性(爷爷、儿子、孙子这样的关系)
  • 继承多用于功能上的修改,子类可以在拥有父类功能的同时,进行功能拓展
  • 继承是 is a 的关系
  • 子类构造方法会自动调用父类的无参构造方法,相当于子类构造方法中默认有一个super()【下面会说super】
  • 子类不能继承父类私有的属性(成员变量)和行为(方法)【没学到,暂时不需要掌握】

3. 继承入门案例

请添加图片描述

public class ExtendsDemo {
    public static void main(String[] args) {
        // 父类只能调用父类的属性和方法
        Person p = new Person();
        p.name = "zs";
        p.age = 20;
        p.address = "沈阳";
        p.eat();
        // 子类不只是能调用父类的属性和方法,还能调用子类本身特有的属性和方法 (如 stuId 和 study)
        Student s = new Student();
        s.stuId = "JSD2207080101";
        s.name = "zs";
        s.age = 20;
        s.address = "沈阳";
        s.study();
    }
}

/**
 * 1) 一个父类只能有一个子类 Person 有两个子类 (Student/Teacher,除此之外还能被其他的类所继承)
 */
public class Person {
    String name;
    int age;
    String address;
    void eat() {
        System.out.println("干饭人干饭魂,干饭都是人上人");
    }
}

/**
 * 1) 我们通过extends简历了子类与父类的继承关系 格式:(子类 extends 父类)
 * 2) Java单一继承,只能有一个父类 ( Student extends Person 不能再继承其他的类了 )
 */
public class Student extends Person{
    String stuId;
    void study() {
        System.out.println("学编程好前程,好好撸代码");
    }
}

public class Teacher extends Person{
    double salary;
    void teach() {
        System.out.println("编程的真谛:Ctrl+C/Ctrl+V");
    }
}

三、super 关键字

这里我们可以将 super 当做父类的对象
Father super = new Father();

1. super 的用法

  • super.成员变量
    • 当父类的成员变量与子类的成员变量同名时,可以通过super指定父类的成员变量(不常用)
  • super.方法名()
  • super()
    • 调用父类的构造方法

2. super() 的用法

  • super()
    • 调用父类的无参构造
  • super(参数)
    • 调用父类的有参构造 – 对应参数的构造方法

注意:在构造方法里,必须放在子类构造方法的第一行

请添加图片描述

public class SuperDemo {
    public static void main(String[] args) {
        Student s = new Student();
    }
}

public class Person {
    String name;
    int age;
    String address;
    Person() {
        System.out.println("父类的构造方法");
    }
    void eat() {
        System.out.println("干饭人干饭魂,干饭都是人上人");
    }
}

public class Student extends Person{
    String stuId;
    Student() {
        // super(); 相当于Student构造方法的这个位置调用了一个隐式的父类无参构造
        System.out.println("子类的构造方法");
    }
    void study() {
        System.out.println("学编程好前程,好好撸代码");
    }
}

那么问题就随之而来了,如果我们父类中没有无参构造了,子类怎么办???
请添加图片描述

public class Person {
    String name;
    int age;
    String address;
    Person(String name,int age,String address) {
        this.name = name;
        this.age = age;
        this.address =address;
    }
    void eat() {
        System.out.println("干饭人干饭魂,干饭都是人上人");
    }
}

public class Student extends Person{
    String stuId;
    Student(String name,int age,String address,String stuId) {
        // super(name,age,address); // 编译报错,取消注释既可解决问题
        this.stuId = stuId;
    }
    void study() {
        System.out.println("学编程好前程,好好撸代码");
    }
}

四、向上造型(上)

父类的引用指向子类的对象

规定:向上造型后,能点出来谁看引用的类型
例子如下图所示:

在这里插入图片描述

public class Demo {
    public static void main(String[] args) {
        // 向上造型
        //父类的   引用  指向     子类的对象
        Person    ps    =    new Student();
        // 向上造型能 . 出来谁看引用(ps)的类型
        // ps的类型为Person,ps能 . 出来的就是Person的属性和方法
        ps.name = "zs";
        ps.age = 20;
        ps.address = "沈阳";
        ps.eat();
        System.out.println("==========================");
        // 声明了一个Person类型的引用p指向Person对象
        // 只能调用自己的属性和方法
        Person p = new Person();
        p.name = "zs";
        p.age = 20;
        p.address = "沈阳";
        p.eat();
        System.out.println("==========================");
        // 子类既能调用父类共有的属性和方法,也能调用自己独有的属性和方法
        Student s = new Student();
        s.name = "zs";
        s.age = 20;
        s.address = "沈阳";
        s.eat();
        s.stuId = "JSD2207080101";
        s.study();
    }
}

public class Person {
    String name;
    int age;
    String address;

    void eat() {
        System.out.println("干饭人干饭魂,干饭都是人上人");
    }
}

public class Student extends Person{
    String stuId;

    void study() {
        System.out.println("学编程好前程,好好撸代码");
    }
}

多种角色能干的事都一样的时候,可以将多种角色统一造型到超类数组中,实现代码复用
例子如下图所示:
在这里插入图片描述

public class Demo {
    public static void main(String[] args) {
        Person[] ps = new Person[3];
        ps[0] = new Student("JSD2207080101","zs",18,"沈阳");
        ps[1] = new Student("JSD2207080102","ls",20,"大连");
        ps[2] = new Teacher("ww",20,"大连",8800);
        for (int i = 0; i < ps.length; i++) {
            Person p = ps[i];
            p.eat();
        }
    }
}

public class Person {
    String name;
    int age;
    String address;

    public Person(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    void eat() {
        System.out.println(name + "都" + age + "岁了,天天" + address + "家里蹲,就是干饭,就是炫");
    }
}

public class Student extends Person{
    String stuId;

    public Student(String stuId,String name, int age, String address) {
        super(name, age, address);
        this.stuId = stuId;
    }

    void study() {
        System.out.println("学编程好前程,好好撸代码");
    }
}

public class Teacher extends Person{
    double salary;

    public Teacher(String name, int age, String address,double salary) {
        super(name, age, address);
        this.salary = salary;
    }

    void teach() {
        System.out.println("编程的真谛:Ctrl+C/Ctrl+V");
    }
}

五、拓展

1. this 和 super的区别

在这里插入图片描述

六、练习题

1. 习题

1.1 继承练习题

应用知识点:

  • 创建类
  • 构造方法(有参/无参)
  • 继承,super的使用
  • 引用类型数组
  • 向上造型

注意:重要事情说三遍 – 多些注释,多思考!!! 多些注释,多思考!!! 多些注释,多思考!!!

1. 练习题1:

  • 创建一个Person类
    • 成员变量 : name,age,address
    • 方法 : eat (吃)
      • xxx都xx岁了,天天xx家里蹲,就是干饭就是炫
  • 创建一个Student类,继承Person类
    • 成员变量 : 学号stuId
    • 方法 : study (学习)
      • 学编程好前程,好好撸代码
  • 创建一个Teacher类,继承Person类
    • 成员变量 : 工资salary
    • 方法 : teach (教学)
      • 编程的真谛:Ctrl+C/Ctrl+V
  • 创建一个测试类: ExtendsDemo
    • 创建一个人类数组对象,包含3个元素
    • 为人类数组中每个元素赋值:分别为2个学生,1个老师
    • 打印出对象中各个属性的值,和所有能调用的方法

可能纠结的地方,可能出错的地方

  • 构造方法怎么写
    • 写有参构造方法还是写无参构造方法(皆可)
    • 里面做赋值操作还是不做赋值操作
      • 赋值操作
        • 如何赋值
          • 写死
          • 写活
  • 测试类中为什么写东西报错
    • 查看是否写了main方法
    • 思考为什么有些可以写在类里方法外,有些只能写在类里
  • super如何使用
    • 为什么报错(super如何写)
      • 写super报错
      • 不写super也报错

2. 答案

2.1 继承练习题

1. 练习题1:

  • 创建一个Person类
    • 成员变量 : name,age,address
    • 方法 : eat (吃)
      • xxx都xx岁了,天天xx家里蹲,就是干饭就是炫
  • 创建一个Student类,继承Person类
    • 成员变量 : 学号stuId
    • 方法 : study (学习)
      • 学编程好前程,好好撸代码
  • 创建一个Teacher类,继承Person类
    • 成员变量 : 工资salary
    • 方法 : teach (教学)
      • 编程的真谛:Ctrl+C/Ctrl+V
  • 创建一个测试类: ExtendsDemo
    • 创建一个人类数组对象,包含3个元素
    • 为人类数组中每个元素赋值:分别为2个学生,1个老师
    • 打印出对象中各个属性的值,和所有能调用的方法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/107640.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!