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 编译器会自动添加一个无参数的构造器.子类的构造器需要调用父类的构 ...
随机推荐
- $emit子组件传出多个参数,如何在父组件中在接收所有参数的同时添加自定义参数
很多时候用$emit携带参数传出事件,并且又需要在父组件中使用自定义参数时,这时我们就无法接受到子组件传出的参数了. 找到了两种方法可以同时添加自定义参数的方法. 方法一:子组件传出单个参数时 ...
- GitHub和git和repo的使用
1. GitHub的使用 https://github.com/maogefff/GitHub-git-repo 2. git的使用 https://github.com/maogefff/GitHu ...
- ansible 回调函数处理
https://www.u3v3.com/ar/1421 https://serversforhackers.com/c/running-ansible-2-programmatically
- jquery选择器【总结】
本文总结整理了jquery里和选择器相关的所有方法,通过这篇文章,可以让你学习到在jquery里使用选择器的所有方法. 一:基本选择器: $("#aijquery") 选择id值等 ...
- c#之泛型详解(Generic)
这篇文章主要来讲讲c#中的泛型,因为泛型在c#中有很重要的位置,对于写出高可读性,高性能的代码有着关键的作用. 一.什么是泛型? 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个非 ...
- [javaSE] IO流(递归查找指定文件)
递归方法,实现查找目录中以.java为后缀的文件路径,并存入文本文件中 定义一个静态方法fileToLine(),传入参数:File对象目录,List集合对象(List<File> 这样做 ...
- Reddit: 只有独生子女才明白的事
duhvorced: 对我来说,恋爱成了件异常艰难的事. 我一直很羡慕有兄弟姐妹的人,特别是有异性兄弟姐妹的.他们能够在成长过程中明白异性对身体.友情的看法,知道他们如何处理不安全感,如何应对同龄人之 ...
- Java新人拿到一台新的电脑需要装配什么
适用对象:新手 装备:win10 一.IDEA 插件等 说明 其他 TranslationPlugin 翻译插件 GitHub地址 MyBatis-Generator 自动生成Mybatis文件 Al ...
- 线程协作--wait,notify:经典消费者生产者
JDK 中关于wait,notify这两个方法的介绍: 1.wait:线程进入阻塞. synchronized (obj) { while (<condition does not hold&g ...
- eclipse中编写运行c/c++
注意:此过程有点复杂 准备:1.MinGW:c/c++运行环境: 2.CDT 1.MinGW:安装程序:http://sourceforge.net/projects/mingw/?source=ty ...