第一题:补全构造方法
题目描述
有父类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; } }