zoukankan      html  css  js  c++  java
  • java基础四 [构造器和垃圾回收](阅读Head First Java记录)

    本章讲解了对象的创建到被回收的过程,讲述了对象的生命周期
     
    堆(heap)与栈(stack)
    实例变量:实例变量是只声明在类下,方法外的变量(实例变量默认值为0/0.0/false,引用的默认值为null)
    局部变量:声明在方法中的变量,或方法中的参数。又被成为栈变量
     
    例如:
    public class test{
         int size;
         public void foof(int a){
              int b;
              barf()
         }
         public void barf(){
              Duck d =new Duck(24);
         }
    }
    上面的例子中,
    size为实例变量,每个实例都会有一个;
    a和b为局部变量
    d也是局部变量,但是非primitive(int等)变量,是一个对象引用变量。
     
    放在堆(heap)上的:实例变量放在堆上,所有对象都会在堆上。java会根据实例变量的所需空间来进行分配(primitive的根据大小来分配,引用变量如果实例化了就将实例化的对象也放到堆上,如果没有就只放一个引用量)
    放在栈(stack)上的:局部变量、被调用的方法。当前调用的方法会在栈顶显示(新调用的方法从栈顶插入)。
     
    例如:上面的例子我们去调用
    test a = new test();
    a.foo()
     
    那么堆和栈的情况如下:
     
     
    构造函数
    构造函数
    使用new关键字时执行的程序代码,会创建一个对象实例,所有类都有一个构造含数据,如果没写编译器会给写一个默认的构造函数(如果自己建了构造函数,编译器不会帮忙创建构造函数)
    public class Duck{
         public Duck(){
         }
    }
     
    构造函数名字与类名相同;且没有任何返回类型。
    构造函数可以用于初始化对象的状态
     
    重载构造函数
    一个类可以存在多个构造函数,但是必须参数的个数或类型不同(与参数名无关),就和重载一样,叫做重载构造函数
     
    例如:下面例子的重载构造函数都是合理的
    public class mushroom{
         public mushroom(){}
         public mushroom(int size,boolean isMagic){}
         public mushroom(boolean isMagic,int size){}
    }
     
    父类的构造函数
    子类对象包含自己和父类的实例变量,创建子类的对象时,所有继承下来的构造函数都会被执行
     
    构造函数执行时,第一件事去执行它的父类的构造函数,这会连锁到Object这个类为止,这个过程被称为“构造函数链”。所以最终展示的效果是从Object到下的父类一层层的调用(堆栈,先进后出)
     
    子类调用父类的构造函数使用super(),如果没加,编译器会自动给加上super(),super()放在子类构造函数的第一行
    如果调用父类带参数的构造函数,子类的构造函数内要包含这个参数,且用super(参数)来调用
     
    下面是调用被带参数和带参数的父类构造函数的方法。当然不带参数的调用不写super()也可以,编译器会自动加上
    public class hippo extends animal{
         public hippo(){
         super()
         }
         public hippo(String name){
         super(name)
         }
    }
     
    this()
    this指对象本身,只能用在构造函数中,放在第一行,所以this()和super()只能选择一个
    使用this()来从某个构造函数调用同一个类中另外一个构造函数
     
    例如下面的例子:
    class mini extends car{
         Color color;
         public min(){
              this(Color.Red)  //实际调用public mini(Color c)构造函数
         }
         public min(Color c);
         super("mini")
         color=c;
    }
     
    对象的生命周期
    对象的生命周期取决于引用它的“引用”,如果引用还在就活者,当最后一个引用消失了就变成可回收的
     
    局部变量:方法中的局部变量的作用域只在声明它的方法中,方法调用完毕后局部变量回收(方法执行完毕会从堆栈中弹出),当方法A调用方法B时,方法A中的局部变量暂停保存值,当执行完B调回A时才继续活动
    引用变量:引用变量与局部变量相同,只在处于范围内的时候能被引用,参考局部变量
    实例变量:实例变量的作用域是它所属的类,如果对象还活着,实例变量就也活着,如果对象被释放了,也就释放了(实例变量和对象一起生活在堆上)
     
    三种释放对象的方法:
    1.将引用变量放在方法中,方法结束后也就被释放了
    void go(){
         Life z=new Life)()
    }
     
    2.重新赋值新对象
    Life z=new Life();
    z=new Life(); //此时第一个对象在z被赋值后可回收
     
    3.直接将引用赋值为null
    Life z= new Life();
    z=null;
     
    注意:如果对象A被其他对象B等引用了,通过A=null或重新给A分配内存也不能释放该内存,因为该快内存还再被B占用
  • 相关阅读:
    《数据挖掘导论》研读(1)
    《机器学习理论、方法及应用》研读(2)
    《机器学习理论、方法及应用》研读(1)
    Python3爬虫(3)_urllib.error
    Python3爬虫(2)_利用urllib.urlopen发送数据获得反馈信息
    debian 安装svn197
    Debian卸载软件197
    chmod 详解197
    debian 创建快捷方式197
    vim高亮配置197
  • 原文地址:https://www.cnblogs.com/meitian/p/5703598.html
Copyright © 2011-2022 走看看