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

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个老师
    • 打印出对象中各个属性的值,和所有能调用的方法
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
完整全套资源下载地址:https://download.csdn.net/download/qq_27595745/66787542 【完整课程列表】 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 01.Java语言概述(共21页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 02.理解结构化程序设计_理解面向对象(共25页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 03.数据类型和运算符(共19页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 04.流程控制和数组(共33页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 05.面向对象(上)(共35页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 06.面向对象(下)(共55页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 07.与运行环境交互(共40页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 08.Java集合(共44页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 09.泛型(共15页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 10.异常处理(共24页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 11.AWT编程(共46页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 12.Swing编程(共45页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 13.JDBC编程(共52页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 14.Annotation(共10页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 15.输入输出(共41页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 16.多线程(共44页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 17.网络编程(共42页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 18.类加载与反射(共25页).ppt

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值