首页 > 编程语言 >Java学习笔记-继承extends-02

Java学习笔记-继承extends-02

时间:2025-01-01 19:29:24浏览次数:3  
标签:02 Java name sex extends 父类 重写 public String

一、方法重写

1、定义:子类写了一个方法名称、形参列表与父类的某个方法一样的方法去覆盖父类的该方法。

2、方法重写的注意事项:

(1)建议加上:@Override注解,可以校验重写是否正确,同时可读性好。

(2)子类重写父类方法时,访问权限必须大于或者等于父类被重写的方法的权限。

(3)重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。

(4)私有方法、静态方法不能被重写。

总结:声明不变,重新实现。

package org.example.extends5override;

public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.cry();
    }
}

class Animal {
    public void cry() {
        System.out.println("动物在叫");
    }
}

class Cat extends Animal {
    //方法重写:方法名称、形参列表必须一样,这个方法就是方法重写
    @Override//方法重写的校验注解(标志),要求方法名称和形参列表必须与被重写方法一致,否则报错。
    //更安全,可读性好,更优雅
    public void cry() {
        System.out.println("猫在叫");
    }
}

3、方法重写的应用场景

子类重写Object类的toString()方法,以便返回对象的内容。

package org.example.extends5override;

public class Test2 {

    public static void main(String[] args) {
        Student s = new Student("张三", 18, "男");
        //注意1:直接输出对象,默认调用Object类的toString()方法(可以省略不写调用toString()方法),返回对象的地址信息
        System.out.println(s);
        //System.out.println(s.toString());
        //注意2:输出对象的地址实际上没有什么意义,开发中更希望输出对象时看到对象的内容信息,所以子类需要重写Object类的toString()方法,
        //      以便以后输出对象时默认就近调用子类重写的toString()方法
    }
}


class Student{
    private String name;
    private int age;
    private String sex;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }

    public Student() {
    }
    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

二、子类构造器

1、子类构造器的特点:子类中的全部构造器,都必须先调用父类的构造器,再执行自己的。

package org.example.extends6constructor;

public class Test {
    public static void main(String[] args) {
        //目标:认识子类构造器的特点
        //子类构造器必须先调用父类的构造器,再执行自己的构造器
        Zi zi = new Zi();
    }
}
class Zi extends Fu{
    public Zi(){
        //super();//默认存在的,写不写都有,调用父类的无参数构造器
        super(10);//指定调用父类的有参数构造器
        System.out.println("子类无参构造器");
    }
}
class Fu{
    public Fu(){
        System.out.println("父类无参构造器");
    }
    public Fu(int a){
        System.out.println("父类有参构造器");
    }
}

2、super(...)调用父类有参数构造器的常见应用场景:

为对象中包含父类这部分的成员变量进行赋值。

 代码演示如下:

package org.example.extends6constructor;
//父类
public class People {
    private String name;
    private String sex;
    public People(){
    }
    public People(String name,String sex){
        this.name = name;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
package org.example.extends6constructor;
//子类
public class Teacher extends People {
    private String skills;

    public Teacher() {
    }

    public Teacher(String name,String sex, String skills) {
        super(name, sex);
        this.skills = skills;
    }

    public String getSkills() {
        return skills;
    }

    public void setSkills(String skills) {
        this.skills = skills;
    }
}
package org.example.extends6constructor;

public class Test2 {
    public static void main(String[] args) {
        Teacher t = new Teacher("张三",  "男", "Java");
        System.out.println(t.getName());
        System.out.println(t.getSex());
        System.out.println(t.getSkills());
    }
}

当主类创建Teacher类的对象t时,会自动执行Teacher类的有参构造器对t赋值。由于Teacher类继承了People类,因此对象t是由Teacher类和People类两张设计图共同完成的,有三个属性:name、sex、skill。

调用Teacher类的无参构造器时,会先调用父类People类的无参构造器。但由于主类中用有参构造器对对象赋值,故无参构造器没有使用到。

调用Teacher类的有参构造器时,会先调用父类People类的无参构造器,因此要写super(name,sex);来指定调用父类的有参构造器。

 我们可以将super(name,sex);注释掉来验证这一点:

标签:02,Java,name,sex,extends,父类,重写,public,String
From: https://blog.csdn.net/ddshs/article/details/144869433

相关文章

  • Adobe Photoshop(简称PS2025)图像处理软件win/mac下载安装
    AdobePhotoshop软件简介AdobePhotoshop(简称PS)是由AdobeSystems开发的一款图像处理软件,广泛应用于图像编辑、照片修饰、数字绘画等领域。它以强大的功能和灵活的操作界面著称,是专业设计师、摄影师和艺术家等创意工作者的必备工具。PS下载链接https://pan.baidu.com/s/189......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript购物商城
    HTML+CSS+JS【购物商城】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript购物商城(篮球)
    HTML+CSS+JS【购物商城】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • EC final2024游记
    省流:加训数据结构,加训成功了一半,我们7个真是太强了!Day0热身赛,队友瞬秒了A,我看D发现是循环卷积,但是我队没打板子,绷。B太长了看不懂,所以去看C。队友一眼发现点合法的充要条件是出边集合不被其他点完全包含,然后做完了。C写完交上去T了,疑惑若干分钟后写快读轻松通过......
  • JavaScript 中处理 100 万数据时确保性能和流畅度的几种方法
    以下是在JavaScript中处理100万数据时确保性能和流畅度的几种方法:1.使用WebWorkers思路:将数据处理任务转移到WebWorkers,它可以在后台线程中执行代码,避免阻塞主线程,从而保证页面的流畅性。代码示例:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-......
  • Java 集合框架之 List、Set 和 Map 的比较与使用
    Java集合框架之List、Set和Map的比较与使用引言在Java编程中,集合(Collection)是用于存储多个对象的数据结构。List、Set和Map是Java集合框架中最常用的接口,它们各自提供了不同的特性来满足不同的需求。本文将深入探讨这三种集合类型的区别以及如何正确选择和使......
  • JavaScript 基本语法
    一、JavaScript简介1.JavaScript的特点动态类型语言:变量的类型在运行时决定。面向对象:支持对象和原型继承。单线程、异步:基于事件循环的非阻塞模式。2.JavaScript的应用场景前端开发:控制DOM、实现交互(如React、Vue)。后端开发:通过Node.js构建服务器。混合开发:......
  • Java面试要点111 - Java BlockingQueue实现原理
    文章目录引言一、BlockingQueue基本概念二、主要实现类解析2.1ArrayBlockingQueue实现原理2.2LinkedBlockingQueue实现原理三、高级特性应用3.1优先级队列实现3.2延迟队列实现四、实际应用场景4.1生产者-消费者模式总结引言BlockingQueue是Java并发包中的......
  • Java面试要点112 - Java延迟队列DelayQueue技术解析
    文章目录引言一、DelayQueue工作原理二、延迟队列的内部实现三、高级特性与优化3.1优先级控制3.2性能优化四、消息延迟投递系统五、定时任务调度实现六、异常处理与资源管理总结引言DelayQueue是Java并发包中一个专门用于延迟处理的阻塞队列实现,它根据延迟时间......
  • 第一节 Java中的For循环到底多强大?从基础到高级让你彻底搞懂!
    在Java编程中,for循环是一个“平凡又伟大”的存在!......