弄懂局部变量和成员变量的内存位置 红太狼 2024-03-16 12:02 15阅读 0赞 ### 成员变量和局部变量的区别 ### ![259763d6d795470eb5acac41a5f432c2.png][] **成员变量**(*Member Variables*) **局部变量**(Local Variable) ### 测试局部变量和成员变量在内存中的位置 ### #### 1.上测试代码 #### @Service public class User { private final static int a1 = 1; private final static String b1 = "你"; private final static int[] c1 = {1,2,3}; private int d1 = 2; private String e1 = "好"; private int[] f1 = {4,5,6}; public void aa() { int d1 = 2; System.out.println("User的aa()的d1" + " 值 " +d1+ " 内存 " + System.identityHashCode(d1)); String e1 = "好"; System.out.println("User的aa()的e1" + " 值 " +e1+ " 内存 " + System.identityHashCode(e1)); int[] f1 = {4,5,6}; System.out.println("User的aa()的f1" + " 值 " +f1+ " 内存 " + System.identityHashCode(f1)); } public void bb() { int d1 = 2; System.out.println("User的bb()的d1" + " 值 " +d1+ " 内存 " + System.identityHashCode(d1)); String e1 = "好"; System.out.println("User的bb()的e1" + " 值 " +e1+ " 内存 " + System.identityHashCode(e1)); int[] f1 = {4,5,6}; System.out.println("User的bb()的f1" + " 值 " +f1+ " 内存 " + System.identityHashCode(f1)); } public static int getA1() { return a1; } public static String getB1() { return b1; } public static int[] getC1() { return c1; } public int getD1() { return d1; } public String getE1() { return e1; } public int[] getF1() { return f1; } } @Service public class Nat { private final static int a1 = 1; private final static String b1 = "你"; private final static int[] c1 = {1,2,3}; private int d1 = 2; private String e1 = "好"; private int[] f1 = {4,5,6}; public void aa() { int d1 = 2; System.out.println("Nat的aa()的d1" + " 值 " +d1+ " 内存 " + System.identityHashCode(d1)); String e1 = "好"; System.out.println("Nat的aa()的e1" + " 值 " +e1+ " 内存 " + System.identityHashCode(e1)); int[] f1 = {4,5,6}; System.out.println("Nat的aa()的f1" + " 值 " +f1+ " 内存 " + System.identityHashCode(f1)); } public void bb() { int d1 = 2; System.out.println("Nat的bb()的d1" + " 值 " +d1+ " 内存 " + System.identityHashCode(d1)); String e1 = "好"; System.out.println("Nat的bb()的e1" + " 值 " +e1+ " 内存 " + System.identityHashCode(e1)); int[] f1 = {4,5,6}; System.out.println("Nat的bb()的f1" + " 值 " +f1+ " 内存 " + System.identityHashCode(f1)); } public static int getA1() { return a1; } public static String getB1() { return b1; } public static int[] getC1() { return c1; } public int getD1() { return d1; } public String getE1() { return e1; } public int[] getF1() { return f1; } } @RestController @RequestMapping("/aaa") public class Qqq { @Autowired private User user; @Autowired private Nat nat; @GetMapping("/bbb") public void ccc() { System.out.println("User的a1" + " 值 " +User.getA1()+ " 内存 " + System.identityHashCode(User.getA1())); System.out.println("User的b1" + " 值 " +User.getB1()+ " 内存 " + System.identityHashCode(User.getB1())); System.out.println("User的c1" + " 值 " +User.getC1()+ " 内存 " + System.identityHashCode(User.getC1())); System.out.println("User的d1" + " 值 " +user.getD1()+ " 内存 " + System.identityHashCode(user.getD1())); System.out.println("User的e1" + " 值 " +user.getE1()+ " 内存 " + System.identityHashCode(user.getE1())); System.out.println("User的f1" + " 值 " +user.getF1()+ " 内存 " + System.identityHashCode(user.getF1())); user.aa(); user.bb(); System.out.println("Nat的a1" + " 值 " +Nat.getA1()+ " 内存 " + System.identityHashCode(Nat.getA1())); System.out.println("Nat的b1" + " 值 " +Nat.getB1()+ " 内存 " + System.identityHashCode(Nat.getB1())); System.out.println("Nat的c1" + " 值 " +Nat.getC1()+ " 内存 " + System.identityHashCode(Nat.getC1())); System.out.println("Nat的d1" + " 值 " +nat.getD1()+ " 内存 " + System.identityHashCode(nat.getD1())); System.out.println("Nat的e1" + " 值 " +nat.getE1()+ " 内存 " + System.identityHashCode(nat.getE1())); System.out.println("Nat的f1" + " 值 " +nat.getF1()+ " 内存 " + System.identityHashCode(nat.getF1())); nat.aa(); nat.bb(); } } #### 2.运行结果 #### > <table> > <tbody> > <tr> > <td style="vertical-align:middle;width:52.7pt;"><span style="color:#000000;">User的a1 </span></td> > <td style="vertical-align:middle;width:78.35pt;"><span style="color:#000000;">值 1 </span></td> > <td style="vertical-align:middle;width:49.95pt;"><span style="color:#000000;">内存 697815822</span></td> > <td style="vertical-align:middle;width:98.1pt;"></td> > <td style="vertical-align:middle;width:91px;"><span style="color:#000000;">Nat的a1 </span></td> > <td style="vertical-align:middle;width:63px;"><span style="color:#000000;">值 1 </span></td> > <td style="vertical-align:middle;width:49.95pt;"><span style="color:#000000;">内存 697815822</span></td> > <td style="vertical-align:middle;width:49.95pt;"></td> > <td style="vertical-align:middle;width:86.1pt;"></td> > <td style="vertical-align:middle;width:49.95pt;"></td> > <td style="vertical-align:middle;width:49.95pt;"></td> > <td style="vertical-align:middle;width:49.95pt;"></td> > </tr> > <tr> > <td style="vertical-align:middle;"><span style="color:#000000;">User的b1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 你 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 1403028226</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;width:91px;"><span style="color:#000000;">Nat的b1 </span></td> > <td style="vertical-align:middle;width:63px;"><span style="color:#000000;">值 你 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 1403028226</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > </tr> > <tr> > <td style="vertical-align:middle;"><span style="color:#000000;">User的c1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 [I@2feff326 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 804254502</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;width:91px;"><span style="color:#000000;">Nat的c1 </span></td> > <td style="vertical-align:middle;width:63px;"><span style="color:#000000;">值 [I@55f2d93a </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 1441978682</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > </tr> > <tr> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;width:91px;"></td> > <td style="vertical-align:middle;width:63px;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > </tr> > <tr> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;width:91px;"></td> > <td style="vertical-align:middle;width:63px;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > </tr> > <tr> > <td style="vertical-align:middle;"><span style="color:#000000;">User的d1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 2 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 387698249</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;width:91px;"><span style="color:#000000;">User的aa()的d1 </span></td> > <td style="vertical-align:middle;width:63px;"><span style="color:#000000;">值 2 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 387698249</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"><span style="color:#000000;">User的bb()的d1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 2 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 387698249</span></td> > <td style="vertical-align:middle;"></td> > </tr> > <tr> > <td style="vertical-align:middle;"><span style="color:#000000;">User的e1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 好 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 225287</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;width:91px;"><span style="color:#000000;">User的aa()的e1 </span></td> > <td style="vertical-align:middle;width:63px;"><span style="color:#000000;">值 好 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 225287</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"><span style="color:#000000;">User的bb()的e1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 好 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 225287</span></td> > <td style="vertical-align:middle;"></td> > </tr> > <tr> > <td style="vertical-align:middle;"><span style="color:#000000;">User的f1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 [I@576c4b96 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 1466715030</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;width:91px;"><span style="color:#000000;">User的aa()的f1 </span></td> > <td style="vertical-align:middle;width:63px;"><span style="color:#000000;">值 [I@3402bcd0 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 872594640</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"><span style="color:#000000;">User的bb()的f1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 [I@3ac55420 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 986010656</span></td> > <td style="vertical-align:middle;"></td> > </tr> > <tr> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;width:91px;"></td> > <td style="vertical-align:middle;width:63px;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > </tr> > <tr> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;width:91px;"></td> > <td style="vertical-align:middle;width:63px;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"></td> > </tr> > <tr> > <td style="vertical-align:middle;"><span style="color:#000000;">Nat的d1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 2 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 387698249</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;width:91px;"><span style="color:#000000;">Nat的aa()的d1 </span></td> > <td style="vertical-align:middle;width:63px;"><span style="color:#000000;">值 2 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 387698249</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"><span style="color:#000000;">Nat的bb()的d1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 2 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 387698249</span></td> > <td style="vertical-align:middle;"></td> > </tr> > <tr> > <td style="vertical-align:middle;"><span style="color:#000000;">Nat的e1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 好 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 225287</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;width:91px;"><span style="color:#000000;">Nat的aa()的e1 </span></td> > <td style="vertical-align:middle;width:63px;"><span style="color:#000000;">值 好 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 225287</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"><span style="color:#000000;">Nat的bb()的e1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 好 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 225287</span></td> > <td style="vertical-align:middle;"></td> > </tr> > <tr> > <td style="vertical-align:middle;"><span style="color:#000000;">Nat的f1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 [I@60f718e9 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 1626806505</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;width:91px;"><span style="color:#000000;">Nat的aa()的f1 </span></td> > <td style="vertical-align:middle;width:63px;"><span style="color:#000000;">值 [I@3efad7a0 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 1056626592</span></td> > <td style="vertical-align:middle;"></td> > <td style="vertical-align:middle;"><span style="color:#000000;">Nat的bb()的f1 </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">值 [I@7bf85e1b </span></td> > <td style="vertical-align:middle;"><span style="color:#000000;">内存 2079874587</span></td> > <td style="vertical-align:middle;"></td> > </tr> > </tbody> > </table> #### 3.结果分析 #### 首先声明,我额外试验了,局部变量用final修饰和不用final修饰对指向的值的内存地址没有任何影响.因此上面的结果就没有出现用final修饰的局部变量 内存结果分析就是下面我画的图,都在图里面的 ![2f2580facc2c4b2a905a47f2956dfb4a.png][] #### 4.对上图结果分析总结 #### **成员变量的内存位置**: 1.用final修饰的成员变量,也叫常量.比如final int a=1.这个"a"和"a"指向1的指向,是存在运行时常量池中. 2.没用final修饰的成员变量,比如final int a=1.这个"a"和"a"指向1的指向,是存在方法区的类的信息下面的. **局部变量的内存位置**: 1.用final修饰的局部变量,比如int a=1.这个"a"和"a"指向1的指向,百度说是存在栈中的,但是不知道存在栈的哪一块. 2.没用final修饰的成员变量,比如int a=1.这个"a"和"a"指向1的指向,是存在栈的方法自己的栈帧中的局部变量表里的. [259763d6d795470eb5acac41a5f432c2.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/16/b011ecc2f500417c99f639df94ec15f8.png [2f2580facc2c4b2a905a47f2956dfb4a.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/16/8b59b325c10b43f5a34fa36fce1f55ae.png
还没有评论,来说两句吧...