牛客网习题:“定义打印方法”中“Class.forName(className).newInstance()”的语句解析

对于“定义打印方法”这道题来说不难理解,但对于解析中的“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 "一眼顶针";
    }
}

 证毕

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值