定义打印方法
描述
已知有三个类:First、Second、Third。要求定义一个打印方法,支持传入任意引用类型的参数(包括上述三个类),并在方法内部打印出对象的字符串形式。
输入描述:
类名
输出描述:
由该类实例化出来的对象的字符串表示
题解:
方法:
多态性,是子类的对象赋给了父类的引用,使用的前提是有继承关系、有方法的重写
本题中的三个类都重写了toString()方法
那么很显然,需要找到一个类,是本题中三个类的共同父类,又有toString()方法
并且有forName()方法和newInstance()方法,以便在print()中能传入一个对象
不用想了,平时就是用 Object类,它是所有类的父类,又拥有各种各样的方法
找到该类以后,把这个类的对象作为参数传给print(),也就是“父类的引用”,
并且在方法体中应用上三个子类都重写了的方法来实现需求
这样,在Class.forName(className).newInstance()时,
就会帮助创建出“子类的对象”
从而实现“父类的引用指向子类的对象”,即多态性
1. import java.util.Scanner; 2. 3. public class Main { 4. 5. public static void main(String[] args) throws Exception { 6. Scanner scanner = new Scanner(System.in); 7. while (scanner.hasNext()) { 8. String className = scanner.next(); 9. // print就是需要你定义的方法 10. print(Class.forName(className).newInstance()); 11. } 12. } 13. 14. //write your code here...... 15. //public static void print(Object obj){ 16. //System.out.println(obj.getClass().getName()); 17. //} 18. public static void print(Object obj){ 19. System.out.println(obj.toString()); 20. } 21. 22. } 23. 24. class First { 25. public String toString() { 26. return "First"; 27. } 28. } 29. 30. class Second { 31. public String toString() { 32. return "Second"; 33. } 34. } 35. 36. class Third { 37. public String toString() { 38. return "Third"; 39. } 40. }
类型判断
描述
父类Base有两个子类:Sub1、Sub2,现有一个方法getClassName(),要求传入Base类型的实例,在方法内部判定其具体的类型,返回的是类型的简单名字(不含包名),请补全getClassName()方法的判断逻辑。
输入描述:
输入要实例化的类名:Base、Sub1、Sub2 三者之一。
输出描述:
返回实例的实际类名(简化类名,不包含包的名字)。
题解:
方法:这道题要求的是方法中返回实例的具体类型,传入的是一个实例,我们对这个实例调用getClass().getName()即可,直接返回,没什么好说的。
1. import java.util.Scanner; 2. 3. public class Main { 4. 5. public static void main(String[] args) throws Exception { 6. Scanner scanner = new Scanner(System.in); 7. while (scanner.hasNext()) { 8. String className = scanner.next(); 9. Base obj = (Base) Class.forName(className).newInstance(); 10. System.out.println(getClassName(obj)); 11. } 12. } 13. 14. public static String getClassName(Base obj) { 15. 16. //write your code here...... 17. return obj.getClass().getName(); 18. 19. } 20. 21. } 22. 23. class Base { 24. 25. } 26. 27. class Sub1 extends Base { 28. 29. } 30. 31. class Sub2 extends Base { 32. 33. }
实现抽象方法
描述
已知抽象类Base中定义了calculate方法,该方法的计算过程依赖于sum()和avg(),而后两个方法均为抽象方法。要求定义Base的子类Sub类,并实现父类的抽象方法,使得main函数中的运算逻辑得以正确执行。
输入描述:
两个整数
输出描述:
两个整数的和除以两个整数的平均值(平均值为int类型,不考虑小数问题)
题解:
考验对方法的重写,然后调用父类的方法去实现题目的需求而已
1. import java.util.Scanner; 2. 3. public class Main { 4. 5. public static void main(String[] args) { 6. // Sub是需要你定义的子类 7. Base base = new Sub(); 8. 9. Scanner scanner = new Scanner(System.in); 10. while (scanner.hasNextInt()) { 11. int x = scanner.nextInt(); 12. int y = scanner.nextInt(); 13. base.setX(x); 14. base.setY(y); 15. System.out.println(base.calculate()); 16. } 17. } 18. 19. } 20. abstract class Base { 21. 22. private int x; 23. private int y; 24. 25. public int getX() { 26. return x; 27. } 28. 29. public void setX(int x) { 30. this.x = x; 31. } 32. 33. public int getY() { 34. return y; 35. } 36. 37. public void setY(int y) { 38. this.y = y; 39. } 40. 41. public int calculate() { 42. if (avg() == 0) { 43. return 0; 44. } else { 45. return sum() / avg(); 46. } 47. } 48. 49. /** 50. * 返回x和y的和 51. */ 52. public abstract int sum(); 53. 54. /** 55. * 返回x和y的平均值 56. */ 57. public abstract int avg(); 58. 59. } 60. 61. class Sub extends Base { 62. 63. 64. //write your code here...... 65. public int sum(){ 66. 67. return super.getX()+super.getY(); 68. 69. } 70. public int avg(){ 71. 72. return sum()/2; 73. 74. } 75. 76. }
实现接口
描述
已知接口Comparator,内部定义了max函数,用于返回两个整数中的最大值。请定义该接口的实现类,使得main方法中的比较逻辑可以正确执行,要求实现类的名称为ComparatorImpl。
输入描述:
两个整数
输出描述:
两个整数中的最大值
题解:
主要考虑对ComparatorImpl实现类重写max方法,注意:接口是用来被实现(implements)的,实现接口的类称为实现类
1. import java.util.Scanner; 2. 3. public class Main { 4. 5. public static void main(String[] args) { 6. Comparator comparator = new ComparatorImpl(); 7. 8. Scanner scanner = new Scanner(System.in); 9. while (scanner.hasNextInt()) { 10. int x = scanner.nextInt(); 11. int y = scanner.nextInt(); 12. System.out.println(comparator.max(x, y)); 13. } 14. } 15. 16. } 17. 18. interface Comparator { 19. /** 20. * 返回两个整数中的最大值 21. */ 22. int max(int x, int y); 23. } 24. class ComparatorImpl implements Comparator{ 25. 26. public int max(int x,int y){ 27. return x>y?x:y; 28. } 29. 30. }