zoukankan      html  css  js  c++  java
  • 对象与内存控制

    1. 内存管理的意识:

           在java中,即使引入了垃圾自动回收机制,但是我们仍然需要考虑内存的管理,因为两点:

    <1> 如果分配了大量的内存,系统的可用内存减少,则系统的性能会下降。

    <2> 垃圾回收机制是由一条后台线程完成的,如果反复地进行内存的分配与回收是十分低效率的行为。

    2. 变量的几种类型:

    • 局部变量:

                      存在于栈空间,定义在方法的签名,方法内部,方法的代码块中。随方法的调用结束而消亡。

    • 成员变量:

                      存在于堆空间中,分为类变量(static修饰)和实例变量。

                       其实,static只能修饰类里定义的成员部分:成员变量,方法,内部类,初始化块,内部枚举类。

            初始化时机:类变量的初始化总是在实例变量之前。

              为什么呢?

              因为类变量是在Class这个对象中初始化的,而实例变量是在具体的实例对象中初始化的。两者所依存的实体不同。那么,为什么我们可以通过对象名来访问类变量呢,其实在底层最终执行的时候,对象名.类变量 还是会转换为 类名.类变量。

     

    3. 实例变量的初始化时机:

    • 定义实例变量时指定其初始值。
    • 非静态初始化块中指定其初始值。
    • 构造器中指定其初始值。

    分配内存和初始化时两步,举个例子:double weight = 2.3 ;会被分解为两步:

    double weight;  // 定义,分配内存

    weight = 2.3 ;  // 初始化, 指定初始值

    其实,在最终执行的时候,定义时指定初始值 与 初始化块中指定初始值 的代码都会被提取到 构造器中。

     

    4. 类变量的初始化时机:

  • 定义实例变量时指定其初始值。
  • 非静态初始化块中指定其初始值。
  •  

    5. 继承成员与继承变量之间的区别

    看个程序:

    class Base
    {
        int count =2;
        public void display()
        {
            System.out.println(count);
        }
    }

    class Derived extends Base
    {
        int count = 20;
        public void display()
        {
            System.out.println(count);
        }
    }

    class Main
    {
        public static void main(String[] args)
        {
            Base b = new Base();
            System.out.println(b.count);//2
            b.display();// 2
            Derived d = new Derived();
            System.out.println(d.count);//20
            d.display();//20
            Base bd = new Derived();
            System.out.println(bd.count);//2
            bd.display();//20
            Base b2d = d;
            System.out.println(b2d.count);//2
        }   
    }

    尤其是最后一个 b2d 和 d,虽然它们都指向了同一个对象实体,可是b2d在访问属性的时候,还是只访问Base类的属性,在访问方法时,访问的确实是子类的方法。我想这是否说明了,属性表征的是java对象的状态,而方法表征的是行为。java的多态机制,也只是局限在行为这个阶段。

     

     

     

     

     

     

     

     

     

     

     

    reference:

           1. 《疯狂java,突破程序员基本功的16课》 李刚。

查看全文
  • 相关阅读:
    UVA 10600 ACM Contest and Blackout(次小生成树)
    UVA 10369
    UVA Live 6437 Power Plant 最小生成树
    UVA 1151 Buy or Build MST(最小生成树)
    UVA 1395 Slim Span 最小生成树
    POJ 1679 The Unique MST 次小生成树
    POJ 1789 Truck History 最小生成树
    POJ 1258 Agri-Net 最小生成树
    ubuntu 用法
    ubuntu 搭建ftp服务器,可以通过浏览器访问,filezilla上传文件等功能
  • 原文地址:https://www.cnblogs.com/haore147/p/4214689.html
  • Copyright © 2011-2022 走看看