作者:月亮嚼成星~
博客主页:月亮嚼成星~的博客主页
专栏:手把手带你刷牛客
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网

文章目录
描述
已知有三个类:First、Second、Third。要求定义一个打印方法,支持传入任意引用类型的参数(包括上述三个类),并在方法内部打印出对象的字符串形式。
输入描述:
类名
输出描述:
由该类实例化出来的对象的字符串表示

题解:
方法:
多态性,是子类的对象赋给了父类的引用,使用的前提是有继承关系、有方法的重写
本题中的三个类都重写了toString()方法
那么很显然,需要找到一个类,是本题中三个类的共同父类,又有toString()方法
并且有forName()方法和newInstance()方法,以便在print()中能传入一个对象
不用想了,平时就是用 Object类,它是所有类的父类,又拥有各种各样的方法
找到该类以后,把这个类的对象作为参数传给print(),也就是“父类的引用”,
并且在方法体中应用上三个子类都重写了的方法来实现需求
这样,在Class.forName(className).newInstance()时,
就会帮助创建出“子类的对象”
从而实现“父类的引用指向子类的对象”,即多态性
- 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......
- //public static void print(Object obj){
- //System.out.println(obj.getClass().getName());
- //}
- public static void print(Object obj){
- System.out.println(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 三者之一。
输出描述:
返回实例的实际类名(简化类名,不包含包的名字)。

题解:
方法:这道题要求的是方法中返回实例的具体类型,传入的是一个实例,我们对这个实例调用getClass().getName()即可,直接返回,没什么好说的。
- 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) {
-
- //write your code here......
- return obj.getClass().getName();
-
- }
-
- }
-
- class Base {
-
- }
-
- class Sub1 extends Base {
-
- }
-
- class Sub2 extends Base {
-
- }
描述
已知抽象类Base中定义了calculate方法,该方法的计算过程依赖于sum()和avg(),而后两个方法均为抽象方法。要求定义Base的子类Sub类,并实现父类的抽象方法,使得main函数中的运算逻辑得以正确执行。
输入描述:
两个整数
输出描述:
两个整数的和除以两个整数的平均值(平均值为int类型,不考虑小数问题)
题解:
考验对方法的重写,然后调用父类的方法去实现题目的需求而已
- 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;
-
- }
-
- }
描述
已知接口Comparator,内部定义了max函数,用于返回两个整数中的最大值。请定义该接口的实现类,使得main方法中的比较逻辑可以正确执行,要求实现类的名称为ComparatorImpl。
输入描述:
两个整数
输出描述:
两个整数中的最大值

题解:
主要考虑对ComparatorImpl实现类重写max方法,注意:接口是用来被实现(implements)的,实现接口的类称为实现类
- import java.util.Scanner;
-
- public class Main {
-
- public static void main(String[] args) {
- Comparator comparator = new ComparatorImpl();
-
- Scanner scanner = new Scanner(System.in);
- while (scanner.hasNextInt()) {
- int x = scanner.nextInt();
- int y = scanner.nextInt();
- System.out.println(comparator.max(x, y));
- }
- }
-
- }
-
- interface Comparator {
- /**
- * 返回两个整数中的最大值
- */
- int max(int x, int y);
- }
- class ComparatorImpl implements Comparator{
-
- public int max(int x,int y){
- return x>y?x:y;
- }
-
- }

“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!