对象和内存分配

桃扇骨 2021-09-11 07:00 440阅读 0赞
  1. package six;
  2. import oo.Car;
  3. public class duixiang2 {
  4. public static void main(String[] args) {
  5. // 内存管理分为内存分配、内存
  6. // 内存分配:java创建对象时jvm为该对象在堆内存中所分配的内存空间
  7. // 内存回收:java失去对象引用,变成垃圾时,jvm的垃圾回收机制自动清理该对象
  8. /*
  9. * 实例变量和类变量
  10. *
  11. * java变量分为 - 局部变量 - 形参:在方法中定义的局部变量,由方法调用者为其赋值,方法结束而消亡 -
  12. * 方法内的局部变量:在方法内定义局部变量,必须显示在方法内对其显示的初始化。初始化而生,方法结束而亡 -
  13. * 代码块内的局部变量:在代码块内定义的局部变量,显示初始化,初始化而生,代码块结束而亡 局部变量的作用短暂,他们都被存储在方法的栈内存中 -
  14. * 成员变量Field - static 修饰的为静态的变量或类变量 - 没有static修饰的称为非静态变量或实例变量
  15. *
  16. * static 只能修饰在类里定义的成员部分,包括 成员变量、方法、内部类、初始化代码块、内部枚举类
  17. *
  18. * 静态变量的初始化在实例变量之前
  19. *
  20. * 实例变量和静态(类)变量的属性 static修饰的变量为静态变量,属于该类本身。
  21. * 没有static修饰的成员变量是实例变量,属于该类的实例。
  22. *
  23. * 同一个jvm中,每个类只对应一个class对象,因此同一个jvm内的一个类的类变量只需要一块内存空间 但每个类可以创建多个java对象
  24. *
  25. * 实例变量,该类每次创建一次实例,就需要为实例变量分配一块内存空间,程序中有几个实例,就需要几块内存空间
  26. *
  27. */
  28. Person.eyeNum = 2;
  29. System.out.println(Person.eyeNum + "eyeNum");
  30. Person person1 = new Person();
  31. person1.name = "me";
  32. person1.age = 123;
  33. System.out.println(person1.eyeNum);
  34. person1.info();
  35. Person person2 = new Person();
  36. person2.eyeNum = 3;
  37. System.out.println(person2.eyeNum);
  38. System.out.println("-----");
  39. Person.eyeNum = 4;
  40. System.out.println(Person.eyeNum);
  41. System.out.println(person1.eyeNum);
  42. System.out.println(person2.eyeNum);
  43. /*
  44. * 从一个角度看,类也是对象,所有的类都是class 的实例,每个类初始化完成后,系统都会为该类创建一个对应的class实例
  45. */
  46. /*
  47. * 实例变量初始化时间40,每次java程序创建java对象时都需要为实例变量分配内存 - 定义实例变量时指定的初始化值 -
  48. * 非静态初始化块中对实例变量指定初始值 - 构造器对实例变量指定初始值
  49. *
  50. * 定义变量时指定的初始化值和初始化化中指定的初始值,与他们的在源程序中的排列顺序相同
  51. *
  52. */
  53. System.out.println("实例对象2017年2月10日09:29:30");
  54. Cat cat = new Cat("a", 1);
  55. System.out.println("cat ------- " +cat);
  56. Cat cat2 = new Cat("b", 2);
  57. System.out.println("cat2 ------" + cat2);
  58. Cat cat3 = new Cat();
  59. System.out.println("cat3 ---------" + cat3);
  60. /*
  61. * javap -c
  62. * 可以看到
  63. * 定义实例变量是指定的初始化值
  64. * 初始化块中为实例变量指定的初始化值
  65. * 构造器中为实例变量指定的初始值
  66. * 三者作用类似,对应的赋值语句都被合并到构造器中,位于构造器的所有语句之前,赋值语句的顺序保持它们在源代码中的顺序
  67. *
  68. *
  69. * */
  70. /*
  71. * 类变量初始化时机
  72. *
  73. * 初始化java类时才会该类的类变量分配内存空间,并初始化
  74. * jvm对一个类只初始化一次,java程序每运行一次,系统只为类变量分配一次内存空间,执行一次初始化
  75. * 定义类变量时指定初始化值
  76. * 静态初始化块中对类变量指定初始值
  77. * */
  78. }
  79. }
  80. class Person {
  81. String name;
  82. int age;
  83. static int eyeNum;
  84. void info() {
  85. System.out.println(this.name + " " + this.age);
  86. }
  87. }
  88. class Cat {
  89. String name;
  90. int age;
  91. public Cat() {
  92. // TODO 自动生成的构造函数存根
  93. System.out.println("无参构造器");
  94. }
  95. public Cat(String name, int age) {
  96. // TODO 自动生成的构造函数存根
  97. System.out.println("带参构造器2"); // 每当程序调用构造器来创建java对象时,该构造器必然获得执行的机会,该类的非静态代码块也会执行,且优先于构造器
  98. this.name = name;
  99. this.age = age;
  100. }
  101. {
  102. int i = 1 ;
  103. i ++;
  104. int count ;
  105. count =+ i ;
  106. System.out.println("非静态代码块执行多次" + count ); //非静态代码块优先于构造器
  107. int we = 2; // 定义实例变量时指定的初始值、初始化块中为实例变量指定初始值的语句都是地位平等的, 处理后将被提取到构造器中
  108. System.out.println(" we "+ " = "+ we);
  109. }
  110. static {
  111. System.out.println("静态代码块只执行一次");
  112. }
  113. double we = 3;
  114. // 等于
  115. // double we 创建对象时为该对象分配内存
  116. // we = 3 这句将会被提取到java类的构造器中执行
  117. @Override
  118. public String toString() {
  119. // TODO 自动生成的方法存根
  120. return "cat name = " + this.name + " age = " + this.age + " we = " + we;
  121. }
  122. }

发表评论

表情:
评论列表 (有 0 条评论,440人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JVM 之 对象内存分配

    目录 JVM内存分配策略 1.优先分配到Eden 2.大对象直接分配到老年代 3.长期存活的对象分配到老年代 4.空间分配担保 栈上分配 逃逸分析 逃逸状态

    相关 JVM-对象内存分配

    大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。 大对象直接进入老年代,大对象是指需要大量连续内存空间的ja