Java Class 与 Object
平时看代码时,总是碰到这些即熟悉又陌生的名次,每天都与他们相见,但见面后又似曾没有任何的交集,所以今天我就来认识下这两个江湖侠客的背景:
CLASS
在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息
获取Class实例的三种方式:
(1)利用对象调用getClass()方法获取该对象的Class实例;
(2)使用Class类的静态方法forName(),用类的名字获取一个Class实例(staticClass forName(String className) Returns the Classobject associated with the class or interface with the given stringname. );
(3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例
在newInstance()调用类中缺省的构造方法 ObjectnewInstance()(可在不知该类的名字的时候,常见这个类的实例) Creates a new instance of the class represented by this Classobject.
在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象
Class对象的生成方式如下:
1.Class.forName("类名字符串") (注意:类名字符串必须是全称,包名+类名);
2.类名.class;
3.实例对象.getClass();
package baseJava;
public class TestClass {
/**
  * @param args
  * 2013-4-11 上午10:30:05
  * @author zhao_xingcai
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  try {
  
   //测试Class.forName()  
   Class classForName = Class.forName("baseJava.TestClass");
   System.out.println("classForName  : [" + classForName + "]");
   
   //测试类名.class
   Class classForName2 = TestClass.class;
   System.out.println("classForName2 : [" + classForName2 + "]");
   
   //测试Object.getClass() 
   TestClass newInstance = new TestClass();
   System.out.println("newInstance   : [" + newInstance.getClass() + "]");
   
   //hashCode指的是内存的地址
   System.out.println("newInstanceHashCode   : [" + newInstance.hashCode() + "]");
   
   //toString代表该对象的一个字符串
   //格式:this.getClass().getName() + '@' + Integer.toHexString(hashCode())
   System.out.println("newInstanceToString   : [" + newInstance.toString() + "]");
   
   
  }catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }
 /*
  * 构造函数
  */
 public TestClass() {
  System.out.println(" 构造函数");
 }
 
 /*
  * 静态的参数初始化  
  */
 static {
  System.out.println("静态的参数初始化  ");
 }
 
 /*
  * 非静态的参数初始化  
  */
 {
  System.out.println("非静态的参数初始化  ");
 }
}
运行结果如下:
静态的参数初始化
classForName : [class baseJava.TestClass]
classForName2 : [class baseJava.TestClass]
非静态的参数初始化
构造函数
newInstance : [class baseJava.TestClass]
newInstanceHashCode : [12677476]
newInstanceToString : [baseJava.TestClass@c17164]
也就是说:
三种方法生成CLASS对象是一样的,因为CLASS在JVM的名称是一样的,但是三种生成的方法略有不同:静态的方法属性初始化,是在加载类的时
候初始化。而非静态方法属性初始化,是new类实例对象的时候加载。当我们编写一个新的JAVA类时,JVM就会帮我们编译成CLASS对象,存放在同名
的.class文件中,在运行时,当需要生成这个类的对象时,JVM就会检查此类是否装载到内存中,会没有装载,就把.class装载到内存中,若装载
过,则根据.class生成对象。
Java Class 与 Object的更多相关文章
- Java unserialize serialized Object(AnnotationInvocationHandler、ysoserial) In readObject() LeadTo InvokerTransformer(Evil MethodName/Args)
		Java unserialize serialized Object(AnnotationInvocationHandler.ysoserial) In readObject() LeadTo Tra ... 
- QVariant(相当于是Java里面的Object,起到一个数据类型“擦除”的作用,可以使用Q_DECLARE_METATYPE进行注册)
		=QVariant= [%这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是 ... 
- java.lang.IllegalArgumentException: object is not an instance of declaring class
		今天在使用反射的时候,出现了java.lang.IllegalArgumentException: object is not an instance of declaring class错误-具体是 ... 
- Java根类Object的方法说明
		Java中的Object类是所有类的父类,它提供了以下11个方法: public final native Class<?> getClass() public native int ha ... 
- Java不定参数Object… obj 和 Object[] 的区别
		Java不定参数Object… obj 和 Object[] 的区别 简述: java中方法重载可以实现参数不同自动匹配对应方法.但现实中也存在这种问题.普通传参对于形如下面的方法,却显得臃肿而失优雅 ... 
- 报错:java.lang.IllegalArgumentException: object is not an instance of declaring class
		反射的报错信息如下: java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.r ... 
- Java学习笔记二十四:Java中的Object类
		Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ... 
- java中的object... args参数
		关于java方法中Object... args参数的含义 在阅读google发布的volley源码时,突然看到一个方法中存在这样的写法,如 :v(String format, Object... ar ... 
- Java class、Object、Class 的区别
		Java的对象模型中: 所有的类都是Class类的实例,Object是类,那么Object也是Class类的一个实例. 所有的类都最终继承自Object类,Class是类,那么Class也继承自Obj ... 
- 使用一个数组存储一个英文句子"java is an object oriented programing language"
		class fun { public static void main(String[] args) { String str="java is an object oriented pro ... 
随机推荐
- shell中字符串基本用法
			前言 今天在写脚本时,发现前阶段使用过的一些用法还是需要去百度查找,并且找到的答案还需要自己去筛选,耽误写脚本时间,这一篇对字符串之间的比较和逻辑判断都非常详细,借鉴他人之作,资源共享. 本片主要说明 ... 
- Bzoj 1081 [Ahoi2009] chess 中国象棋
			bzoj 1081 [Ahoi2009] chess 中国象棋 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1801 状态比较难设,的确 ... 
- node 发送邮件demo  (QQ邮箱)
			nodemailer是nodejs中的邮件发送模块,本文使用的版本为2.5.0 --下载模块 npm install nodemailer npm下载模块后,在项目中引入就可以使用: var node ... 
- Centos7多内核情况下修改默认启动内核方法
			1.1 进入grub.cfg配置文件存放目录/boot/grub2/并备份grub.cfg配置文件 [root@linux-node1 ~]# cd /boot/grub2/ [root@linux ... 
- 短信验证码js
			var isSmsSend = false; function clickButtona(obj){ var obj = $(obj); var mobile=$("input[name=m ... 
- 基于django的个人博客网站建立(一)
			基于django的个人博客网站建立(一) 前言 网站效果可点击这里访问 之前基于hexo和github page搭建过一个博客网页,后来由于换了个系统,感觉弄的有点麻烦也就没有再去管它了,最近偶然从网 ... 
- mysql密码正确却提示错误, 不输入密码反而能登录
			今天部署阿里云服务器, 发现之前可以连接的mysql服务器突然连接不上了, 密码我确认是正确的,但登录时就是显示密码错误, 很崩溃, 差点气得我就想重装mysql了. 好在经过几番苦寻找到了以下能解决 ... 
- 2、大O表示法
			一.大O表示法 大O表示法不是一种算法.它是用来表示一个算法解决问题的速度的快慢.一般我们描述一件事情完成的快慢是用时间描述的,比如说我完成一道计算题用了多少分钟.但算法的运算是很难用准确的时间来描述 ... 
- Python 性能分析工具简介
			Table of Contents 1. 性能分析和调优工具简介 1.1. Context Manager 1.2. Decorator 1.3. 系统自带的time命令 1.4. python ti ... 
- RxJava Rxandroid retrofit
			其实Retrofit会了.集合RxJava,RxAndroid 就很简单了. 只需要改几个地方. 1.接口里面返回的对象不再是 call,而是Observable public interface A ... 
