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. word2007里插入分节符

    1.打开Word文档,将鼠标定位到需要插入分页符的位置(比如第2页的末尾处),切换到"页面布局"功能区. 2.在"页面设置"分组中单击"分隔符&quo ...

  2. Base Enum Properties [AX 2012]

    Base Enum Properties [AX 2012] This topic has not yet been rated - Rate this topic Updated: December ...

  3. iOS 处理多个网络请求的并发的情况

    如何处理多个网络请求的并发的情况 一.概念 1.并发 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配 ...

  4. HDU 5795:A Simple Nim(博弈)

    http://acm.hdu.edu.cn/showproblem.php?pid=5795 A Simple Nim Problem Description   Two players take t ...

  5. POJ 2192 :Zipper(DP)

    http://poj.org/problem?id=2192 Zipper Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1 ...

  6. JAVA中int、String的类型相互转换

    int -> String int i=12345;String s="";第一种方法:s=i+"";第二种方法:s=String.valueOf(i); ...

  7. ACM题目————士兵杀敌(四)

    描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的 人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上, ...

  8. 山东理工大学第七届ACM校赛-学区房问题 分类: 比赛 2015-06-26 10:23 89人阅读 评论(0) 收藏

    Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 铁牌狗在学区B有一套面积为S1平方米的房子,现在他为了让后代进化成金牌狗,决定在学区A购 ...

  9. Linux 多线程应用中如何编写安全的信号处理函数

    http://blog.163.com/he_junwei/blog/static/1979376462014021105242552/ http://www.ibm.com/developerwor ...

  10. MUI 个推

    个推 四种消息模板(透传消息模板.点击通知打开网页模板.点击通知打开应用模板.点击通知栏弹框下载模版) 三种推送方式(对单个用户推送接口 | 对指定用户列表推送接口 | 对指定应用群推接口) 四种消息 ...