Java-面向对象基础-覆盖与toString

本文讲述了Java中覆盖和重载的概念,以及如何在Employee类中覆盖toString方法以展示特定信息。
摘要由CSDN通过智能技术生成

目录

题目需求

覆盖 

什么是覆盖

覆盖的规则

覆盖与重载

toString()方法

完整代码

后言


 

题目需求

Person类,Company类,Employee类。

其中Employee类继承自Person类,属性为:

private Company company;
private double salary;

现在要求编写Employee类的toString方法,返回的字符串格式为:父类的toString-company的toString-salary

函数接口定义:

public String toString()

已有的Main类定义:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in) ;
        String companyName = scanner.nextLine() ;
        String name = scanner.nextLine();
        int age = scanner.nextInt() ;
        int salary = scanner.nextInt() ;



        Company company = new Company(companyName) ;

        Employee employee = new Employee(company ,salary) ;
        employee.setName(name);
        employee.setAge(age);

        System.out.println(employee.toString());
    }
}

在main方法中输入employee的各项信息并按要求输出,注意年龄和公司名之间输出一个”true“

输入样例

Microsoft
Li
18
18000

输出样例

Li-18-true-Microsoft-18000.0

覆盖 

这是一次复习,上回我们也有提到覆盖(Java-面向对象基础-覆盖与equals-CSDN博客)

什么是覆盖

覆盖(override)是面向对象编程中的一个重要概念,它指的是子类重新定义父类中已经定义的方法的行为。当子类继承了一个父类,并且在子类中定义了与父类中同名、同参数列表的方法时,就发生了方法的覆盖。

在Java中,如果子类中定义了一个与父类中同名、同参数列表的方法,那么在使用子类对象调用这个方法时,将会优先调用子类中的方法,而不是父类中的方法。这种覆盖行为允许子类修改或扩展从父类继承而来的方法的行为,使得程序更加灵活和可扩展。

覆盖的规则

覆盖方法的一些重要规则包括:

  1. 子类中覆盖的方法必须与父类中被覆盖的方法具有相同的方法签名,包括方法名、返回类型和参数列表。
  2. 覆盖的方法不能降低访问权限,例如不能由public变成protected或private,但可以提高访问权限,例如由protected变成public。
  3. 如果父类方法被final修饰,那么它不能被覆盖。
  4. 如果子类中的方法与父类中的方法具有不同的方法签名,则不算是覆盖,而是方法的重载

通过覆盖,子类能够根据自身的特定需求来重新定义继承自父类的方法,这是实现多态性的重要手段之一

覆盖与重载

  1. 覆盖(Override):

    • 覆盖是指子类重新定义父类中已有的方法。当子类中的方法名、参数列表和返回类型与父类中的方法完全相同时,就称为覆盖。
    • 覆盖发生在继承关系中,子类通过覆盖父类的方法来改变或补充父类方法的行为。
    • 覆盖要求子类方法的访问修饰符不能比父类方法的访问修饰符更严格,并且不能抛出比父类方法更多的异常。
  2. 重载(Overload):

    • 重载指的是在一个类中,可以有多个方法拥有相同的名字,但是参数列表不同(参数类型、个数或顺序不同)。
    • 重载的方法是根据参数列表的不同来区分的。在调用时根据传入的参数类型或数量来决定调用哪个重载方法。

总结来说,覆盖是子类重新定义父类中已有的方法,而重载是在一个类中定义多个相同名称但参数列表不同的方法。

toString()方法

在Java中,toString() 是一个非常重要的方法。它是 Object 类中的一个方法,因此所有的类都继承了这个方法。在需要表示对象的字符串表示形式时,toString() 方法会被调用。

当使用 System.out.println() 或者将对象转换为字符串时,Java 会自动调用该对象的 toString() 方法。默认情况下,Object 类中的 toString() 方法返回的是对象的类名和哈希码的十六进制表示,例如 "ClassName@hashcode"。

不过,通常情况下我们都会重写 toString() 方法,以便返回更有意义的字符串表示形式,使得它能够清晰地表达对象的状态或值。通过重写 toString() 方法,我们可以自定义对象的字符串表示形式,以便于调试、输出以及其他需要将对象转换为字符串的场景。

完整代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in) ;
        String companyName = scanner.nextLine() ;
        String name = scanner.nextLine();
        int age = scanner.nextInt() ;
        int salary = scanner.nextInt() ;



        Company company = new Company(companyName) ;

        Employee employee = new Employee(company ,salary) ;
        employee.setName(name);
        employee.setAge(age);

        System.out.println(employee.toString());
    }
}

class Company {
    private String name;

    public Company() {
    }

    public Company(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return name ;
    }
}

class Employee extends Person {
    private Company company;
    private double salary;

    public Employee() {
    }

    public Employee(Company company, double salary) {
        this.company = company;
        this.salary = salary;
    }

    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return super.toString() + "-" + company.toString() + "-" + salary ;
    }
}

class Person {
    private String name ;
    private int age ;

    public Person() {
    }

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

    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;
    }

    @Override
    public String toString() {
        return name + "-" + age + "-" + "true"  ;
    }
}

后言

  • 本篇博客复习了关于覆盖的基础知识,探讨了覆盖与重载的区别,并初步了解了toString()方法
  • 可知,判断覆盖与重载的方式是通过观察其参数列表,以及看是发生在同一个类中还是不同类中

新人创作,水平有限,如有错误,敬请指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eternal*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值