题解 | #定义打印方法#5.9-多态性和class类的复习

定义打印方法

https://www.nowcoder.com/practice/50b50ae39d65415a9fd70601d711e5af

import java.util.Scanner;

// 多态性,是子类的对象赋给了父类的引用,使用的前提是有继承关系、有方法的重写
// 本题中的三个类都重写了toString()方法
// 那么很显然,需要找到一个类,是本题中三个类的共同父类,又有toString()方法
// 并且有forName()方法和newInstance()方法,以便在第10行的print()中能传入一个对象
// 不用想了,平时就是用 Object类,它是所有类的父类,又拥有各种各样的方法

// 找到该类以后,把这个类的对象作为参数传给print(),也就是“父类的引用”,
// 并且在方法体中应用上三个子类都重写了的方法来实现需求
// 这样,在Class.forName(className).newInstance()时,
// 就会帮助创建出“子类的对象”
//
// 从而实现“父类的引用指向子类的对象”,即多态性

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());
        }
    }
//     class是一个关键字,在声明java类时使用。是对对象的抽象与集合。class实例化得到对象
// Class是一个类。Class 没有公共构造方法,只能在载入类时由Java 虚拟机以及通过调用类载入器中的 defineClass 方法自己主动构造的。Class实例化得到类

// “在Java中每个类都有且只有一个Class对象。

// Class类被创建后的对象就是Class对象,注意,Class对象表示的是自己手动编写类的类型信息。比如创建一个Shapes类,那么,JVM就会创建一个Shapes对应Class类的Class对象,该Class对象保存了Shapes类相关的类型信息。

// 实际上在Java中每个类都有一个Class对象,每当我们编写并且编译一个新创建的类就会产生一个对应Class对象并且这个Class对象会被保存在同名.class文件里(编译后的字节码文件保存的就是Class对象),那为什么需要这样一个Class对象呢?

// 是这样的,当我们new一个新对象或者引用静态成员变量时,Java虚拟机(JVM)中的类加载器子系统会将对应Class对象加载到JVM中,然后JVM再根据这个类型信息相关的Class对象创建我们需要实例对象或者提供静态变量的引用值。需要特别注意的是,手动编写的每个class类,无论创建多少个实例对象,在JVM中都只有一个Class对象,即在内存中每个类有且只有一个相对应的Class对象”
// ————————————————

//                             版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

// 原文链接:https://blog.csdn.net/From_C/article/details/132413027

// forName和.newInstance
// .forName是Class中的一个方法,用于获得一个Class对象(获得一个类)

// Class c = Class.forName("类的名字")//这里forName方法的参数是String类型
//  .newInstance也是Class中的一个方法,用于为一个类创建一个实例。用途相当于new(但是与new不同,只是效果相同。详情自行了解)效果等同于:

// Cat dog = new Cat;

//  于是Class.forName(className).newInstance()的意思就是:获得“className”的类并为这个类实例化一个对象。
// ————————————————


    //write your code here......
    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";
    }
}

全部评论

相关推荐

面了100年面试不知...:今年白菜这么多,冬天可以狂吃了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务