手把手带你刷好题(牛客刷题②)

简介: 手把手带你刷好题(牛客刷题②)

定义打印方法

描述

已知有三个类: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. }


相关文章
手把手带你刷好题(牛客刷题③)
手把手带你刷好题(牛客刷题③)
手把手带你刷好题(牛客刷题③)
手把手带你刷好题(牛客刷题⑥)
手把手带你刷好题(牛客刷题⑥)
|
Java API C++
手把手带你刷好题(牛客刷题⑤)
手把手带你刷好题(牛客刷题⑤)
|
存储 索引 容器
手把手带你刷好题(牛客刷题⑦)
手把手带你刷好题(牛客刷题⑦)
|
缓存 Java
手把手带你刷好题(牛客刷题④)
手把手带你刷好题(牛客刷题④)