对象与内存控制

简介:

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的多态机制,也只是局限在行为这个阶段。

 本文转自二郎三郎博客园博客,原文链接:http://www.cnblogs.com/haore147/p/4214689.html,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 Java 程序员
Java中对象几种类型的内存分配(JVM对象储存机制)
Java中对象几种类型的内存分配(JVM对象储存机制)
65 5
Java中对象几种类型的内存分配(JVM对象储存机制)
|
2月前
|
存储 程序员 Python
Python类的定义_类和对象的关系_对象的内存模型
通过类的定义来创建对象,我们可以应用面向对象编程(OOP)的原则,例如封装、继承和多态,这些原则帮助程序员构建可复用的代码和模块化的系统。Python语言支持这样的OOP特性,使其成为强大而灵活的编程语言,适用于各种软件开发项目。
18 1
|
3月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
|
3月前
|
NoSQL Redis C++
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
|
3月前
|
Java 运维
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
19 1
|
2月前
|
搜索推荐 Java API
Electron V8排查问题之分析 node-memwatch 提供的堆内存差异信息来定位内存泄漏对象如何解决
Electron V8排查问题之分析 node-memwatch 提供的堆内存差异信息来定位内存泄漏对象如何解决
44 0
|
3月前
|
安全 Java 运维
开发与运维内存问题之动态对象年龄判定的意义如何解决
开发与运维内存问题之动态对象年龄判定的意义如何解决
21 0
|
3月前
|
Java 运维
开发与运维内存问题之长期存活的对象最终会进入哪个内存区域如何解决
开发与运维内存问题之长期存活的对象最终会进入哪个内存区域如何解决
26 0
|
3月前
|
算法 Java Serverless
Java演进问题之Java程序占用的内存经常比实际应用运行产生的对象占用要多如何解决
Java演进问题之Java程序占用的内存经常比实际应用运行产生的对象占用要多如何解决
|
3月前
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
45 0