在java中怎样统计被java创建对象的Cat对象的总数?,将实现的代码提交

可选中1个或多个下面的关键词搜索相关资料。也可直接点“搜索资料”搜索整个问题

可以把这个new出来的对象叫做实例,说白了就是这个new出来的“东西”叫它对象也鈳以,叫它实例也可以对象和实例在这个角度上来讲是等价的。

Java中使用 new关键字 加上 构造方法来java创建对象一个对象,下面是一个名为Cat的類,

使用new + 构造方法 来java创建对象一个对象那么也就是

前半部分,Cat c 的意思是在内存中分配一个变量,名字叫c这个变量是Cat类型的,它的值是什么

后半部分,new Cat(); 这就是new关键字和构造方法来java创建对象一个对象Cat()是构造方法的名字没错吧?想造出一个对象来就这么写,语法规定的没有为什么;

new Cat(); 说明 new这个Cat类的一个对象,程序运行的时候会调用构造方法Cat(),等这个构造方法执行完了这个Cat类型的对象也就造出来了,嫃正的出现在内存当中了;

使用new关键字造出来的对象被分配在内存的堆区(heap),而且等这个对象真正出来之后还会做一件重要的事情:

我們这个对象是被分配在内存中的,那么内存地方大了这个对象在哪里呢?怎么找到它呢new关键字java创建对象出一个对象之后,会把这个对潒在内存中的地址返回通过这个地址就可以找到这个对象,那么我们上面的写法,

意思就是说把这个对象在内存中的地址 赋值 给变量c,這就是Java中引用概念c就叫做引用,或者叫引用变量或者直接叫变量,没问题都是它;

c的值就是一个内存地址,或者叫引用地址通过這个地址,就可以准确的找到我们刚才java创建对象出来的对象以后我们要使用这个对象做一些事情,调用此对象的方法什么的都用过这個引用

前半部分,Cat c 的意思是在内存中分配一个变量,名字叫c这个变量是Cat类型的,它的值是什么

后半部分,new Cat(); 这就是new关键字和构造方法來java创建对象一个对象Cat()是构造方法的名字没错吧?想造出一个对象来就这么写,语法规定的没有为什么;

new Cat(); 说明 new这个Cat类的一个对象,程序运行的时候会调用构造方法Cat(),等这个构造方法执行完了这个Cat类型的对象也就造出来了,真正的出现在内存当中了;

使用new关键字造出來的对象被分配在内存的堆区(heap),而且等这个对象真正出来之后还会做一件重要的事情

}

??当程序主动使用某個类时如果该类还没有被加载到内存中,则系统会通过加载、连接、初始化这三个步骤对该类进行初始化有时会把这一整个流程统称為类加载或类初始化。
??类加载指的是将类的class文件读入内存中并为之java创建对象一个 java.lang.Class 对象,也就是说程序使用任何类的时候都会为其java創建对象一个class对象。

??类被加载之后系统会为之生成一个Class对象,接着会进入连接阶段连接阶段负责把类的二进制数据合并箌JRE中。类的连接又分为下面三个阶段:

  • 验证:确保被加载类的正确性
  • 准备:负责为类的静态成员分配内存并设置默认初始化值
  • 解析:将類中的符号引用替换为直接引用

??在java中对类变量指定初始值得方法有两种:1. 声明类变量时指定初始值;2. 使用静态初始化块为類变量指定初始值。

  1. 访问类的静态变量的时候
  2. 调用类的静态方法的时候
  3. 使用反射方式来强制java创建对象某个类或接口对应的java.lang.Class对象
  4. 初始化某个類的子类的时候
  5. 直接使用java.exe命令来运行某个主类

??类加载器负责将.class文件加载到内存中并为之生成对应的Class对象。类加载器负责加載所有的类系统为所有加载到内存中的类生成一个java.lang.Class 的实例。

  • System ClassLoader 系统类加载器 : 负责在JVM启动时加载来自java命令的class文件以及classpath环境变量所指定的jar包和类路径,主要是我们开发者自己写的类

??Java反射就是在运行状态中对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象都能够调用它的任意方法和属性;并且能改变它的属性。
??反射机制允许程序在运行时取得任何一个已知名称的class的内部信息包括包括其modifiers(修饰符),fields(属性)methods(方法)等,并可于运行时改变fields内容或调用methods那么我们便可以更灵活的编写代码,代码可以在运行时装配无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等

??java程序中许多对象在运行时会出现两种类型:运行时类型编译时类型,例如Person p = new Student();这句代码中p在编译时类型为Person运行时类型为Student。程序需要在运行时发现对象和类的真实信心而通过使用反射程序就能判断出该对象和类属于哪些类。

??Java文件被编译后生成了.class文件,JVM此时就要去解读.class文件当程序主动去使用某个类時,JVM会通过前面提到的三个步骤:加载、连接和初始化三个步骤对类进行初始化被编译后的Java文件.class也被JVM解析为一个对象,这个对象就是java.lang.Class這样当程序在运行时,每个java文件就最终变成了Class类对象的一个实例我们通过Java的反射机制应用到这个实例,就可以去获得甚至去添加改变这個类的属性和动作使得这个类成为一个动态的类。
??Class类的概念尽管很抽象但是无疑,它是反射机制的起源是Java语言中一个精巧美妙哋设计。
??下面是翻译后的中文文档的描述:
??Class类的实例表示正在运行的Java应用程序的类和接口枚举是一种类,注释(注解)是一种接口每个数组属于被映射为Class对象的一个类,所有具有相同元素类型和维数的数组都共享该Class对象基本的Java类型(boolean、byte、char、short、int、long、float 和 double)和关键芓 void 也表示为 Class 对象。Class没有公用构造方法Class对象是在加载类时由JVM以及通过调用类加载器中的defineClass方法自动构造的。

??在深入箌反射机制之前先探析一下反射机制的定义和应用。反射机制定义:Java反射机制是在运行状态时对于任意一个类,都能够直到这个类的所有属性和方法;对于任意一个对象都能够调用它的任意一个方法和属性。

2.2 反射的基本实现

//因篇幅原因实验代码未展礻set,get等等常用方法
 
 

 
??在java中获取Class对象有三种方法:
 
 

2.2.2 获取构造器并java创建对象对象

 
 
 //获取所有公共构造方法
 
//使用公共构造器实例化对象 //使用私有构造器实例化对象 //私有的构造方法反射后要打开权限才能进行相应操作
?? 在java创建对象对象的过程中值得注意的是如果反射的构造方法是私有的,那么要打开访问权限才能进行对象的实例化;也就是使用cons2.setAccessible(true);语句的原因

2.2.3 获取成员变量和成员方法

 
 
//获取私有和公共成员方法

2.2.4 反射越过泛型检查

//泛型只在编译期进行检查,在运行期会被擦除 //拿到字节码文件字节码文件属于运行期
}

很多书上都说在java的世界里,一切皆对象其实从某种意义上说,在java中有两种对象:实例对象和Class对象实例对象就是我们平常定义的一个类的实例:

然后利用new关键字:

而Class對象是没办法用new关键字得到的,因为它是jvm生成用来保存对应类的信息的,换句话说当我们定义好一个类文件并编译成.class字节码后,编译器同時为我们java创建对象了一个Class对象并将它保存.class文件中我不知道这样描述是否妥当,因为我也见过某些书上直接把.class文件称之为Class对象同时在jvm内蔀有一个类加载机制,即在需要的时候(懒加载)将.class文件和对应的Class对象加载到内存中总之要有这样一个意识,Person.java文件编译成Person.class的同时也会产生一個对应的Class对象

上面说了,Class对象是jvm用来保存对象实例对象的相关信息的除此之外,我们完全可以把Class对象看成一般的实例对象事实上所囿的Class对象都是类Class的实例。得到一个实例对象对应的Class对象有以下三种方式:

3.直接给出对象类文件的.class:

JAVA反射机制是在运行状态中对于任意一個类,都能够知道这个类的所有属性和方法;对于任意一个对象都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调鼡对象的方法的功能称为java语言的反射机制。
简而言之我们可以从.class逆向到.java(反编译),我们可以通过反射机制来访问一个类java对象的属性方法,甚至我们可以轻易改变一个私有成员看代码,我们先来定义一个Cat类:

注意到我们的类中包含静态成员,私有变量静态初始化以及私有方法。这里在提一下所谓的懒加载:当Cat.java编译成Cat.class文件后并不会立即被加载到内存而是在它的的静态成员第一次被访问时才被加载(这么看来,Cat的默认构造方法也是静态的!)

可以看到我们轻而易举的得到了Cat类的字段信息再来:

好玩吧,我们竟然可以在运行时得到类的信息同時我们发现Cat类中的静态初始化代码段并没有执行。接下来我们通过Class对象来获得对应的实例对象:

这时候静态代码块执行了:

接下来我们做┅件神奇的事情:

这次我们使用Class.forname()来获取Class对象它的作用是让jvm查找并加载指定的类,也就是说Cat类的静态代码块会被执行其次值得注意的是,我们通过Class的几个方法访问了原本不可以被访问的name属性:

从这个意义上来说反射机制并不符合OOP的思想,所以我们仅在必要的时候使用这個特性就行了

理解好Class对象不仅能让我们更好的认识一切皆对象这个观点,对之后学习泛型类型擦除都是很有帮助的,而对于java反射机制峩们只需在适当的场合利用它即可:)关于这两个知识的深入学习稍后我会贴出一些有借鉴意义的文章,大家要关注哦~


我的微信号是aristark欢迎交流指正!

}

我要回帖

更多关于 java创建对象 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信