对于“定义打印方法”这道题来说不难理解,但对于解析中的“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.print(obj.toString());
}
}
class First {
public String toString() {
return "First";
}
}
class Second {
public String toString() {
return "Second";
}
}
class Third {
public String toString() {
return "Third";
}
}
题干解读 (关于参数)
说明这个“print”方法的参数是一个实例化对象,例如:
First f = new First();
print(f);
所以“Class.forName(className).newInstance()”这个语句的作用我们就可以知道了——是为了获取一个类的实例化对象
为什么要这么写?
但是为什么要这么写呢?你既然只是要求“类的实例化对象”,那我直接传参“classname”不可以吗?——而且这样写代码是可以通过的
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String className = scanner.next();
print(className);
// print(Class.forName(className).newInstance());
break;
}
}
public static void print(Object obj) {
System.out.print(obj.toString());
}
}
但是“123”不是一个引用类型——注意题目“...引用类型的参数...”。虽然这么写在牛客网上能编译通过,但是在idea上是没办法通过的
为什么会这样呢?这就关系到这面文章的中心了——print(Class.forName(className).newInstance())是个什么东西?
Class.forName(className).newInstance()是个什么东西?
Class与class
- class是一个关键字,在声明java类时使用。是对对象的抽象与集合。class实例化得到对象
- Class是一个类。Class 没有公共构造方法,只能在载入类时由Java 虚拟机以及通过调用类载入器中的 defineClass 方法自己主动构造的。Class实例化得到类
关于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对象”
————————————————
原文链接:https://blog.csdn.net/mocas_wang/article/details/107428506
.forName和.newInstance
.forName是Class中的一个方法,用于获得一个Class对象(获得一个类)
Class c = Class.forName("类的名字")//这里forName方法的参数是String类型
.newInstance也是Class中的一个方法,用于为一个类创建一个实例。用途相当于new(但是与new不同,只是效果相同。详情自行了解)效果等同于:
Cat dog = new Cat;
于是Class.forName(className).newInstance()的意思就是:获得“className”的类并为这个类实例化一个对象。
比如除了题上给出的“First”、“Second”、“Third”,我们还有一个类——“DZ”,我们输入“DZ”,程序仍然可以运行:
import java.util.Scanner;
public class Test2 {
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());
break;
}
}
public static void print(Object obj) {
System.out.print(obj.toString());
}
}
class First {
public String toString() {
return "First";
}
}
class Second {
public String toString() {
return "Second";
}
}
class Third {
public String toString() {
return "Third";
}
}
class DZ{
public String toString(){
return "一眼顶针";
}
}
证毕