java学习二---对象和内存管理
1.实例变量和类变量的内存分配
类变量 :使用static修饰的成员变量是类变量,属于该类本身
实例变量:没有使用static修饰的成员变量是实例变量,属于该类的实例
由于同一个JVM内每个类只对应一个Class对象,因此同一个JVM内的一个类的类变量只需一块内存空间。
对于实例变量而言,该类每创建一次实例,就需要为实例变量分配一块内存空间,所以,程序中有几个实例,实例变量就需要几块内存空间。
2.类变量的初始化时机总是处于实例变量的初始化之前
我们先看下下面三段代码:
1)因为两个实例变量都是在创建变量的时候才开始分配空间,此时num2还没有分配,所以前向引用就会出现编译错误。
int num = num2 + 3; //非法前向引用,会报错 int num2 = 2;
2)因为两个类变量在JVM加载类的时候分配空间,此时num2还没有分配,所以前向引用就出现编译错误。
static int num = num2 + 3; //非法前向引用,会报错 static int num2 = 2;
3)因为类变量num2在JVM加载类的时候空间已经分配好,而num在创建实例的时候才分配空间,此时num2已经分配成功了,所以num前向引用成功。
int num = num2 + 3; //正确使用 static int num2 = 2;
由上面三段代码块就可以验证得:类变量的初始化时机总是出于实例变量的初始化之前
3.Java对象的初始化方式及其执行顺序
Java对象的初始化方式有三种:1)构造器 2)初始化块 3)定义变量时指定初始化值
如果这三种初始化方式同时出现,也要注意,他们也有一个执行顺序的规定:
1)静态初始化块只在类第一次创建对象的时候运行一次,后面就不会再运行,而类在每次创建对象时,非静态初始化块总是会运行一次。
public class TestInit1 {static {System.out.println("执行-----静态初始化代码块.");}{System.out.println("执行---非静态初始化代码块.");}public static void main(String[] args) {for (int i = 1; i <= 2; i++) {System.out.println("创建第 " + i + " 个对象"); new TestInit1();System.out.println();}} }
运行结果:
Compiling TestInit1.java....... -----------OUTPUT----------- 执行-----静态初始化代码块. 创建第 1 个对象 执行---非静态初始化代码块.创建第 2 个对象 执行---非静态初始化代码块.
2)构造器每次创建对象时,构造器必然有执行的机会,此时,非静态初始化块必定也将获得机会并且运行在构造器之前
public class TestInit2 {{System.out.println("执行---非静态初始化代码块.");}public TestInit2 () {System.out.println("执行---构造器.");}public static void main(String[] args) {for (int i = 1; i <= 2; i++) {System.out.println("创建第 " + i + " 个对象"); new TestInit2();System.out.println();}} }
运行结果:
Compiling TestInit2.java....... -----------OUTPUT----------- 创建第 1 个对象 执行---非静态初始化代码块. 执行---构造器.创建第 2 个对象 执行---非静态初始化代码块. 执行---构造器.
3)定义变量时指定的初始化值和初始化块中指定的初始值的执行顺序与他们在源程序中的排列顺序相同。
验证一:
public class TestInit3 {String i = "定义变量时指定的初始化值";{i = "初始化块中指定的初始值";}public static void main(String[] args) {for (int i = 1; i <= 2; i++) {System.out.println("创建第 " + i + " 个对象"); System.out.println(new TestInit3().i);System.out.println();}} }
运行结果:
Compiling TestInit3.java....... -----------OUTPUT----------- 创建第 1 个对象 初始化块中指定的初始值创建第 2 个对象 初始化块中指定的初始值
验证二:
public class TestInit4 {{i = "初始化块中指定的初始值";}String i = "定义变量时指定的初始化值";public static void main(String[] args) {for (int i = 1; i <= 2; i++) {System.out.println("创建第 " + i + " 个对象"); System.out.println(new TestInit4().i);System.out.println();}} }
运行结果:
Compiling TestInit4.java....... -----------OUTPUT----------- 创建第 1 个对象 定义变量时指定的初始化值创建第 2 个对象 定义变量时指定的初始化值
4.final修饰符
final变来那个在编译时就被确定下来了,相当于一个直接量。
1)final修饰的实例变量赋值时机:
- 定义final实例变量时 指定初始值
- 在非静态初始化模块中为final实例变量指定的初始值
- 在构造器中为final实例变量指定初始值
2)final修饰的类变量赋值时机:
- 定义final类变量时指定初始值
- 在静态初始化模块中为final实例变量指定的初始值
转载于:https://www.cnblogs.com/lea-fu/p/3251822.html
java学习二---对象和内存管理相关推荐
- java类和对象在内存的表现形式
Java内存分配与管理是Java的核心技术之一,不管学习任何一门语言,我们要知其然,知其所以然,本文主要分析下Java中类和对象在内存中的表现形式,方便我们对其有更深了解.一般Java在内存分配时会涉 ...
- 解析Java对象引用与JVM自动内存管理(2)
解析Java对象引用与JVM自动内存管理(2) 作者:杨扬 本文选自:赛迪网 2002年11月22日 Soft References 应用实例 下面以在基于web的应用程序中使用soft refere ...
- 陈延伟:任督二脉之内存管理总结笔记
任督二脉之内存管理第一节课总结 本文是任督二脉之内存管理课程第一节课的总结说明,由于水平有限,可能无法对宋老师所讲完全理解通透,如有错误,请及时指证. 本文从5个方面进行说明: 1. 物理/虚拟/总 ...
- JVM基础 之Java HotSpot虚拟机中的内存管理
1 简介 依托JavaTM 2平台的力量,标准版(J2SETM)实现了内存的自动管理,将开发人员从复杂的显式内存管理中解放出来. 本文将对Sun公司的J2SE发行版中的Java HotSpot虚拟机 ...
- 视频教程-iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-iOS
iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化 小码哥教育CEO,曾开发了2个iOS的流行开源框架(MJRefresh.MJExtension),目前在国内的使用率非常高. 李 ...
- iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-李明杰-专题视频课程...
iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-236人已学习 课程介绍 得遇名师,突飞猛进!iOS培训王者MJ(李明杰)老师精心研发,iOS进阶课程,实用技术 ...
- C语言内存管理内幕(二)----半自动内存管理策略
2019独角兽企业重金招聘Python工程师标准>>> C语言内存管理内幕(二)----半自动内存管理策略 转载于:https://my.oschina.net/hengcai001 ...
- ThreadX学习(4)——内存管理
ThreadX学习(4)--内存管理 学习参考 内存分配 内存字节池 memory byte pool 字节池大小 碎片整理 API 1.tx_byte_pool_create 2.tx_byte_a ...
- Linux任督二脉之内存管理(三) PPT
五节课的第三节课-进程的内存消耗和泄漏 *进程的VMA. *进程内存消耗的4个概念:vss.rss.pss和uss *page fault的几种可能性,major和minor *应用内存泄漏的界定方法 ...
最新文章
- 【以太坊】web3.js的1.0版本和0.2.0版本的安装及区别
- tensorflow和python先学哪个-前辈说先学会了这些Python知识点,再谈学习人工智能!...
- linux下jetty简单配置
- nodejs安装node-rsa遇到的问题及解决
- Gentoo 安装日记 01 (工具准备)
- 笔记:Matrix completion by Truncated Nuclear Norm Regularization
- 计算任意两个数之间1出现的次数的思维过程
- C语言volatile关键字的作用
- set get java_JAVA中关于set()和get()方法的理解及使用
- qml入门学习(一):hello world
- Codeforces Round #498 (Div. 3) - 赛后补题
- HikariCP不断打印WARN日志Failed to validate connection com.mysql.jdbc.JDBC4Connection@xxxxx (...) Possibly
- 苹果全线支持支付宝,放不下的中国战场
- CSS3——CSS行内元素和块级元素的转换
- InstallShield使用完全教程
- ET框架学习1-服务端的认识
- Atlassian与DevOps 系列产品选择方案介绍
- 初中英语语法(017)-关系代词
- font setup -- dejavu 安装字体
- PayPal支付集成到自己Web网站
热门文章
- python setup.py build_打包Python项目为rpm时遇到python setup.py build报错的问题
- 模拟轮盘抽奖游戏 python_“吃鸡”4位美女在现实中,穿上游戏的“新军需”,这身材绝了...
- html z-dext优先级顺序,$ext{1D/1D}$ 动态规划的三种优化
- html一个div调用的一个php页面,打开一个HTML文件,一个div/iframe中内PHP
- java声明时间为什么类型_JAVA--类的声明周期
- linux网络配置出现E325,Linux CentOS E325错误,如何解决?VI如何使用?
- 从0开始学习自动化测试框架cypress(三)特性
- 借贷记账法下的账户对应关系_会计实操借贷记账法记账规则——会计干货来了快记啊!...
- html版本操作手册,全新HTML5用户手册(版本2017)–互联网股票买卖操作.PDF
- windows环境的python的环境变量_win的环境变量配置(Python实例)