2022-07-21 张明旭 继承、重写、this关键字用法学习记录

这篇博客探讨了Java中的面向对象特性,特别是继承的概念。它解释了如何通过`extends`关键字实现继承,以及单继承的特性。作者通过创建`Biology`、`Animal`、`Person`和`Cat`类来展示继承的层级结构。博客还讨论了`super`关键字的用途,方法的重写规则,并给出了面试题。此外,还提到了`this`关键字在链式处理中的应用。
摘要由CSDN通过智能技术生成

目录

心情感悟

知识点

面向对象: !!继承!!

基类

超类

继承能干什么?

super关键字:

面试题

方法的重写(覆写、覆盖override)

面试题

this关键字-返回多个返回值

      有关this的用法的链式处理


心情感悟

星期四,本来觉得在学两天就休息辣!谁能想到老师请我们一起烧烤!!!梦幻起飞!!!而且明天上午还不用起床,下午在自习,无话可说了,爽爽爽!!!

很多人一起吃烧烤很开心!一直小酌到凌晨三点,很满足!

知识点

面向对象: !!继承!!


extends:继承

extends后只能有一个类。
在Java中,继承是单继承,一个子类只能有一个直接父类,但可以有多个间接父类

参与一个公司架构设计时会多用到继承
其他情况少用

类与类的关系:
1、属性关系
2、参数关系
3、继承关系

创建四个类:

  1. 生物Biology
  2. 动物Animal
  3. 人Person
  4. 猫Cat


1.生物类Biology

public class Biology {
    Integer age;

    public Biology() {
    }

    public Biology(Integer age) {
        this.age = age;
        System.out.println("生物类的构造器...");
    }

    public void breath(){

    }


}


2.动物类Animal

public class Animal extends Biology{
    String name;

    public Animal() {
    }

    public Animal(Integer age) {
        super(age);
        System.out.println("动物类的构造器...");
    }
    public Animal(Integer age,String name) {
        super(age);
//        this(age);
        this.name = name;
//        this(name);
    }
//    public Animal(String name){
//        this.name = name;
//    }

    public void eat(){
        // 调用父类的属性
        age = 20;
        // 调用父类的方法
        breath();
        // 调用当前类的属性
        name = "z";
        // 调用当前类的方法
//        drank();
    }

    public void drank(String water) {
        System.out.println("动物在喝" + water);
    }

    public String show() {
        return "我们很优秀";
    }

    public Biology info(Biology biology) {

        return null;
    }

}


3.人:类Person

public class Person extends Animal{
    public Person() {
    }

    public Person(Integer age) {
        super(age);
        System.out.println("人类的构造器...");
    }

    public void drank(String water){
        System.out.println("人在喝" + water);
        System.out.println("喝完了" + water + "再来一杯!");
    }

    public String show(){
        // 返回的是我们很优秀,我们很直溜
        return super.show() + "我们很直溜";
    }

    public Animal info(Biology animal){

        return null;
    }
}

4.猫Cat

public class Cat extends Animal{
    public Cat(Integer age) {
        super(age);
    }
}


主方法:运行代码

public class Ch01 {
    public static void main(String[] args) {
//这是我们定义给生物类的属性,调用一下没什么毛病
        Biology biology = new Biology();
        biology.age = 20;
        biology.breath();
//如果我们只建立一个什么都没有Animal的类继承于Biology类,Animal也可以调用age属性和breath方法,这是继承于Biology的属性和方法
        Animal animal = new Animal();
        animal.age = 10;
        biology.breath();

        Person person = new Person();
        person.age = 30;
        person.name = "张三";
        person.breath();
        person.eat();
    }

基类


Person、Cat、Animal都可以叫Biology的子类,
Animal叫做Biology的直接子类
Person、Cat叫做Biology的间接子类,Person、Cat叫做Animal的直接子类

超类


Person、Cat间接父类是Biology
Person、Cat直接父类是Animal


继承能干什么?


1、访问权限修饰符
public
protected :受保护的,不同包可以访问
默认的
private

2、性质:

  • 必须写在有父类的子类里(调用属性、方法时可以省略,构造器不可以省略) 
  • 创建子类对象时,父类会先被实例化,再去实例化子类,当一个类被实例化市,一定会先实例化直接和间接父类
  • 子类可以继承父类的属性,子类可以继承父类的方法
  • 父类没有的方法和属性,子类不可能有
  • 子类的构造器可以有多个,但必须和父类的构造器形式上统一
  • 在调用构造器时:super和this不能同时用,只能用一个:其他可以一起用。
    当使用super调用父类的构造器时,super()代码必须在第一行
    this()调用本类构造器也要在第一行
    所以,再构造器中需要使用super或this调用其他构造器时,只能选一个,且代码在第一行

super关键字:


在子类中代表调用父类的结构(属性,方法,构造器)

面试题


this与super的区别?

this:调用的是当前类的结构(属性,方法,构造器)(调属性、方法时可以省略,构造器不可以省略)
super:调用的是父类的结构(属性,方法,构造器)(调属性、方法时可以省略,构造器不可以省略)

super指向的父类,不代表任何对象
this只想的本类,代表当前对象、方法的调用者,


方法的重写(覆写、覆盖override)

方法的重写的规则:


1、方法的组成:

访问权限
返回值类型
方法名
参数列表

2、方法的重写***
前提:在两个类中,且为继承与被继承的关系(仅限于现在)
访问权限:重写的方法访问权限不能低于被重写的方法的访问权限(开发中一般为等于
返回值类型:重写的方法的返回值可以与被重写方法的返回值不同,但是必须是被重写的返回值的子类(子类返回值范围小于父类,开发中一般为相等的)
参数列表:参数类型,个数必须相同
抛出异常:不能抛出的异常,重写的方法不能抛出比被重写的方法更大的异常

*开发中如果要重写,基本就是一模一样,主要改方法体即可*

性质:


1、可以利用父类中方法已经晕算过的结果,在结果的基础上进行扩展

2、方法的重写体现的就是继承的核心,就是为了扩展父类的功能

3、子类可以重写父类的方法,做改变,之后调用的方法为重写后的方法,父类的方法不能再调用了,除了父类自己调用


面试题


重写与重载区别:
1、
重写在两个类中,且两个类有继承关系
重载在一个类中
2、
重写参数类型,个数必须相同
重载参数类型,个数必须不相同
3、
重载的方法名必须相同
重写的方法名相同且返回值类型必须相同

主方法验证代码
其他类见上文:Animal、Biology、Person

public class Ch02 {

在person类中重新定义了Animal的drank方法
调用的方法为重写后的方法,父类的方法不能再调用了,除了父类自己调用

    public static void main(String[] args) {
        Person person = new Person();
        person.drank("江小白");
     }

this关键字-返回多个返回值

在一个方法里。怎么返回多个数据类型不同的值?
对象可以有多个类型不同的属性(值),所以创建对象,返回对象


      有关this的用法的链式处理


              super指向父类,不代表任何对象

   重点:this指向本类,"***代表当前类的对象***"或方法的调用者

   比如我在一个类中定义了Person类的一个person对象,那么Person类中的this就可以代表person
   当用person调用Person类的方法进行赋值操作时,如果该方法的返回值为this,this代表当前类的对象,相当于返回了一个person
   即“person调用Person类的方法进行赋值”这个操作可以当成person继续调用方法

   例如:

   Person类中:


 

   public Person setName(String name) {
        this.name = name;

        return this;
    }

   在其他类调用时:

  public void show(Ch01 ch01){

    }


    public static void main(String[] args) {
        Ch01 ch01 = new Ch01();
        ch01 = ch01.info("abcd", 20);
        System.out.println(ch01.getName() + ch01.getAge());
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值