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对象与内存控制的更多相关文章

  1. (二)Java对象与内存控制

    一.java的类变量和实例变量: java中的变量可分成两种:成员变量和局部变量. 1.局部变量包括以下几类: 方法内的局部变量:作用域为方法体. 代码块内的局部变量:作用域为代码块 形参:方法内的形 ...

  2. Java 对象及其内存控制

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 更新:其实这里有好多的变戏法,只要你理解了他们在JVM的中的实现机制,就豁然开朗了.有时间我会把这些变戏法的东西 ...

  3. Java对象的内存模型(一)

    前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...

  4. Java对象的内存布局

    对象的内存布局 平时用java编写程序,你了解java对象的内存布局么? 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域: 对象头 实例数据 对齐填充 对象头 对象头包括两部分信息: ...

  5. JVM总结-java对象的内存布局

    在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我们还可以通过反射机制.Object.clone 方法.反序列化以及 Unsafe.allocateInstance ...

  6. java对象在内存的大小

    前言 一直以来,对java对象大小的概念停留在基础数据类型,比如byte占1字节,int占4字节,long占8字节等,但是一个对象包含的内存空间肯定不只有这些. 假设有类A和B,当new A()或者n ...

  7. Java对象的内存(一)

    前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...

  8. java对象在内存中的分配

    java对象在内存中的分配 http://blog.csdn.net/qq_30753945/article/details/54974899

  9. 10 Java 对象的内存布局

    Java 创建对象的方式 1:new 语句和反射机制创建.该方式会调用类的构造器,同时满足诸多约束.如果一个类没有构造器的话,Java 编译器会自动添加一个无参数的构造器.子类的构造器需要调用父类的构 ...

随机推荐

  1. JAVA基于权重的抽奖

    https://blog.csdn.net/huyuyang6688/article/details/50480687 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果中A:B:C:D的 ...

  2. json和xml以及ajax的数据格式用法

    JSON的两个方法: 1.将字符串转换为JSON格式:parse(). 2.将原生JavaScript值转换为JSON字符串:stringify(); <!DOCTYPE html> &l ...

  3. vue-pdf的3.3.1版本build后多生成168个js文件

    当同事使用vue-pdf来浏览pdf之后,就发现build之后一堆散乱的js文件,真可怕! 果然google之后是它的原因.参考:Vue-pdf create 168 excess bundles i ...

  4. Action、View、ActionResult、ViewResult、ContentResult

    可以,ASP.NET MVC的view和Controller不是严格的匹配的,一个Action Method可以引用多个view,而一个View也可以被一个Action方法使用如下代码所示:    1 ...

  5. Dapper的简单使用(初学者归纳)

    Dapper的简单使用(初学者归纳) //引用:using System;using System.Collections.Generic;using System.Linq;using System ...

  6. .NET MVC自定义Html辅助方法

    using System;using System.Web.Mvc;using System.Web.Routing; namespace MvcTest2.Helpers{ public stati ...

  7. 撩课-Java每天10道面试题第3天

    21.final, finally, finalize的区别 1.final修饰符(关键字). 被final修饰的类, 就意味着不能再派生出新的子类, 不能作为父类而被子类继承. 因此一个类不能既被a ...

  8. java核心技术-NIO

    1.reactor(反应器)模式 使用单线程模拟多线程,提高资源利用率和程序的效率,增加系统吞吐量.下面例子比较形象的说明了什么是反应器模式: 一个老板经营一个饭店, 传统模式 - 来一个客人安排一个 ...

  9. [LeetCode]Maximum Subarray题解

    Maximum Subarray: Find the contiguous subarray within an array (containing at least one number) whic ...

  10. 第一个Windows窗口应用程序

    学习目的 熟悉开发工具Visual C++ 6.0和MSDN 2001的使用. 应用Windows API函数, 手工编写具有最基本构成的Windows窗口应用程序(包含WinMain入口函数, 消息 ...