【Java刷题进阶】基础入门篇⑤

举报
陈橘又青 发表于 2022/09/28 15:36:23 2022/09/28
【摘要】 第一题:补全构造方法 🍂题目描述有父类Base,内部定义了x、y属性。有子类Sub,继承自父类Base。子类新增了一个z属性,并且定义了calculate方法,在此方法内计算了父类和子类中x、y、z属性三者的乘积。请补全子类构造方法的初始化逻辑,使得该计算逻辑能够正确执行。输入描述:三个整数:x, y, z输出描述:三个整数的乘积:xyz 🍃示例输入:1 2 3输出:6 🍃题解imp...

第一题:补全构造方法

🍂题目描述

有父类Base,内部定义了x、y属性。有子类Sub,继承自父类Base。子类新增了一个z属性,并且定义了calculate方法,在此方法内计算了父类和子类中x、y、z属性三者的乘积。请补全子类构造方法的初始化逻辑,使得该计算逻辑能够正确执行。

输入描述:
三个整数:x, y, z
输出描述:
三个整数的乘积:xyz

🍃示例

输入:1 2 3
输出:6

🍃题解

import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            int z = scanner.nextInt();
            Sub sub = new Sub(x, y, z);
            System.out.println(sub.calculate());
        }
    }
 
}
 
class Base {
 
    private int x;
    private int y;
 
    public Base(int x, int y) { //父类构造方法
        this.x = x;
        this.y = y;
    }
 
    public int getX() {
        return x;
    }
 
    public int getY() {
        return y;
    }
 
}
 
class Sub extends Base {
 
    private int z;
 
    public Sub(int x, int y, int z) { //子类构造方法
        super(x, y); //调用父类构造方法
        this.z = z;
    }
 
    public int getZ() {
        return z;
    }
 
    public int calculate() { //子类计算三者乘积
        return super.getX() * super.getY() * this.getZ();
    }
 
}

第二题:重写计算逻辑

🍂题目描述

在父类Base中定义了计算方法calculate(),该方法用于计算两个数的乘积(X*Y)。请在子类Sub中重写该方法,将计算逻辑由乘法改为除法(X/Y)。注意,当分母为0时输出“Error”。

输入描述:
两个整数
输出描述:
两个整数的商(int类型,不考虑小数情况)

🍃示例

输入:6 2
输出:3

输入:1 0
输出:Error

🍃题解

import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            Sub sub = new Sub(x, y);
            sub.calculate();
        }
    }
 
}
 
class Base {
 
    private int x;
    private int y;
 
    public Base(int x, int y) {
        this.x = x;
        this.y = y;
    }
 
    public int getX() {
        return x;
    }
 
    public int getY() {
        return y;
    }
 
    public void calculate() {
        System.out.println(getX() * getY());
    }
 
}
 
class Sub extends Base {
    public Sub(int x, int y){  //父类的构造方法
        super(x, y);
    }
     
    public void calculate(){
        if(getY() == 0) //除数为0
            System.out.println("Error");
        else
            System.out.println(getX() / getY());
    }
}

第三题

🍂题目描述

已知有三个类:First、Second、Third。要求定义一个打印方法,支持传入任意引用类型的参数(包括上述三个类),并在方法内部打印出对象的字符串形式。

输入描述:
类名
输出描述:
由该类实例化出来的对象的字符串表示

🍃示例

输入:First
输出:First

🍃题解

import java.util.Scanner;
public class Main {
 
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String className = scanner.next();
            // print就是需要你定义的方法
            print(Class.forName(className).newInstance());
        }
    }
 
    // write your code here......
     
    // 多态性,是子类的对象赋给了父类的引用,使用的前提是有继承关系、有方法的重写
    // 本题中的三个类都重写了toString()方法
    // 那么很显然,需要找到一个类,是本题中三个类的共同父类,又有toString()方法
    // 并且有forName()方法和newInstance()方法,以便在第10行的print()中能传入一个对象
    // 不用想了,平时就是用 Object类,它是所有类的父类,又拥有各种各样的方法
 
    // 找到该类以后,把这个类的对象作为参数传给print(),也就是“父类的引用”,
    // 并且在方法体中应用上三个子类都重写了的方法来实现需求
    // 这样,在Class.forName(className).newInstance()时,
    // 就会帮助创建出“子类的对象”
    //
    // 从而实现“父类的引用指向子类的对象”,即多态性
     
    public static void print(Object obj) {
        System.out.print(obj.toString());
    }
 
}
 
class First {
    public String toString() {
        return "First";
    }
     
}
 
class Second {
    public String toString() {
        return "Second";
    }
}
 
class Third {
    public String toString() {
        return "Third";
    }
}

第四题:类型判断

🍂题目描述

父类Base有两个子类:Sub1、Sub2,现有一个方法getClassName(),要求传入Base类型的实例,在方法内部判定其具体的类型,返回的是类型的简单名字(不含包名),请补全getClassName()方法的判断逻辑。

输入描述:
输入要实例化的类名:Base、Sub1、Sub2 三者之一。
输出描述:
返回实例的实际类名(简化类名,不包含包的名字)。

🍃示例

输入: Sub1
输出: Sub1

输入: Sub2
输出: Sub2

输入: Base
输出: Base

🍃题解

import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String className = scanner.next();
            Base obj = (Base) Class.forName(className).newInstance();
            System.out.println(getClassName(obj));
        }
    }
 
    public static String getClassName(Base obj) {
        return obj.getClass().getName(); //直接返回
    }
 
}
 
class Base {
 
}
 
class Sub1 extends Base {
 
}
 
class Sub2 extends Base {
 
}

第五题:实现抽象方法

🍂题目描述

已知抽象类Base中定义了calculate方法,该方法的计算过程依赖于sum()和avg(),而后两个方法均为抽象方法。要求定义Base的子类Sub类,并实现父类的抽象方法,使得main函数中的运算逻辑得以正确执行。

输入描述:
两个整数
输出描述:
两个整数的和除以两个整数的平均值(平均值为int类型,不考虑小数问题)

🍃示例

输入:1 2
输出:3

🍃题解

import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        // Sub是需要你定义的子类
        Base base = new Sub();
 
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            base.setX(x);
            base.setY(y);
            System.out.println(base.calculate());
        }
    }
 
}
 
abstract class Base {
 
    private int x;
    private int y;
 
    public int getX() {
        return x;
    }
 
    public void setX(int x) {
        this.x = x;
    }
 
    public int getY() {
        return y;
    }
 
    public void setY(int y) {
        this.y = y;
    }
 
    public int calculate() {
        if (avg() == 0) {
            return 0;
        } else {
            return sum() / avg();
        }
    }
 
    /**
     * 返回x和y的和
     */
    public abstract int sum();
 
    /**
     * 返回x和y的平均值
     */
    public abstract int avg();
 
}
 
class Sub extends Base {
 
    //write your code here......
   public int sum() {
       return super.getX() + super.getY();
   }
     
    public int avg() {
        return sum() / 2;
    }
 
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。