黑马程序员技术交流社区

标题: 关于类型问题 [打印本页]

作者: 黄玉昆    时间: 2013-2-11 19:01
标题: 关于类型问题
本帖最后由 黄玉昆 于 2013-2-12 22:29 编辑

看一下代码:比如有个Person类,创建一个对象
Person p = new Person("小明",19,"男");
对于这句代码,p的类型是Person类,这是没问题的。但是创建的这个对象,是什么类型呢?
或者说,对象有类型,是Person类型?还是说,对象是没有类型的,只是对基本类型以及字符串类型的这些数据进行封装而已?

作者: 刘明杰    时间: 2013-2-11 19:24
你这样是调用了这个有参的构造函数,这个构造函数内部肯定是定义了三个字段或者属性,内部字段或者属性定义什么类型这里就是什么类型了
作者: 黄玉昆    时间: 2013-2-11 19:41
刘明杰 发表于 2013-2-11 19:24
你这样是调用了这个有参的构造函数,这个构造函数内部肯定是定义了三个字段或者属性,内部字段或者属性定义 ...

可能刚才加了”小明“,有些误解。我的意思说这个对象是什么类型,不是说里面的每个属性是什么类型的。
作者: 刘明杰    时间: 2013-2-11 19:50
黄玉昆 发表于 2013-2-11 19:41
可能刚才加了”小明“,有些误解。我的意思说这个对象是什么类型,不是说里面的每个属性是什么类型的。 ...

对象p的类型不就是Person么, 类本身就是自定义的一种数据类型
作者: 黄玉昆    时间: 2013-2-11 20:07
刘明杰 发表于 2013-2-11 19:50
对象p的类型不就是Person么, 类本身就是自定义的一种数据类型

嗯,听你这么一说,我突然觉得:对象应该就是对象类型的,是一个自定义的封装数据的类型。
作者: 冯佩    时间: 2013-2-11 21:10
new Person()就是person类型的对象啊,对象可以由类的类型来区分,对象和类本身就是两种有联系但又完全不同的数据,就像代码中的p和new Person()的区别一样,P是Person类类型变量,new Person()是Person类对象,虽然它们都是Person类型,但它们不是Person类,对象就是对象,变量就是变量,类就是类,如果一定要给对象找个所属类型,那对象就是对象类型了,呵呵,不过一般不这么叫,一说对象,我们就明白它本身就是一类单独的事物了。
作者: 黄玉昆    时间: 2013-2-11 21:35
冯佩 发表于 2013-2-11 21:10
new Person()就是person类型的对象啊,对象可以由类的类型来区分,对象和类本身就是两种有联系但又完全不同 ...

说的很好,谢谢
作者: 冯佩    时间: 2013-2-11 22:42
黄玉昆 发表于 2013-2-11 21:35
说的很好,谢谢

都是互相学习,呵呵,相互探讨的越多,问题理解得越透彻。
作者: 汪平乐    时间: 2013-2-12 11:02
  1. class Person
  2. {
  3. private String name;
  4. private int age;
  5. private String sex;
  6. Person(String name, int age , String sex)
  7. {
  8. this.name = name;
  9. this.age = age;
  10. this.sex = sex;
  11. }
  12. public method()
  13. {
  14. System.out.println();
  15. }
  16. }
  17. class PersonDemo
  18. {
  19. public static void main(String[] args)
  20. {
  21. Person p = new Person("小明",19,"男");
  22. p.method();
  23. }
  24. }
复制代码
从代码中可以看出,p是堆内存中的变量,代表栈内存中的new Person()对象,诚如楼上兄台所言:“p是Person类类型变量,new Person()是Person类对象,虽然它们都是Person类型,但它们不是Person类,对象就是对象,变量就是变量,类就是类”。
作者: 王昕    时间: 2013-2-12 13:22
p是Person类型的引用变量,new Person();建立了一个Person类型的对象。所有类都是Object类的子类,都可以赋值给Object类型的引用。不过它本身还是个Person类型的对象,因为调用方法调用的都是Person覆盖过的方法。
可以 Object o = new Person(); 因为多态子类对象可以赋值给父类类型的引用嘛。不过这么做Person对象就失去了“人性”,o不能调用Person对象增加的方法了,只能调用在Object里已定义的方法,被子类覆盖过的方法调用的是继承树上离Person()最近的覆盖的方法。
对象建立之前会先把它这个继承树上所有父类的部分都建立起来,所以你建Person类的对象,最先运行结束的是Object类的构造函数。new Person();最后才建成的Person特有的部分,父类的部分先建好了才能有子类的部分。
比如Dog是Animal的子类,那new Dog();调用Dog构造函数的实际过程就是Dog的构造函数先调用Animal的构造函数,Animal的构造函数调用Object的构造函数,Object的构造函数运行完,Animal的构造函数再继续,运行完,最后是Dog构造函数的那部分。
作者: 杨志    时间: 2013-2-12 14:48
可以去看下反射! java中的类都是以字节码的形式加载进内存的。
所有的类都是Class的实例。
不知道你能不能听懂。
作者: 黄玉昆    时间: 2013-2-12 15:56
杨志 发表于 2013-2-12 14:48
可以去看下反射! java中的类都是以字节码的形式加载进内存的。
所有的类都是Class的实例。
不知道你能不能 ...

反射之前在书上看了一点,不太懂。你的意思是不是说类是将Class实例化了,是其具体的体现形式?不过,自己不是很明白的,可能需要一定的编程思想了就明白了吧
作者: 黄玉昆    时间: 2013-2-12 15:58
汪平乐 发表于 2013-2-12 11:02
从代码中可以看出,p是堆内存中的变量,代表栈内存中的new Person()对象,诚如楼上兄台所言:“p是Person类 ...

你说:p是堆内存中的变量,代表栈内存中的new Person()对象。这话是不是反了啊,p是栈内存中的吧?
作者: 汪平乐    时间: 2013-2-12 22:50
记得用new产生的实体都是栈内存中的...不知道错了没有?
作者: 黄玉昆    时间: 2013-2-12 22:59
汪平乐 发表于 2013-2-12 22:50
记得用new产生的实体都是栈内存中的...不知道错了没有?

你再看看毕老师的视频,关于那些他画的图
作者: 袭喜悦    时间: 2013-2-13 00:15
java有两种类型,基本类型,跟引用类型,而类是引用类型的一种,class类型,或者是类类型。
Person p = new Person("小明",19,"男");也就是创建一个person类型的对象p,p可以看成(int i=1;)中的i,i是整型这一类型里面的其中一个对象,而p也是person类中的一个对象,就想人是动物一员,new Person("小明",19,"男");是调用了相应的构造函数,为P对象添加了属性,就像int i=1;同样为I赋予了int类型的相应属性。所以说对象p类型就是person型,就像我们每个人都是人类一样,
作者: 朱玉玺    时间: 2013-2-13 15:31
我换一个说法,以楼主为例,希望别介意啊:“黄玉昆”是一个人名,它代表黄玉昆这个实实在在的人,那你说“黄玉昆”这个名字(p)和黄玉昆这个实实在在人(new Person)他们是什么类型的?都是人这个类型的嘛。我觉得类型主要是修饰具体的数据也就是对象的,引用变量只不过是给这个对象起个名字并标属范畴,以方便调用。java中是不允许变量同名的,如果同名时就要加点东西以示一下,比如this.p = p,这个标示的东西就是this。
作者: 黄玉昆    时间: 2013-2-13 16:55
朱玉玺 发表于 2013-2-13 15:31
我换一个说法,以楼主为例,希望别介意啊:“黄玉昆”是一个人名,它代表黄玉昆这个实实在在的人,那你说“ ...

可能当初我问的问题有点不准确,我现在已经基本明白了。不过你这个例子,实在是太形象了。谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2