oooooook 发表于 2021-7-1 19:44:16

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先经过第三行代码还是第二行代码,怎么运行的

肖-肖 发表于 2021-7-2 07:26:37

第七行代码属于实例化Shape类
你可以理解为经过第三行代码

连帅帅 发表于 2021-7-2 09:29:16

类的加载过程:
1.加载类的class文件;
2.在栈中声明一个引用地址,后面指向堆中对象具体实例;
3.在堆中开辟空间,实例化对象,根据变量类型赋初始值;
4.栈中执行类的构造函数,进行变量值的重新赋值;
5.将栈中的引用地址指向堆中的具体事例,并返回引用地址(即实例化的具体对象);
结合你的进行分析:
Shape(3)会调用Shape的有参构造函数,将sides的值赋值为3,然后又通过setSide方法,将sides的值赋值为5。
第一行代码和第三行代码是没有可比性的,因为第三行代码属于第一行代码的一部分,第一行代码(也就是Shape类)他是在JVM编译类的时候就已经执行了,并且整个过程只执行一次,之后编译成class文件,然后你在实例化Shape对象的时候,才去调用的第三行代码。

oooooook 发表于 2021-7-2 13:10:47

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


我打错了,是先第三行,还是先第二行,就是是第二行先赋值是3,还是第三行先sides=3然后再执行this.sides=sides;来赋值第二步

连帅帅 发表于 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演示:

匀音一刀文 发表于 2021-7-2 14:54:13

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

{:10_256:}根据问题应该是直接经过第三行,和第二行(只声明存在这个变量)没关系

连帅帅 发表于 2021-7-2 15:27:01

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

在创建对象的时候会先在堆内存中进行变量的初始化,然后调用构造进行重新赋值,肯定跟2有关系的呀{:10_292:}

匀音一刀文 发表于 2021-7-2 16:08:45

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

确实,是我理解浅了{:10_245:}

oooooook 发表于 2021-7-3 21:20:42

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

谢谢,明白了

oooooook 发表于 2021-7-3 21:21:28

匀音一刀文 发表于 2021-7-2 16:08
确实,是我理解浅了

hh

oooooook 发表于 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。

连帅帅 发表于 2021-7-5 10:05:54

oooooook 发表于 2021-7-3 21:33
我看演示开始sides就是3,然后变成0,最后又变回3
为啥开始就是3,然后变成0是不是初始化



不要看浅色的,深色的才是赋值,第一次是三是因为我传了个参数3,所以他是三,实际第一个是0,也就是初始化的时候赋值为0,然后调用构造的时候又把side赋值为3,你仔细看下

oooooook 发表于 2021-7-5 17:18:14

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

ok
页: [1]
查看完整版本: java简单问题