鱼C论坛

 找回密码
 立即注册
查看: 5579|回复: 12

[已解决]java简单问题

[复制链接]
发表于 2021-7-1 19:44:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 oooooook 于 2021-7-2 13:08 编辑

1. public class Shape {
2.     private int sides;
3.     public Shape(int sides){this.sides=sides;}
4.     public int getSides(){return sides;}
5.     public void setSides(int sides){this.sides=sides;}

6.     public static void main(String[] args) {
7.         Shape shape = new Shape(3);
8.         int sides= shape.getSides();
9.         System.out.println(sides);
10.         shape.setSides(5);
11.         sides = shape.getSides();
12.         System.out.println(sides);
     }
}

第七行初始化后sides=3,这个3先经过第三行代码还是第二行代码,怎么运行的
最佳答案
2021-7-2 09:29:16
类的加载过程:
1.加载类的class文件;
2.在栈中声明一个引用地址,后面指向堆中对象具体实例;
3.在堆中开辟空间,实例化对象,根据变量类型赋初始值;
4.栈中执行类的构造函数,进行变量值的重新赋值;
5.将栈中的引用地址指向堆中的具体事例,并返回引用地址(即实例化的具体对象);
结合你的进行分析:
Shape(3)会调用Shape的有参构造函数,将sides的值赋值为3,然后又通过setSide方法,将sides的值赋值为5。
第一行代码和第三行代码是没有可比性的,因为第三行代码属于第一行代码的一部分,第一行代码(也就是Shape类)他是在JVM编译类的时候就已经执行了,并且整个过程只执行一次,之后编译成class文件,然后你在实例化Shape对象的时候,才去调用的第三行代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-2 07:26:37 | 显示全部楼层
第七行代码属于实例化Shape类
你可以理解为经过第三行代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-2 09:29:16 | 显示全部楼层    本楼为最佳答案   
类的加载过程:
1.加载类的class文件;
2.在栈中声明一个引用地址,后面指向堆中对象具体实例;
3.在堆中开辟空间,实例化对象,根据变量类型赋初始值;
4.栈中执行类的构造函数,进行变量值的重新赋值;
5.将栈中的引用地址指向堆中的具体事例,并返回引用地址(即实例化的具体对象);
结合你的进行分析:
Shape(3)会调用Shape的有参构造函数,将sides的值赋值为3,然后又通过setSide方法,将sides的值赋值为5。
第一行代码和第三行代码是没有可比性的,因为第三行代码属于第一行代码的一部分,第一行代码(也就是Shape类)他是在JVM编译类的时候就已经执行了,并且整个过程只执行一次,之后编译成class文件,然后你在实例化Shape对象的时候,才去调用的第三行代码。
0cfc04d4-cb51-4c5b-8671-0a52a16f041e.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-7-2 13:10:47 | 显示全部楼层
连帅帅 发表于 2021-7-2 09:29
类的加载过程:
1.加载类的class文件;
2.在栈中声明一个引用地址,后面指向堆中对象具体实例;

我打错了,是先第三行,还是先第二行,就是是第二行先赋值是3,还是第三行先sides=3然后再执行this.sides=sides;来赋值第二步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-2 14:17:24 | 显示全部楼层
oooooook 发表于 2021-7-2 13:10
我打错了,是先第三行,还是先第二行,就是是第二行先赋值是3,还是第三行先sides=3然后再执行this.sides ...

先2后3,2是属于Shape类的属性,3是有参构造方法,只要你new对象,类的属性都会被初始化默认值(int是0,char是/u0000,String是null。还有其他的自己百度下),也就是说在创建对象的时候2这一步是必定会执行的,3步骤是在初始值的基础之上进行值的重新赋值。
下面是debug演示:

1625206328172.rar

433.41 KB, 下载次数: 1

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-2 14:54:13 | 显示全部楼层
连帅帅 发表于 2021-7-2 14:17
先2后3,2是属于Shape类的属性,3是有参构造方法,只要你new对象,类的属性都会被初始化默认值(int是0, ...

根据问题应该是直接经过第三行,和第二行(只声明存在这个变量)没关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-2 15:27:01 | 显示全部楼层
匀音一刀文 发表于 2021-7-2 14:54
根据问题应该是直接经过第三行,和第二行(只声明存在这个变量)没关系

在创建对象的时候会先在堆内存中进行变量的初始化,然后调用构造进行重新赋值,肯定跟2有关系的呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-2 16:08:45 | 显示全部楼层
连帅帅 发表于 2021-7-2 15:27
在创建对象的时候会先在堆内存中进行变量的初始化,然后调用构造进行重新赋值,肯定跟2有关系的呀{:10_29 ...

确实,是我理解浅了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-3 21:20:42 | 显示全部楼层
连帅帅 发表于 2021-7-2 14:17
先2后3,2是属于Shape类的属性,3是有参构造方法,只要你new对象,类的属性都会被初始化默认值(int是0, ...

谢谢,明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-3 21:21:28 | 显示全部楼层
匀音一刀文 发表于 2021-7-2 16:08
确实,是我理解浅了

hh
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-3 21:33:05 | 显示全部楼层
连帅帅 发表于 2021-7-2 14:17
先2后3,2是属于Shape类的属性,3是有参构造方法,只要你new对象,类的属性都会被初始化默认值(int是0, ...

我看演示开始sides就是3,然后变成0,最后又变回3
为啥开始就是3,然后变成0是不是初始化


还有第10步赋值5,是不是先第3步this.sides=sides执行后将原本第2步被赋值为3的sides给赋值为5。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-5 10:05:54 | 显示全部楼层
oooooook 发表于 2021-7-3 21:33
我看演示开始sides就是3,然后变成0,最后又变回3
为啥开始就是3,然后变成0是不是初始化

不要看浅色的,深色的才是赋值,第一次是三是因为我传了个参数3,所以他是三,实际第一个是0,也就是初始化的时候赋值为0,然后调用构造的时候又把side赋值为3,你仔细看下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-5 17:18:14 | 显示全部楼层
连帅帅 发表于 2021-7-5 10:05
不要看浅色的,深色的才是赋值,第一次是三是因为我传了个参数3,所以他是三,实际第一个是0,也就是初始 ...

ok
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 00:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表