第2关:封装、继承和多态进阶(二)

本文演示了一个Java程序设计任务,涉及抽象类Person的创建,包含eat()方法和属性name、sex、age。两个子类Chinese和English分别重写了eat()方法并添加了特定方法shadowBoxing()和horseRiding()。测试类展示了多态性,通过父类引用调用子类方法,输出了预期结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程要求

按照要求编写一个Java应用程序:

  • 定义一个抽象类Person,包含抽象方法eat(),封装属性namesexage,声明包含三个参数的构造方法;

  • 定义一个Chinese类,继承自Person类,重写父类的eat()方法,并定义一个自己特有的方法shadowBoxing()

  • 定义一个English类,继承自Person类,重写父类的eat()方法,并定义一个自己特有的方法horseRiding()

  • 编写测试类,定义一个showEat()方法,使用父类作为方法的形参,实现多态,分别调用showEat()方法,通过强制类型转换调用各自类特有的方法;

  • 具体输出要求请看测试说明。

测试说明

测试输入:
张三

20
史蒂文

22
预期输出:
姓名:张三,性别:男,年龄:20,我是中国人,我喜欢吃饭!
姓名:史蒂文,性别:男,年龄:22,我是英国人,我喜欢吃三明治!
张三在练习太极拳!
史蒂文在练习骑马!


开始你的任务吧,祝你成功!

//package case2;

import java.util.Scanner;

public class Task2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String cName = sc.next();
        String cSex = sc.next();
        int cAge = sc.nextInt();
        String eName = sc.next();
        String eSex = sc.next();
        int eAge = sc.nextInt();

        Person person1=new Chinese(cName,cSex,cAge);

        Person person2=new English(eName,eSex,eAge);

        showEat(person1,person2);

    }

    // 定义showEat方法,使用父类作为方法的形参,实现多态,传入的是哪个具体对象就调用哪个对象的eat()方法
    /********* begin *********/
    public static void showEat(Person person1,Person person2){
        Chinese c=(Chinese)person1;
        System.out.print(c.toString());
        c.eat();
        English e=(English)person2;
        System.out.print(e.toString());
        e.eat();
        c.shadowBoxing();
        e.horseRiding();
    }
    /********* end *********/
}

// 抽象类Person 封装属性name、sex和age
// 构造函数初始化name、sex和age
// 声明抽象方法eat()
abstract class Person {
    private String name;
    private String sex;
    private int age;
    public Person(String name, String sex, int age) {
        super();
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public String getSex() {
        return sex;
    }
    public int getAge() {
        return age;
    }

    public String toString() {
        return String.format("姓名:%s,性别:%s,年龄:%d,",getName(),getSex(),getAge());
    }
}

// Chinese类继承自Person类
// 构造函数初始化name、sex和age
// 重写父类方法eat() 输出'姓名:name,性别:sex,年龄:age,我是中国人,我喜欢吃饭!'
// 定义子类特有方法shadowBoxing(),当父类引用指向子类对象时无法调用该方法 输出'name在练习太极拳!'
class Chinese extends Person {
    public Chinese(String name,String sex,int age){
        super(name,sex,age);
    }

    void eat(){
        System.out.println("我是中国人,我喜欢吃饭!");
    }

    void shadowBoxing(){
        System.out.println(getName()+"在练习太极拳!");
    }

}

// English类继承自Person类
// 构造函数初始化name、sex和age
// 重写父类方法eat() 输出'姓名:name,性别:sex,年龄:age,我是英国人,我喜欢吃三明治!'
// 定义子类特有方法horseRiding(),当父类引用指向子类对象时无法调用该方法 输出'name在练习骑马!'
class English extends Person {
    public English(String name, String sex, int age) {
        super(name, sex, age);
    }

    void eat(){
        System.out.println("我是英国人,我喜欢吃三明治!");
    }

    void horseRiding(){
        System.out.println(getName()+"在练习骑马!");
    }

}

你可以通过几种不同的方式来修改你的 `TimedeltaIndex` 格式,使其更简洁或适应特定的需求。以下是几种常见的做法: ### 1. **去掉 "days" 部分** 如果你只想显示小时部分而不需要 “days”,可以直接将 `TimedeltaIndex` 中的值转换成字符串并截取所需的部分。这里有一个简单的方法是使用 `.astype(str)` 结合 Python 的字符串处理技巧。 ```python import pandas as pd # 原始 TimedeltaIndex 包含 'days' tdi = pd.TimedeltaIndex([ '0 days 01:00:00', '0 days 02:00:00', '0 days 03:00:00', '0 days 04:00:00', '0 days 05:00:00', '0 days 06:00:00', '0 days 07:00:00', '0 days 08:00:00', '0 days 09:00:00', '0 days 10:00:00'], dtype='timedelta64[ns]', freq='H') # 转换为不含 'days' 的形式 simple_tdi = tdi.astype(str).str[-8:] # 截断前缀只保留 HH:MM:SS print(simple_tdi) ``` 输出将是类似这样的内容: ``` ['01:00:00' '02:00:00' '03:00:00' '04:00:00' '05:00:00' '06:00:00' '07:00:00' '08:00:00' '09:00:00' '10:00:00'] dtype: object ``` 请注意这种方法会把结果转成普通的字符串数组而不是 `TimedeltaIndex` 类型了。 ### 2. **直接构造新的 TimedeltaIndex** 如果希望保持 `TimedeltaIndex` 数据类型不变的同时去除掉“day”信息,最干净的方式是在创建时就指定合适的初始值。 ```python # 构建仅包含小时的时间差序列 hours_only = [f'{h}:00:00' for h in range(1, 11)] new_tdi = pd.to_timedelta(hours_only) print(new_tdi) ``` 此段代码将会打印出一个新的 `TimedeltaIndex` 对象,并且其中不再含有‘days’字样,同时仍能保留在后续计算中作为时间差使用的属性。 这两种方法都可以有效地简化你的 `TimedeltaIndex` 表达形式,具体选择哪种取决于你是否还需要将其视为真正的 `TimedeltaIndex` 进行运算或其他用途。 对于进一步的操作或者细节调整,下面列出了几个相的疑问供参考:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值