JAVA对象与内存控制
1.1 实例变量和类变量
成员变量和局部变量:
局部变量分为三大类:
1)形参:在方法签名中定义的局部变量,由方法调用者为其赋值,随方法的结束而消亡。
2)方法内的局部变量:在方法内定义的局部变量,随方法的结束而消亡。
3)代码块内的局部变量:在代码块内定义的局部变量,随代码块的结束而消亡。
局部变量的作用时间很短,它们都是被存在方法的栈内存中。
1.2实例变量的初始化时机
对于实例变量而言,它属于java对象本身,每次程序创建Java对象时都需要为实例变量分配内存空间,并执行初始化。从程序运行角度来看,每次创建Java对象都会为实例变量分配内存空间,并对实例变量执行初始化。
从语法角度看,程序可以在3个地方对实例变量执行初始化:
1) 定义实例变量时指定初始值
2) 非静态初始化块中对实例变量指定初始值
3) 构造器中对实例变量指定初始值
这三中方式中,第一种和第二种比第三种更早执行
代码:
public class ObjTest {
public static void main(String[] args) {
Cat cat = new Cat("ketty", 2);
System.out.println(cat);
Cat c2 = new Cat("hello", 3);
System.out.println(c2);
}
}
class Cat {
//定义name、age两个属性
String name;
int age;
//使用构造器初始化name、age两个变量
public Cat(String name,int age){
System.out.println("执行构造器");
this.name = name;
this.age = age;
}
{
System.out.println("执行非静态初始化块");
weight = 2.0;
}
//定义时指定初始值
double weight = 2.3;
@Override
public String toString() {
return "Cat [name=" + name + ", age=" + age + ", weight=" + weight
+ "]";
}
}
输入结果:
执行非静态初始化块
执行构造器
Cat [name=ketty, age=2, weight=2.3]
执行非静态初始化块
执行构造器
Cat [name=hello, age=3, weight=2.3]
1.3 类变量的初始化时机
从程序运行的角度来看,JVM对一个Java类只初始化一次,因此Java程序每运行一次,系统只为类变量分配一次内存空间,执行一次初始化。
从语法角度来看,程序可以在2个地方对类变量执行初始化:
1.定义类变量时指定初始值
2.静态初始化块中对类变量指定初始值
代码:
public class StaticInitTest {
//定义count类变量,定义时指定初始值
static int count = 2;
//通过静态初始化块为name类变量指定初始值
static{
System.out.println("StaticInitTest的静态初始化块");
name = "Java编程";
}
static String name = "疯狂Java讲义";
public static void main(String[] args) {
//访问该类的两个类变量,
System.out.println("count类变量的值" + StaticInitTest.count);
System.out.println("name类变量的值" + StaticInitTest.name);
}
}
输出:
StaticInitTest的静态初始化块
count类变量的值2
name类变量的值疯狂Java讲义
JAVA对象与内存控制的更多相关文章
- (二)Java对象与内存控制
一.java的类变量和实例变量: java中的变量可分成两种:成员变量和局部变量. 1.局部变量包括以下几类: 方法内的局部变量:作用域为方法体. 代码块内的局部变量:作用域为代码块 形参:方法内的形 ...
- Java 对象及其内存控制
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 更新:其实这里有好多的变戏法,只要你理解了他们在JVM的中的实现机制,就豁然开朗了.有时间我会把这些变戏法的东西 ...
- Java对象的内存模型(一)
前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...
- Java对象的内存布局
对象的内存布局 平时用java编写程序,你了解java对象的内存布局么? 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域: 对象头 实例数据 对齐填充 对象头 对象头包括两部分信息: ...
- JVM总结-java对象的内存布局
在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我们还可以通过反射机制.Object.clone 方法.反序列化以及 Unsafe.allocateInstance ...
- java对象在内存的大小
前言 一直以来,对java对象大小的概念停留在基础数据类型,比如byte占1字节,int占4字节,long占8字节等,但是一个对象包含的内存空间肯定不只有这些. 假设有类A和B,当new A()或者n ...
- Java对象的内存(一)
前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...
- java对象在内存中的分配
java对象在内存中的分配 http://blog.csdn.net/qq_30753945/article/details/54974899
- 10 Java 对象的内存布局
Java 创建对象的方式 1:new 语句和反射机制创建.该方式会调用类的构造器,同时满足诸多约束.如果一个类没有构造器的话,Java 编译器会自动添加一个无参数的构造器.子类的构造器需要调用父类的构 ...
随机推荐
- iOS开源项目周报0223
由OpenDigg 出品的iOS开源项目周报第九期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等.panelkit ...
- SearchRequestBuilder常用方法说明
SearchRequestBuilder常用方法说明 (1) setIndices(String... indices):上文中描述过,参数可为一个或多个字符串,表示要进行检索的index: (2) ...
- vs2015编译时CS1056 C# Unexpected character解决办法
https://stackoverflow.com/questions/42932577/error-cs1056-unexpected-character-running-the-msbuild-o ...
- WPF月视图控件
简介 在做一个应用时,需要做成日历月视图的形式.自己做较麻烦,于是上网找找看,在CodeProject上发现了这个Quick and Simple WPF Month-view Calendar,可是 ...
- c 语言 随机生成数函数
int theRandom = 0; theRandom = arc4random_uniform(3)//随机生成一个从0到2的数 或者 #include "stdio.h" # ...
- SSM实现图片上传管理操作
Spring MVC 实现文件上传 时序图 利用 Spring MVC 实现文件上传功能,离不开对 MultipartResolver 的设置.MultipartResolver 这个类,你可以将其视 ...
- HDU 2955(01背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2955 这道题求不被抓时的最大金钱.金额是整数,概率是小数.因为数组小标不能是小数,所以我们可以以钱作为weigh ...
- 理解position:relative
前言:position有5个属性:static.absolute.relative.fixed和inherit.本篇博客主要介绍relative属性,因为似乎很多人对这个属性的理解很模糊,而且不清楚r ...
- 使用javascript调用android代码
1.使用webview对象的addJavascriptInterface方法 2.addJavascriptInterface方法有两个参数,第一个参数就是我们一般会实现一个自己的类,类里面提供我们要 ...
- JavaScript - 收藏集 - 掘金
Angular 中的响应式编程 -- 浅淡 Rx 的流式思维 - 掘金第一节:初识Angular-CLI第二节:登录组件的构建第三节:建立一个待办事项应用第四节:进化!模块化你的应用第五节:多用户版本 ...