黑马程序员技术交流社区

标题: 类的引用和类的对象是一回事吗? [打印本页]

作者: 时尚米兰    时间: 2016-8-3 22:45
标题: 类的引用和类的对象是一回事吗?
什么叫类的引用,什么叫类的对象?

作者: yanzhipenglai    时间: 2016-8-3 22:45
其实可以把类理解为是一组相关的属性和行为的集合(比如所有人都具备相同的属性和行为:姓名,年龄,吃饭等等,这种情况下就可以把人定义为一个类,或者称之为一个模型)而对象是该类事物的具体体现。

下面我把创建对象的过程描述一下:
首先此文件名为Test.java,包含两个类。通过javac进行编译,会在硬盘上生成两个字节码文件:Test.class和Person.class。
1.通过java命令运行程序的时候,会先检查含有main方法的Test.class是否已加载进方法区,如果没有会进行加载。虚拟机会调用main方法,main方法进栈,开始执行main方法中的代码Person p = new Person();  
3.在栈内存中的main方法中创建局部变量Person p。
4.要通过new Person()创建Person对象。所以还要在方法区中检查是否存在Person.class,不存在的话,需要加载Person.class这个字节码文件。
5.在堆内存中通过new Person()创建Person类的对象
6.先开辟内存空间,分配起始地址,给对象中的属性进行默认初始化值(String 类型初始值为null,int类型初始值为0)
7.将对象的地址值赋值给Person p。
8.执行p.name = "黄豆";p.age = 5;更改对象的属性值。
9.执行p.daLvDou();daLvDou方法进栈打印出一句话,执行完毕后,daLvDou()方法弹栈。
10.main方法中的所有的代码执行完毕,main方法弹栈。

我简要的个上述步骤配了张图,希望可以帮助你理解

无标题.png (102.56 KB, 下载次数: 20)

无标题.png

作者: raining    时间: 2016-8-3 23:15
引用就是地址例如
String str = new String();
str存放在栈内存中,存放的是地址指向new String()中
new String()存放在堆内存中,是一个对象
作者: linguoqun    时间: 2016-8-3 23:40
楼主,你好!很高兴回答你的问题。
首先先跟你讲一下类的引用。
要引用一个类,首先这个类必须是已经定义的。类的引用实际上就是将这个类的类名作为这个类的某个对象的类型。举个很简单的例子,假如已经定义好了一个Person类,那么我们在主函数那里就可以引用这个类,以此作为这个类的一个对象的类型名。语法格式是: Person p1。这时就可以说是对类的引用。编绎器会先查看源文件中Person这个类是否已经存在,如果存在,会把Person这个类加载到我们内存的代码区。然后将Person作为类型名来定义它的对象p1。希望你能明白。
然后就是您的第二个问题了:什么叫类的对象。
要知道什么叫类的对象,首先要搞清楚什么是类。
类是一群具有相同特征(属性)和相同行为(方法)的事物的抽象。比如说,人都有鼻子,有眼睛,会吃饭。鼻子眼睛都可以说是人的共有属性,会吃饭可以说是人的共有方法。所以具备这些特征和方法的,都可以算是人。但是我们虽然有了类,但是类不能直接拿来用的。这时如果我们非要用,就只能使用这个类的具体的某个对象。比如说我们要找一个人,但是人是一个抽象的概念,我们要找的只能是具体到这个人是谁。比如说我们要找我们自己的爸爸妈妈。这时,爸爸或者妈妈就可以说是人这个类里边的一个对象了。是不是明白了。有不懂的还可以继续提问哦。
纯手打的,满意请采纳,谢谢!
作者: 时尚米兰    时间: 2016-8-4 00:45
linguoqun 发表于 2016-8-3 23:40
楼主,你好!很高兴回答你的问题。
首先先跟你讲一下类的引用。
要引用一个类,首先这个类必须是已经定义的 ...

能给出对象和引用的具体格式吗?比如Person p1,时对象吗?new Person()是引用吗?
作者: linguoqun    时间: 2016-8-4 00:49
时尚米兰 发表于 2016-8-4 00:45
能给出对象和引用的具体格式吗?比如Person p1,时对象吗?new Person()是引用吗?

楼主你好!new Person(),这是是调用了Person 类的构造方法,同时在内存中创建了Person类的对象了。
其实面向对象不难,只要楼主用心学,肯定能学会的。加油!不懂的可以继续提问。纯手打的,满意请采纳,谢谢!
作者: 时尚米兰    时间: 2016-8-4 00:57
linguoqun 发表于 2016-8-4 00:49
楼主你好!new Person(),这是是调用了Person 类的构造方法,同时在内存中创建了Person类的对象了。
其实 ...

那到底什么是对象,什么是引用呢?我已傻傻分布清楚
作者: linguoqun    时间: 2016-8-4 01:06
时尚米兰 发表于 2016-8-4 00:57
那到底什么是对象,什么是引用呢?我已傻傻分布清楚

new()是一个方法,这个方法是强制性地在内存中直接申请一个空间,用来存储创建的类的对象。因为类中如果不写构造方法,会默认有一个构造方法,所以此时也会调用类的构造方法。
对象刚才已经跟您解释过了,对象是实实在在的,是看得见摸得着的实实在在的存在。假如说让楼主去坐车,楼主知道坐哪一辆车吗?楼主不知道,因为此时“车”是一个抽象的概念,在代码里相当一个类。而如果我说,楼主,请坐车牌号是0X9001车牌号的车,楼主就知道要坐哪一辆车了。此时车牌号0X9001的车代表了一个对象。是实实在在存在的,是看得见摸得着的。希望楼主明白。
满意请采纳,谢谢!
作者: 彭鸿儒    时间: 2016-8-4 08:03
感觉其他人说的都不错,我就说个通俗的,引用就是你家房子的户主,对象就是你家房子.
作者: yezilail    时间: 2016-8-4 11:09
来来来,姐姐给你解释。
对象呢,就是一个具体类的实例 :              比如手机类:创建其对象,new Phone();  就是具体创建了一个对象。

引用对象呢,就是引用这个对象:               用这个对象去  调用这个类中定义的方法。引用的时候不会创建对象,只是在内存中找到了你之前创建好的对象的 内存地址。 引用该地址下指定对象。


这么解释很清楚吧。  要不要给姐姐分啊!~
作者: Flowert    时间: 2016-8-4 13:08
类的引用和类的对象,区别:
class Test {
        public static void main(String[] args) {
                Demo d = new Demo();
                d.print();
        }
}
class Demo {
        public void print(){
                System.out.println("对象引用");
        }
}
比如上面这个例子,
对象,就是通过new出来的,会产生一个地址值。
引用的前提就是你要创建一个对象,然后通过对象的地址值去引用
如果你没有创建对象,就不会用引用这一说
作者: flydream    时间: 2016-8-4 13:16
我给你解释吧,比如说,你家有头牛,你不想丢了,怎么办,就找个绳子拴住,没有绳子,牛就丢了,现在来分析,这个绳子就是引用,这个牛就是对象,格式是,牛  xian =new 牛();当你把线剪短时,就相当于你把xian=null;了,之后这个牛就丢了,相当于,被人家捡走了,就是java给回收了,只要绳子没断,你就可以跟着这个绳子,找到这个牛的。不知道,这样你听懂了没,自己纯手写,纯总结,
作者: 月半    时间: 2016-8-4 21:28
类名  变量名   这是定义一个   这个类型的变量     在栈内存中开辟空间存储这个变量;
作者: 月半    时间: 2016-8-4 21:29
类名  变量名   这是定义一个   这个类型的变量     在栈内存中开辟空间存储这个变量  ls:   person   p ;
作者: 月半    时间: 2016-8-4 21:38
类名  变量名   这是定义一个   这个类型的变量     在栈内存中开辟空间存储这个变量  ls:   person   p ;
new类名();这是建立这个类的匿名对象   ,在堆内存中开辟空间存储这个对象    这就是这个类的对象   ls:new People();
类名  变量名 = new类名();这是建立一个对象   并用这个类型的变量去记录这个对象的地址   这个变量就是类的引用       person   p = new People();
作者: 月半    时间: 2016-8-4 21:39
类名  变量名   这是定义一个   这个类型的变量     在栈内存中开辟空间存储这个变量  ls:   person   p ;
new类名();这是建立这个类的匿名对象   ,在堆内存中开辟空间存储这个对象    这就是这个类的对象   ls:new People();
类名  变量名 = new类名();这是建立一个对象   并用这个类型的变量去记录这个对象的地址   这个变量就是类的引用       person   p = new People();
作者: 时尚米兰    时间: 2016-8-5 00:26
yanzhipenglai 发表于 2016-8-4 23:30
其实可以把类理解为是一组相关的属性和行为的集合(比如所有人都具备相同的属性和行为:姓名,年龄,吃饭等 ...

有图有真相,最好理解的一个,谢谢哦
作者: 爱你一万年    时间: 2016-9-15 12:25
理解的好牛逼




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