• 对象与内存控制


    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课》 李刚。

  • 相关阅读:
    深入解析MySQL分区(Partition)功能
    使用mysqlreplicate命令快速搭建 Mysql 主从复制
    MySQL优化/面试,看这一篇就够了
    Nginx+Keepalived高可用集群
    高并发核心技术
    Redis详解
    memcached 常用命令及使用说明
    MemCached详解
    音频和视频
    frameset 和iframe框架标签
  • 原文地址:https://www.cnblogs.com/haore147/p/4214689.html
  • Copyright © 2020-2023  润新知