`

java中的Class对象、new关键字

阅读更多
 public class TestClass {
	public static void main(String[] args) {
		try {
			// 测试Class.forName()
			Class testTypeForName = Class.forName("TestClassType");
			System.out.println("testForName--" + testTypeForName);
			// 测试类名。class
			Class testTypeClass = TestClassType.class;
			System.out.println("testTypeClass--" + testTypeClass);
			// 测试Object.getClass()
			TestClassType testGetClass = new TestClassType();
			System.out.println("testGetClass--" + testGetClass.getClass());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}
class TestClassType {
	// 构造函数
	public TestClassType() {
		System.out.println("--构造函数--");
	}
	// 静态的参数初始化
	static {
		System.out.println("--静态的参数初始化--");
	}
	// 非静态的参数初始化
	{
		System.out.println("--非静态的参数初始化--");
	}
} 

输出结果为:

  ——静态的参数初始化——
testForName——class TestClassType
testTypeClass——class TestClassType
——非静态的参数初始化——
——构造函数——
testGetClass——class TestClassType

 

------------------------------------ 介  绍------------------------------------------------ 

java.lang.Class

Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。
虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。
每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。

Class.forName与new

Class.forName(xxx.xx.xx) 返回的是一个类

首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。 
至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。 
A a = (A)Class.forName("pacage.A").newInstance(); 
这和你 
A a = new A(); 
是一样的效果。 

jvm会执行静态代码段,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。

Class.forName(xxx.xx.xx) 返回的是一个类 
Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段

动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象 
String str = 用户输入的字符串 
Class t = Class.forName(str); 
t.newInstance();

 在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。 

Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如: 
class c = Class.forName(“Example”); 
factory = (ExampleInterface)c.newInstance(); 

其中ExampleInterface是Example的接口,可以写成如下形式: 
String className = "Example"; 
class c = Class.forName(className); 
factory = (ExampleInterface)c.newInstance(); 

进一步可以写成如下形式: 
String className = readfromXMlConfig;//从xml 配置文件中获得字符串 
class c = Class.forName(className); 
factory = (ExampleInterface)c.newInstance(); 

上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。 

从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载java API的那个加载器。 

现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。 

最后用最简单的描述来区分new关键字和newInstance()方法的区别: 
newInstance: 弱类型。低效率。只能调用无参构造。 
new: 强类型。相对高效。能调用任何public构造。

 

.class与getClass()

.class其实是在java运行时就加载进去的

getClass()是运行程序时动态加载的

public class ExtendClass extends Baseclass {
	private String width;
	public String getWidth() {
		return width;
	}
	public void setWidth(String width) {
		this.width = width;
	}
	public static void main(String[] arg0) {
		Baseclass baseclass1 = new ExtendClass();
		Baseclass baseclass2 = new Baseclass();
		System.out.println(baseclass1.getClass().getSimpleName());// 实际运行的是继承类Extendclass
		System.out.println(baseclass2.getClass().getSimpleName());// 实际运行的是Baseclass
		System.out.println(Baseclass.class.getSimpleName());// 加载时类名
		System.out.println(ExtendClass.class.getSimpleName());// 加载时类名
	}
}
class Baseclass {
	private String height;
	public String getHeight() {
		return height;
	}
	public void setHeight(String height) {
		this.height = height;
	}
}

 执行结果为:

ExtendClass
Baseclass
Baseclass
ExtendClass

分享到:
评论

相关推荐

    new关键字和newInstance() 的区分

    Java 中的 new 关键字和 newInstance() 方法都是用于创建对象的,但是它们之间有着本质的区别。理解这两者的区别对于 Java 编程尤其重要。 首先,new 关键字是 Java 的一个保留字,用于创建一个新的对象。例如,`A ...

    java中带有this关键字的程序内存分析

    当使用`new`关键字创建一个对象时,该对象会分配在堆内存中。所有实例变量都存储在对象所在的堆内存中,包括`this`关键字引用的实例变量。 - **方法区**:也被称为永久代,存储了类的元数据,如类名、方法信息等。...

    Java中Class对象详解共2页.pdf.zip

    这份"Java中Class对象详解共2页.pdf.zip"文件虽然只有短短两页,但预计会涵盖Class对象的基本概念、获取Class对象的方式、以及如何使用Class对象进行反射操作等关键内容。 首先,理解Class对象的基本概念至关重要。...

    Java中new的用法.pdf

    在Java语言中,new关键字是面向对象编程的核心之一,它主要用于创建对象实例。本文将详细解释在Java中new关键字的各种用法,并结合示例代码进行阐述。 1. 基本对象的创建: 使用new关键字可以创建任何类的新实例。...

    java中的关键字大全

    ### Java中的关键字大全 在Java编程语言中,关键字是一组预定义的词汇,它们具有特殊的含义和用途。理解和掌握这些关键字对于编写有效的Java程序至关重要。本文将详细介绍Java中的一些核心关键字,并提供相应的解释...

    JAVA中的保留关键字

    ### JAVA中的保留关键字 在Java编程语言中,关键字与保留关键字是极其重要的组成部分,它们定义了语言的基本结构和语法规则。对于初学者来说,熟悉这些关键字对于理解和编写正确的Java程序至关重要。 #### 关键字...

    newInstance()方法和new关键字

    - **new关键字**:这是Java中的一个保留关键字,用于创建新对象。它会分配内存空间,并调用相应的构造函数初始化新对象。 #### 2. 实现机制 - **newInstance()方法**: - 通过调用类的无参构造函数来创建新对象。...

    java关键字总结文档

    在Java中,关键字具有特殊的语法含义,不能用作标识符(例如变量名或方法名)。以下是对给定文件中提到的Java关键字进行的详细解释与总结: #### 1. `abstract` - **用途**:`abstract`关键字用于声明抽象类或抽象...

    浅析Java中的 new 关键字

    Java中的`new`关键字是创建和初始化对象的关键操作,它在编程中扮演着至关重要的角色。当我们使用`new`关键字时,实际上是执行了以下几个步骤: 1. 分配内存:Java虚拟机(JVM)在堆内存中为新对象分配所需的空间。...

    Java关键字分类解释

    - **class**: 在Java中,`class`关键字用于声明一个类。类是面向对象编程的基本单元,它定义了一组属性(成员变量)和方法(成员函数),这些共同构成了一个特定类型的对象。例如: ```java public class Person ...

    java实现根据关键字查找所在文件夹的文件

    在Java编程语言中,实现根据关键字查找文件夹内包含该关键字的文件是一项常见的任务,尤其在数据处理、日志分析或者文件管理系统中。这个功能可以帮助用户快速定位到含有特定信息的文件,提高工作效率。以下是一个...

    java中的50个关键字.docx

    ### Java中的50个关键字详解 #### 一、引言 Java作为一种广泛使用的编程语言,在其语法体系中定义了一系列关键字,这些关键字具有特定的意义和用途,对于理解和编写Java程序至关重要。本文将详细介绍Java中与数据...

    java具体关键字和用法

    `transient` 是 Java 中的一个关键字,用于标记对象中不应该被序列化的字段。例如: ```java public class SerializableObject implements Serializable { private transient int id; } ``` ### 31. Try `try` ...

    源码关键字统计.rar

    在Java编程语言中,关键字是预定义的、具有特殊含义的词汇,它们是构成程序语法结构的基础元素。这篇关于“源码关键字统计”的主题旨在分析Java源代码文件,并计算其中出现的关键字数量。这个任务涉及到文件读取、...

    java中“53”个关键字(含2个保留字)

    在Java编程语言中,关键字是具有特殊含义的预定义标识符,它们被Java解析器用来识别语法结构。这些关键字不能用作变量名、类名或方法名。在Java中,一共有53个关键字,包括两个保留字。下面将详细阐述这些关键字的...

    Java中new的用法[参考].pdf

    在 Java 中,有两种创建对象的方式:使用 new 关键字和使用 newInstance() 方法。 * 使用 new 关键字创建对象:例如 `String sName = new String();` * 使用 newInstance() 方法创建对象:例如 `factory = ...

    电子教材:《Java语言程序设计-关键字》pdf版(高清晰)

    根据《Java语言程序设计-关键字》pdf版电子教材,下面列出了Java语言中的所有关键字及其简要解释: 1. **abstract** - 表示抽象类或抽象方法,抽象类不能被实例化,只能通过继承的方式实现其具体功能。 2. **...

    Java基础之关键字_Java基础之关键字_源码

    在编程语言的学习中,了解和掌握关键字是至关重要的一步,特别是在Java这种强类型的语言中。本文将深入探讨Java中的关键字,这些关键字是Java语法结构的基础,它们被Java编译器特殊处理,有着特定的含义和功能。 ...

    Java关键字

    在Java中,一共有51个关键字(包括保留字),但描述中提到的是48个,可能是因为某些关键字在特定上下文不常用或者被归类到保留字中。下面将详细介绍这些关键字及其用途。 1. **abstract** - 用于声明抽象类或抽象...

    浅谈Java编程中的synthetic关键字

    浅谈Java编程中的synthetic关键字 synthetic关键字是Java编程中的一种特殊关键字,用于标记Java虚拟机(JVM)生成的类成员,而不是在源代码中显式定义的。这些类成员包括字段和方法,它们是JVM为了实现某些语言特性...

Global site tag (gtag.js) - Google Analytics