java简单问题
本帖最后由 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先经过第三行代码还是第二行代码,怎么运行的 第七行代码属于实例化Shape类
你可以理解为经过第三行代码 类的加载过程:
1.加载类的class文件;
2.在栈中声明一个引用地址,后面指向堆中对象具体实例;
3.在堆中开辟空间,实例化对象,根据变量类型赋初始值;
4.栈中执行类的构造函数,进行变量值的重新赋值;
5.将栈中的引用地址指向堆中的具体事例,并返回引用地址(即实例化的具体对象);
结合你的进行分析:
Shape(3)会调用Shape的有参构造函数,将sides的值赋值为3,然后又通过setSide方法,将sides的值赋值为5。
第一行代码和第三行代码是没有可比性的,因为第三行代码属于第一行代码的一部分,第一行代码(也就是Shape类)他是在JVM编译类的时候就已经执行了,并且整个过程只执行一次,之后编译成class文件,然后你在实例化Shape对象的时候,才去调用的第三行代码。 连帅帅 发表于 2021-7-2 09:29
类的加载过程:
1.加载类的class文件;
2.在栈中声明一个引用地址,后面指向堆中对象具体实例;
我打错了,是先第三行,还是先第二行,就是是第二行先赋值是3,还是第三行先sides=3然后再执行this.sides=sides;来赋值第二步 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演示:
连帅帅 发表于 2021-7-2 14:17
先2后3,2是属于Shape类的属性,3是有参构造方法,只要你new对象,类的属性都会被初始化默认值(int是0, ...
{:10_256:}根据问题应该是直接经过第三行,和第二行(只声明存在这个变量)没关系 匀音一刀文 发表于 2021-7-2 14:54
根据问题应该是直接经过第三行,和第二行(只声明存在这个变量)没关系
在创建对象的时候会先在堆内存中进行变量的初始化,然后调用构造进行重新赋值,肯定跟2有关系的呀{:10_292:} 连帅帅 发表于 2021-7-2 15:27
在创建对象的时候会先在堆内存中进行变量的初始化,然后调用构造进行重新赋值,肯定跟2有关系的呀{:10_29 ...
确实,是我理解浅了{:10_245:} 连帅帅 发表于 2021-7-2 14:17
先2后3,2是属于Shape类的属性,3是有参构造方法,只要你new对象,类的属性都会被初始化默认值(int是0, ...
谢谢,明白了 匀音一刀文 发表于 2021-7-2 16:08
确实,是我理解浅了
hh 连帅帅 发表于 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。 oooooook 发表于 2021-7-3 21:33
我看演示开始sides就是3,然后变成0,最后又变回3
为啥开始就是3,然后变成0是不是初始化
不要看浅色的,深色的才是赋值,第一次是三是因为我传了个参数3,所以他是三,实际第一个是0,也就是初始化的时候赋值为0,然后调用构造的时候又把side赋值为3,你仔细看下 连帅帅 发表于 2021-7-5 10:05
不要看浅色的,深色的才是赋值,第一次是三是因为我传了个参数3,所以他是三,实际第一个是0,也就是初始 ...
ok
页:
[1]