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

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

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

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

文章目录

定义打印方法;

类型判断

实现抽象方法

实现接口

定义打印方法

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

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

题解:

方法:

多态性,是子类的对象赋给了父类的引用,使用的前提是有继承关系、有方法的重写

本题中的三个类都重写了toString()方法

那么很显然,需要找到一个类,是本题中三个类的共同父类,又有toString()方法

并且有forName()方法和newInstance()方法,以便在print()中能传入一个对象

&#x4E0D;&#x7528;&#x60F3;&#x4E86;&#xFF0C;&#x5E73;&#x65F6;&#x5C31;&#x662F;&#x7528; <span>Object&#x7C7B;</span>&#xFF0C;&#x5B83;&#x662F;<span>&#x6240;&#x6709;&#x7C7B;&#x7684;&#x7236;&#x7C7B;</span>&#xFF0C;&#x53C8;&#x62E5;&#x6709;&#x5404;&#x79CD;&#x5404;&#x6837;&#x7684;&#x65B9;&#x6CD5;

&#x627E;&#x5230;&#x8BE5;&#x7C7B;&#x4EE5;&#x540E;&#xFF0C;&#x628A;&#x8FD9;&#x4E2A;&#x7C7B;&#x7684;&#x5BF9;&#x8C61;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x4F20;&#x7ED9;print()&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x201C;&#x7236;&#x7C7B;&#x7684;&#x5F15;&#x7528;&#x201D;&#xFF0C;

&#x5E76;&#x4E14;&#x5728;&#x65B9;&#x6CD5;&#x4F53;&#x4E2D;&#x5E94;&#x7528;&#x4E0A;&#x4E09;&#x4E2A;&#x5B50;&#x7C7B;&#x90FD;&#x91CD;&#x5199;&#x4E86;&#x7684;&#x65B9;&#x6CD5;&#x6765;&#x5B9E;&#x73B0;&#x9700;&#x6C42;

&#x8FD9;&#x6837;&#xFF0C;&#x5728;Class.forName(className).newInstance()&#x65F6;&#xFF0C;

&#x5C31;&#x4F1A;&#x5E2E;&#x52A9;&#x521B;&#x5EFA;&#x51FA;&#x201C;&#x5B50;&#x7C7B;&#x7684;&#x5BF9;&#x8C61;&#x201D;

&#x4ECE;&#x800C;&#x5B9E;&#x73B0;&#x201C;&#x7236;&#x7C7B;&#x7684;&#x5F15;&#x7528;&#x6307;&#x5411;&#x5B50;&#x7C7B;&#x7684;&#x5BF9;&#x8C61;&#x201D;&#xFF0C;&#x5373;&#x591A;&#x6001;&#x6027;

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;
    }

}

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

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

Original: https://blog.csdn.net/m0_67995737/article/details/126582816
Author: 月亮嚼成星~
Title: 手把手带你刷好题(牛客刷题②)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/542927/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球