不知道怎么讲,有点乱,希望前辈们耐心看完,并加以修正。
java中的类就是用户自定义的一种数据类型,及引用类型。我定义如下一个person类:
public class person{
public String name;
public String address;
public void test(){
System.out.println("test 方法");
}
public static void main(String args[]){
person p = new person();//这里p是一个实例对象,person是一个类(也就是用户自定义的数据类型)。这时p的类型就是person。(是不是这样,能不能这样讲????)
}
}
java中还有一个特殊的Class类,它同样继承与Object类,但它是所有java类的抽象。Class类的实例是由jvm生成的。它自己没有公共的构造方法。
参照上面的类,person.class类是Class类的一个实例,person.class这个对象它是person这个类在内存中的字节码,内容是person这个类的信息。那么person.class这个对象是person类数据类型这种说法对吗????
还有int到底是一种简单的数据类型呢还是一个类????
我觉得国内的书已经把"对象"这个词用泛滥了,而且这个词又会对初学者造成很大的迷惑。我用英文对照术语给你重新整理一下思路吧。
中文翻译--英文 术语对照
类--class
实例--instance
1.Person是一个类(class),p是一个实例(instance),p的类型是Person。
[code="java"]
public class Person{
...
}
Person p = new Person();
[/code]
注:Person是一个class,所有的class在定义的时候,第一个字母约定是要大写的哦。
2.关于Class这个类(class),为什么会有这个类呢?主要是因为在程序运行的时候我们需要知道一个实例的类型。如果你传一个实例p到方法中,但是我不知道这个p是什么类型啊,这时候就可以使用p.getClass()来获取p的类型啦。他是等同于Person.class
[code="java"]
public void test(Object p){
Class clazz=p.getClass();
//等同于Class clazz=Person.class;这里的clazz当然也是个instance啦。
}
[/code]
所以Class和Person都是类(class)哦,都是继承java.lang.Object的。
3.关于int类型。我们称它为primitive type,中文通常将其翻译为原始类型或者是基本类型。很明显他不是一个类(class)啦(你可以试试看,它能调出方法么?)。但是有一个类java.lang.Integer可以用来代替它,Integer类可是有方法的。
[code="java"]
int i1=10;//i1是个实例,是基本类型
Integer i2=new Integer(10);//i2是个实例,是类(class) 类型,这个市JDK4或以下的写法
Integer i3=Integer.valueOf(10);//这个是JDK5或以上的写法
[/code]
我好像都没有在上文用到"对象"这个词吧,因为很多时候这个对象意义模糊不清,有时候指的是instance,有时候又指class,真是让人迷惑.
int是基本数据类型,integer是int的封装类。
Class是一个类,persion.class是Class类型的对象,也可以说是一个实例。
Class这个类跟java的反射机制有关系,给你一个例子:
[code="java"]public static void test2(){
try {
Class<?> c = Class.forName("java.util.Date");
//反射类的方法:
Method m = c.getMethod("getTime", new Class<?>[]{});
long l =(Long)m.invoke(c.newInstance(), new Object[]{});
System.out.println(l);
//反射一个类的实例:
Date d = (Date)c.newInstance();
System.out.println(d.getTime());
} catch (Exception e) {}
}[/code]
person.class这个对象是person类数据类型这种说法对吗?错。
person 是Person类型的对象。
而person.class 是Class类型的对象。
JVM运行建立每一个对象的时候,都会为这些对象保留运行时的状态。当我们想在运行过程中使用这些状态信息的时候,就可以使用Class类了。
比如,我们创建了一个 Date d=new Date();对象。然后我们想在运行中得到d对象的运行状态,这时候我们就用Class cd=Class.forName("java.util.Date");再调用Class类中的方法得到这些信息。