(二)Java对象与内存控制
- 方法内的局部变量:作用域为方法体。
- 代码块内的局部变量:作用域为代码块
- 形参:方法内的形式参数,作用域为方法体。
静态变量或者类变量。
实例变量。
- package com.beijng.object;
- public class Object01 {
- //a变量在b变量没定义之前就引用它,属于非法前向引用
- int a = b + 1;
- int b = 2;
- }
- public class Object02 {
- //属于非法前向引用
- static int a = b + 1;
- static int b = 2;
- }
- public class Object01 {
- //完全正常
- int a = b + 1;
- static int b = 2;
- }
(1)b是类变量,a是实例变量,在java中,类变量的初始化总是在实例变量的初始化之前。
- 定义实例变量时指定初始值
- 非静态初始化块中为实例变量指定初始值
- 构造方法中对实例变量指定初始值
- package com.beijng.object;
- public class User {
- String username;
- String password;
- public User(String username,String password){
- System.out.println("执行构造方法");
- this.username = username;
- this.password = password;
- }
- {
- System.out.println("执行非静态初始化块");
- age = 18;
- }
- //定义时指定初始值
- int age =20;
- public String toString(){
- return "username="+username+",password="+password+",age="+age;
- }
- public static void main(String[] args){
- User user1 = new User("xiaoming","123");
- System.out.println(user1);
- }
- }
定义实例变量指定的初始值、初始化块中为实例变量指定初始值的语句地位是平等的,当经过编译器处理后,它
- package com.beijng.object;
- public class JavapToolTest {
- int a = 30;
- {
- a = 31;
- }
- public JavapToolTest(){
- System.out.println(a);
- }
- public JavapToolTest(String b){
- System.out.println(b);
- }
- }
Java对象是在构造方法中创建的吗?
- package com.beijng.object;
- class Base {
- private int i = 2;
- public Base(){
- System.out.println(this.i);//输出2
- this.display();
- }
- public void display(){
- System.out.println(i);//输出0
- }
- }
- class Derived extends Base {
- private int i = 22;
- public Derived(){
- i = 222;
- }
- public void display(){
- System.out.println(i);
- }
- }
- public class ConstructorTest {
- public static void main(String[] args) {
- new Derived();
- }
- }
:(1)构造方法只是负责对Java对象实例变量进行初始化(即赋予初始值),在执行构造方法之前,该对象所占
存已经被分配了,这些内存里都默认是控制,基本类型变量的默认值是0或false,引用类型变量的默认值都是
问题出现了?this代表哪个类的对象呢?
Derived的构造方法隐式调用了Base类的构造方法,所以此时this代表
Derived对象,而不是Base对象。
this虽然代表
Derived对象,但是它位于Base构造方法中,它的编译类型是Base,
Derived对象
Derived对象的i实例变量,也就是0.
(二)Java对象与内存控制的更多相关文章
- Java 对象及其内存控制
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 更新:其实这里有好多的变戏法,只要你理解了他们在JVM的中的实现机制,就豁然开朗了.有时间我会把这些变戏法的东西 ...
- JAVA对象与内存控制
1.1 实例变量和类变量 成员变量和局部变量: 局部变量分为三大类: 1)形参:在方法签名中定义的局部变量,由方法调用者为其赋值,随方法的结束而消亡. 2)方法内的局部变量:在方法内定义的局部变量,随 ...
- JVM总结-java对象的内存布局
在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我们还可以通过反射机制.Object.clone 方法.反序列化以及 Unsafe.allocateInstance ...
- 10 Java 对象的内存布局
Java 创建对象的方式 1:new 语句和反射机制创建.该方式会调用类的构造器,同时满足诸多约束.如果一个类没有构造器的话,Java 编译器会自动添加一个无参数的构造器.子类的构造器需要调用父类的构 ...
- Java对象的内存布局以及对象的访问定位
一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储 ...
- 3 Java对象的内存布局以及对象的访问定位
先来看看Java对象在内存中的布局 一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机 ...
- Java对象的内存模型(一)
前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...
- Java对象的内存布局
对象的内存布局 平时用java编写程序,你了解java对象的内存布局么? 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域: 对象头 实例数据 对齐填充 对象头 对象头包括两部分信息: ...
- java对象在内存的大小
前言 一直以来,对java对象大小的概念停留在基础数据类型,比如byte占1字节,int占4字节,long占8字节等,但是一个对象包含的内存空间肯定不只有这些. 假设有类A和B,当new A()或者n ...
随机推荐
- mjpg-streamer on raspberrypi
http://sourceforge.net/projects/mjpg-streamer/ svn address svn checkout svn://svn.code.sf.net/p/mjpg ...
- C调用OPENSSL做REST服务客户端的例子
//SSL-Client.c #include <stdio.h> #include <errno.h> #include <unistd.h> #include ...
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-006-给bean运行时注入值(Environment,Property文件)
一. 直观的给bean注入值如下: @Bean public CompactDisc sgtPeppers() { return new BlankDisc( "Sgt. Pepper's ...
- 【HDOJ】1016 Prime Ring Problem
经典DP,写的可能麻烦了一些. #include <stdio.h> #define false 0 #define true 1 ]; ]; ]; void DFS(int, int, ...
- 【DataStructure In Python】Python模拟二叉树
使用Python模拟二叉树的基本操作,感觉写起来很别扭.最近做编译的优化,觉得拓扑排序这种东西比较强多.近期刷ACM,发现STL不会用实在太伤了.决定花点儿时间学习一下STL.Boost其实也很强大. ...
- Java之String,StringBuffer,StringBuilder类
在 java 语言中, 用来处理字符串的的类常用的有 3 个: String.StringBuffer.StringBuilder. 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2 ...
- MyBatis学习总结2
这一篇讲述MyBatis对数据库的CRUD操作,内容不做重复,只做添加:查看学习总结1 一.使用MyBatis对表执行CRUD操作——基于XML的实现 在SQL映射文件userMapper.xml中添 ...
- poj3254Corn Fields(状压)
http://poj.org/problem?id=3254 第一个状压题 思路挺好想 用二进制表示每行的状态 然后递推 用左移 右移来判断是不是01间隔出现 c大神教的 我的代码WA在这个地方了.. ...
- bzoj2738
感人肺腑pascal过不去系列,跪求开O2先不说这个了,学完cdq分治之后又顺手学了一下整体二分感觉这两个东西很多相似的地方,干脆都叫cdq分治好了二分解决k小就是设当前二分的答案为m,把x<= ...
- C#的同步和异步调用方法
同步和异步大家都明白什么意思,在这里不多介绍了. namespace ConsoleTest { class Program { static void Main(string[] args) { C ...