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


    ced485cbb11e458d81a746890b32cf3f.gif  

    作者:月亮嚼成星~

    博客主页:月亮嚼成星~的博客主页

    专栏:手把手带你刷牛客

    工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网

    点击免费注册和我一起刷题吧

    文章目录

    定义打印方法 

    类型判断 

    实现抽象方法

    实现接口


    定义打印方法 

    描述

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

    输入描述:

    类名

    输出描述:

    由该类实例化出来的对象的字符串表示

    题解:

    方法:

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

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

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

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

    不用想了,平时就是用 Object类,它是所有类的父类,又拥有各种各样的方法

    找到该类以后,把这个类的对象作为参数传给print(),也就是“父类的引用”,

    并且在方法体中应用上三个子类都重写了的方法来实现需求

    这样,在Class.forName(className).newInstance()时,

    就会帮助创建出“子类的对象”

    从而实现“父类的引用指向子类的对象”,即多态性

    1. import java.util.Scanner;
    2. public class Main {
    3. public static void main(String[] args) throws Exception {
    4. Scanner scanner = new Scanner(System.in);
    5. while (scanner.hasNext()) {
    6. String className = scanner.next();
    7. // print就是需要你定义的方法
    8. print(Class.forName(className).newInstance());
    9. }
    10. }
    11. //write your code here......
    12. //public static void print(Object obj){
    13. //System.out.println(obj.getClass().getName());
    14. //}
    15. public static void print(Object obj){
    16. System.out.println(obj.toString());
    17. }
    18. }
    19. class First {
    20. public String toString() {
    21. return "First";
    22. }
    23. }
    24. class Second {
    25. public String toString() {
    26. return "Second";
    27. }
    28. }
    29. class Third {
    30. public String toString() {
    31. return "Third";
    32. }
    33. }

    类型判断 

    描述

    父类Base有两个子类:Sub1、Sub2,现有一个方法getClassName(),要求传入Base类型的实例,在方法内部判定其具体的类型,返回的是类型的简单名字(不含包名),请补全getClassName()方法的判断逻辑。

    输入描述:

    输入要实例化的类名:Base、Sub1、Sub2 三者之一。

    输出描述:

    返回实例的实际类名(简化类名,不包含包的名字)。

     

    题解:

    方法:这道题要求的是方法中返回实例的具体类型,传入的是一个实例,我们对这个实例调用getClass().getName()即可,直接返回,没什么好说的。 

    1. import java.util.Scanner;
    2. public class Main {
    3. public static void main(String[] args) throws Exception {
    4. Scanner scanner = new Scanner(System.in);
    5. while (scanner.hasNext()) {
    6. String className = scanner.next();
    7. Base obj = (Base) Class.forName(className).newInstance();
    8. System.out.println(getClassName(obj));
    9. }
    10. }
    11. public static String getClassName(Base obj) {
    12. //write your code here......
    13. return obj.getClass().getName();
    14. }
    15. }
    16. class Base {
    17. }
    18. class Sub1 extends Base {
    19. }
    20. class Sub2 extends Base {
    21. }

    实现抽象方法

    描述

    已知抽象类Base中定义了calculate方法,该方法的计算过程依赖于sum()和avg(),而后两个方法均为抽象方法。要求定义Base的子类Sub类,并实现父类的抽象方法,使得main函数中的运算逻辑得以正确执行。

    输入描述:

    两个整数

    输出描述:

    两个整数的和除以两个整数的平均值(平均值为int类型,不考虑小数问题)

     题解:

    考验对方法的重写,然后调用父类的方法去实现题目的需求而已

    1. import java.util.Scanner;
    2. public class Main {
    3. public static void main(String[] args) {
    4. // Sub是需要你定义的子类
    5. Base base = new Sub();
    6. Scanner scanner = new Scanner(System.in);
    7. while (scanner.hasNextInt()) {
    8. int x = scanner.nextInt();
    9. int y = scanner.nextInt();
    10. base.setX(x);
    11. base.setY(y);
    12. System.out.println(base.calculate());
    13. }
    14. }
    15. }
    16. abstract class Base {
    17. private int x;
    18. private int y;
    19. public int getX() {
    20. return x;
    21. }
    22. public void setX(int x) {
    23. this.x = x;
    24. }
    25. public int getY() {
    26. return y;
    27. }
    28. public void setY(int y) {
    29. this.y = y;
    30. }
    31. public int calculate() {
    32. if (avg() == 0) {
    33. return 0;
    34. } else {
    35. return sum() / avg();
    36. }
    37. }
    38. /**
    39. * 返回x和y的和
    40. */
    41. public abstract int sum();
    42. /**
    43. * 返回x和y的平均值
    44. */
    45. public abstract int avg();
    46. }
    47. class Sub extends Base {
    48. //write your code here......
    49. public int sum(){
    50. return super.getX()+super.getY();
    51. }
    52. public int avg(){
    53. return sum()/2;
    54. }
    55. }

    实现接口

    描述

    已知接口Comparator,内部定义了max函数,用于返回两个整数中的最大值。请定义该接口的实现类,使得main方法中的比较逻辑可以正确执行,要求实现类的名称为ComparatorImpl。

    输入描述:

    两个整数

    输出描述:

    两个整数中的最大值

    题解:

    主要考虑对ComparatorImpl实现类重写max方法,注意:接口是用来被实现(implements)的,实现接口的类称为实现类

    1. import java.util.Scanner;
    2. public class Main {
    3. public static void main(String[] args) {
    4. Comparator comparator = new ComparatorImpl();
    5. Scanner scanner = new Scanner(System.in);
    6. while (scanner.hasNextInt()) {
    7. int x = scanner.nextInt();
    8. int y = scanner.nextInt();
    9. System.out.println(comparator.max(x, y));
    10. }
    11. }
    12. }
    13. interface Comparator {
    14. /**
    15. * 返回两个整数中的最大值
    16. */
    17. int max(int x, int y);
    18. }
    19. class ComparatorImpl implements Comparator{
    20. public int max(int x,int y){
    21. return x>y?x:y;
    22. }
    23. }

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

  • 相关阅读:
    众焱公司网络平台建设-传输网的规划与设计
    前端开发:CSS阴影效果属性box-shadow详解
    轻松学会jQuery选择器的用法
    大厂秋招真题【DP/贪心】字节跳动20230923秋招T1-小红的 01 串【欧弟算法】全网最全大厂秋招题解
    举个栗子!Tableau 技巧(236):创建简单的参数样式
    android log能在release包里面打印吗
    测试工具链
    大豆耐涝的秘密
    【UVM基础】m_sequencer 和 p_sequencer
    Jtti:linux vim中文乱码如何解决
  • 原文地址:https://blog.csdn.net/m0_67995737/article/details/126582816