• 疯狂JAVA16课之对象与内存控制


    • java内存管理分为两个方面:内存分配和内存回收。这里的内存分配特指创建java对象时JVM为该对象在对内存中所分配的内存空间。内存回收指的是当该java对象失去引用,变成垃圾时,JVM的垃圾回收机制自动清理该对象,并回收该对象所占用的内存。由于JVM内置了垃圾回收机制会收失去引用的java对象所占用的内存,所以很多java开发者认为java不存在内存泄漏,资源泄露的问题。实际上是一种错觉,java程序依然会有内存泄漏。
     
     
    • 由于JVM的垃圾回收机制由一条后台线程完成,本身也是非常消耗性能的,因此如果肆无忌惮的创建对象,让系统分配内存,拿这些分配的内存酱油垃圾回收机制进行回收,这样做有两个坏处:
      • 不断分配内存使得系统中可用内存减少,从而降低程序运行性能
      • 大量已经分配内存的会收拾的垃圾回收的负担加重,降低程序运行性能
     
     
     
    • 代码:
                             
              运行结果:
                   

     

                分析:
                       类变量初始化分成两个阶段:
                             1.系统为price的两个变量分配内存空间;
                             2.按初始化代码的排列顺序对类变量执行初始化
     
     
     
     1 package section2;
     2 class Base{
     3     private int i =2;
     4     public Base(){
     5          this.display();
     6     }
     7     public void display(){
     8          System.out.println(i);
     9     }
    10 }
    11 class Derived extends Base{
    12     private int i =22;
    13     public Derived(){
    14          i =222;
    15     }
    16     public void display(){
    17          System.out.println(this.i);
    18     }
    19 }
    20 public class Test {
    21     public static void main(String[] args) {
    22          new Derived();  //此时执行先执行了父类的构造方法,输出的i是本类的,
    23 //       此时i还未初始化,所以为0,等输出后i才被赋值为222
    24  
    25     }
    26 }

     

    输出0;
     
    • 对于父类定义的public成员变量,系统将其保留在父类中,并不会将他转移到其子类中,所以父类和子类可以同时拥有同名的实例变量

        

     

        

     

     

          因为继承成员变量和继承方法之间存在这样的差别,所以对于一个应用类型的变量而言,当通过该变量访问他所引用的对象的方法时,该实例变量的值取决于声明该变量的对象类型,当通过该变量来调用它所引用的对象的方法时,该方法行为取决于他所实际引用的对象的类型。
         父 ,子类对象在内存中存储的结论:当程序创建一个子类对象时,系统不仅会为该类中定义的实例变量分配内存,也会为父类中定义的所有实例变量分配内存,即使子类定义了与父类中同名的实例变量(但父类的成员变量不属于子类,如果父类的变量为共有的可以通过子类.变量名修改父类的变量。而不是说明子类拥有了父类的变量)。也就是说,当系统创建一个java对象的时候,如果该java类有两个父类(一个直接父类A,一个间接父类B),假设A类中定义了2个实例变量,B类中定义了3个实例变量,当前类中定义了2个实例变量,那这个对象将会保存2+3+2个实例变量。(注意保存不代表拥有)
     
      • 定义final变量时,只有在定义时指定初始值,系统才会执行”宏替换“ 。
         
      • 如果程序需要在局部内部类(只有局部内部类才可以访问局部变量:即放在方法里定义的内部类)中使用局部变量,那么这个局部变量必须使用final修饰符修饰。因为:对于普通局部变量而言,他的作用于就是停留在该方法内,当方法执行结束,该局部变量也随之消失;但内部类则可能产生隐式的”闭包“,闭包将使得局部变量脱离它所在的方法继续存在。
  • 相关阅读:
    MAVEN flex
    计算几何--判断点是否在矩形里
    Maven copy方式列举
    配置 IntelliJ IDEA VM options
    解决访问StackOverFlow太慢的问题
    Android sdk manager 更新 5.0 太难了,终于解决
    为OS X增加环境变量
    激活老电脑的第二春:内存盘为Chrome浏览器做缓存
    Android启动外部应用的方法
    在Activities之间导航
  • 原文地址:https://www.cnblogs.com/dogLin/p/6012703.html
Copyright © 2020-2023  润新知