import java.util.HashSet;
 import java.util.Iterator;

 /**
  * Created by GOD on 2016/1/23.
  * Class对象的生成方式如下:
  1.类名.class           说明: JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象
  2.Class.forName("类名字符串")  (注:类名字符串是包名+类名)  说明:装入类,并做类的静态初始化,返回Class的对象
  3.实例对象.getClass()  说明:对类进行静态初始化、非静态初始化;返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象
  */
 public class ClassAndGetclass {
     public static void main(String[] args) throws ClassNotFoundException {

 //测试.class
         Class testTypeClass = TestClassType.class;
         System.out.println("testTypeClass---" + testTypeClass);
         System.out.println("类装入内存完毕");

 //测试Class.forName()
         Class testTypeForName = Class.forName("TestClassType");
         System.out.println("testTypeForName---" + testTypeForName);

 //测试Object.getClass()
         TestClassType testTypeGetClass = new TestClassType();
         System.out.println("testTypeGetClass---" + testTypeGetClass.getClass());

         HashSet hashSet = new HashSet();
         hashSet.add("s");
         Iterator iterator = hashSet.iterator();
         System.out.println(iterator.getClass().getName());
         System.out.println(Iterator.class.getName());

     }
 }

 class TestClassType {
 //构造函数
     public TestClassType() {
         System.out.println("----构造函数---");
     }
 //静态的参数初始化
     static {
         System.out.println("---静态的参数初始化---");
     }
 //非静态的参数初始化
     {
         System.out.println("----非静态的参数初始化---");
     }
 }

输出结果:

testTypeClass---class TestClassType
类装入内存完毕
---静态的参数初始化---
testTypeForName---class TestClassType
----非静态的参数初始化---
----构造函数---
testTypeGetClass---class TestClassType
java.util.HashMap$KeyIterator
java.util.Iterator

生成Class对象的过程其实是如此的:

当 我们编写一个新的java类时,JVM就会帮我们编译成class对象,存放在同名的.class文件中。在运行时,当需要生成这个类的对象,JVM就会 检查此类是否已经装载内存中。若是没有装载,则把.class文件装入到内存中。若是装载,则根据class文件生成实例对象。


 import java.util.*;
 import java.lang.reflect.*;

 public class CSDN {
     public static void main(String args[]) throws Exception{
         Set s = new HashSet();
         s.add("foo");
         Iterator it = s.iterator();
         Class[] argsClass = new Class[0];
         Method m = Iterator.class.getMethod("hasNext",argsClass);
         System.out.println(m.invoke(it,argsClass));
     }
 }//可正常执行
 import java.util.*;
 import java.lang.reflect.*;

 public class CSDN {
     public static void main(String args[]) throws Exception{
         Set s = new HashSet();
         s.add("foo");
         Iterator it = s.iterator();
         Class[] argsClass = new Class[0];
         Method m = it.getClass().getMethod("hasNext",argsClass);
         System.out.println(m.invoke(it,argsClass));
     }
 }
 //不能执行

理由同上: System.out.println(iterator.getClass().getName());  java.util.HashMap$KeyIterator

     System.out.println(Iterator.class.getName());       java.util.Iterator

java中类名.class、实例.getclass()区别的更多相关文章

  1. java中extends与implements的区别

    学了java很久了,久不用之后给同学解决一个java问题的时候,就卡在这个标题上了. 下面是java中extends与implements的区别: 1. 在类的声明中,通过关键字extends来创建一 ...

  2. 转:Java中abstract和interface的区别

    转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...

  3. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  4. java中堆和堆栈的区别

    java中堆和堆栈的区别(一) 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取 ...

  5. 关于java中构造方法、实例初始化、静态初始化执行顺序

    在Java笔试中,构造方法.实例初始化.静态初始化执行顺序,是一个经常被考察的知识点. 像下面的这道题(刚刚刷题做到,虽然做对了,但是还是想整理一下) 运行下面的代码,输出的结果是... class ...

  6. java中wait和sleep的区别

    文章目录 Wait和sleep的区别 唤醒wait和sleep java中wait和sleep的区别 在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别.并讨论一下怎么使用 ...

  7. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

  8. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  9. Java中this与super的区别【6】

    若有不正之处,请多多谅解并欢迎批评指正,不甚感激.请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ ...

  10. Java中堆和栈的区别(转)

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.      Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...

随机推荐

  1. Backup: Numbers in Perl6

    Perl6 is a new language, not a improved version of Perl5. Perl6 inherits many good features from man ...

  2. android listview万能适配器

    参考    Android 快速开发系列 打造万能的ListView GridView 适配器 Hongyang public class CommonViewHolder { private Con ...

  3. 怎么使用Docker搭建PHP开发环境呢?

    在Docker流行之前,要搭建开发环境通常有两种选择:一种是使用wamp.xampp.mamp等集成开发环境安装包,另外一种就是使用普通虚拟机来安装linux服务器,然后通过下载一键安装包(如:lnm ...

  4. require()与 require_once()、 include与include_once()

  5. symfony中twig的流程控制if,for用法

    流程控制 if 语句 if语句在twig中的作用如同if语句在PHP中的一样.1.你可以通过下面这个简单的例子来判断表达式的结果是否正确. {% if online == false %} <p ...

  6. java面试每日一题13

    题目:有一个分数数列2/1.3/2.5/3.8/5.13/8........求出这个数列的前20项之和.运行结果如下32.660263 public class Page80 { /** * * @p ...

  7. a different object with the same identifier,同一个session中存在不同的对象问题

    使用hibernate的函数 session.merge()函数,提交处于游离态的对象. merge在执行更新之前会将两个标识符相同的对象进行合并,具体合并的方向是向exituser2合并.

  8. java中+的使用

    在java中+可以做为连接符和运算符两种使用方法 例如: 代码: int X=100; int Y=200; System.out.println("X+Y="  +  (X +  ...

  9. linux ubuntu12.04 解压中文zip文件,解压之后乱码

    在windows下压缩后的zip包,在ubuntu下解压后显示为乱码问题 1.zip文件解压之后文件名乱码: 第一步 首先安装7zip和convmv(如果之前没有安装的话) 在命令行执行安装命令如下: ...

  10. json返回日期格式化的解决

    function jsonDateFormat(jsonDate) {//json日期格式转换为正常格式 try { var date = new Date(parseInt(jsonDate.rep ...