对象与内存控制

简介:

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,如需转载请自行联系原作者

相关文章
|
10月前
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
900 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
344 3
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
686 4
|
Java 测试技术 Android开发
让星星⭐月亮告诉你,强软弱虚引用类型对象在内存足够和内存不足的情况下,面对System.gc()时,被回收情况如何?
本文介绍了Java中四种引用类型(强引用、软引用、弱引用、虚引用)的特点及行为,并通过示例代码展示了在内存充足和不足情况下这些引用类型的不同表现。文中提供了详细的测试方法和步骤,帮助理解不同引用类型在垃圾回收机制中的作用。测试环境为Eclipse + JDK1.8,需配置JVM运行参数以限制内存使用。
159 2
|
算法 Java
JVM进阶调优系列(3)堆内存的对象什么时候被回收?
堆对象的生命周期是咋样的?什么时候被回收,回收前又如何流转?具体又是被如何回收?今天重点讲对象GC,看完这篇就全都明白了。
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
240 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(二)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
161 1
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
168 0
深入理解java对象的内存布局
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(三)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
205 0