-- -- -- -- -- -- -- -- --

  大杂烩 -- Java内存布局【图】以及java各种存储区【详解】

-- -- -- -- -- -- -- -- --

  1. 用引用操纵对象

    在Java中,一切都被视为对象。尽管一切都看作对象,但操纵的标识符实际上时对象的一个“引用(reference)”。

  可以将这一情形想象成用遥控器(引用)来操纵电视机(对象)。只要握住这个遥控器(引用),就能保持与电视机(对象)的连接。当想改变频道或减少音量(改变属性值)时,实际操控的时遥控器(引用),再由遥控器(引用)来调控电视机(对象)。如果想在房间里四处走走(进入方法),同时仍能调控电视机,那么只需携带遥控器(引用)而不是电视机(对象)。

  此外,即使没有电视机,遥控器亦可独立存在。也就是说,你拥有一个引用,并不一定需要有一个对象与它关联。(对象不一定必须有引用才可以存在,比如匿名对象)。  

  2. 创建对象(new、反射、序列化、克隆)

    通常用new操作符来实现这一目的。

String str = new String("lime");

  2.1 对象存储的位置

    Q:程序运行时,对象是怎么进行放置安排的?

    Q:内存时怎样分配的?

    1. 寄存器:

      最快的存储区,位于处理器内部

    2. 堆栈:

      存放对象引用。位于通用RAM中,堆栈指针向下移动,则分配内存;向上移动,则释放内存。

      创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期。

    3. 堆:

      一种通用的内存池(位于RAM区),用于存放所有的Java对象。堆不同与堆栈的好处时:编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当需要一个对象时,只需用new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。用堆进行存储分配和清理需要更多时间:垃圾回收机制。

    4. 常量存储:

      常量值通常直接存放在程序代码内部。

    5. 非RAM存储:

      流对象、持久化对象      

  2.2 特例:基本类型

    直接存储“值”,并置于堆栈中。

    包装器类

    高精度数字:BigInteger、BigDecimal(以速度换取精度)

      BigInteger : 支持任何精度的整数。

      BigDecimal : 支持任何精度的定点数。

  2.3 数组

    1. 基本数据数组:编译器将基本数据数组所占的内存全部置零,以确保数组的安全初始化。

    2. 对象数组 : 当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null。一旦Java看到null,就知道这个引用还没有指向某个对象。在使用任何引用钱,必须为其指定一个对象;如果试图使用一个还是null的引用,在运行时将会报错。

  3. 对象的销毁:堆栈、堆

    1. 作用域(堆栈)

      在C、C++和Java中,作用域由花括号{}的位置决定。

      作用域决定了在其内定义的变量名的可见性和生命周期。

      在作用域里定义的变量只可用于作用域结束之前。

    {
int x = 12;
{
int x = 12; //Illegal
int y = 96;
}
int y = 96; //ok
}

    2. 对象的作用域(堆)

      Java对象不具备和基本类型一样的生命周期。 当new创建一个Java对象时,它可以存活于作用域之外(花括号之外)。

      如:

    {
String s = new String("This is a string");
} // End of scope

      引用s(堆栈)在作用域终点就消失了。然而,s指定的String对象(堆)仍然占据内存空间。在这一小段代码中,我们无法在这个作用域之后访问这个对象,因为对它唯一的引用已超出了作用域的范围。扩展:在程序执行的过程中,怎样传递和复制对象引用。

      由new创建的对象(堆),会一直保留下去。由Java的垃圾回收器来监视new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便共其他新的对象使用。

  4. 自定义数据类型:类

    class className{}

    1. 字段和方法

      在类中可以设置两种类型的元素:字段、方法

      字段可以是任何类型的对象,可以通过其引用与其进行通信;也可以时基本类型中的一种。如果字段时对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象相关联。

      每个对象斗殴用来存储其字段的空间;普通字段不能在对象见共享(static 域 可以共享)。

      引用一个对象的成员,需要使用连接句点"."

        Data data = new Data();
data.i = 131;

    2. 基本成员默认值

      若类的某个成员时基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值。

基本类型 默认值
boolean false
char '\u0000'(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d

  

      

当变量作为类的成员使用时,Java才确保给定其默认值,以确保那些是基本类型的成员变量得到初始化,防止产生程序错误。

  5. 方法、参数和返回值

    方法的基本组成部分:名称、参数、返回值、方法体。

    void functionName(String msg){
//dosomething
}

    返回类型描述的是在调用方法之后从方法返回的值。

    参数列表给出了要传给方法的信息的类型和名称。

    方法名和参数列表唯一地标识一个方法,称为方法签名。

    Java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用(static 方法 可以通过类调用),且对象必须能执行方法调用。

    调用方法的行为通常被称为 发送消息给对象 。

    如:

        long time = date.getTime();

    消息时getTime(),对象时date。

    1. 参数列表

      Java中任何传递对象的场合中,都是引用传递。

  6. 构建程序须知

    1. 名字可见性

      反转域名

    2. 运用其他构件

      import

    3. static 关键字

      通常来说,当创建类时,就是在描述那个类的对象的外观与行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才内分配,其方法才供外界调用。

      有两种情形用上述方法时无法解决的:

        1. (静态域)只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象。

        2. (静态方法)希望某个方法不与包含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用这个方法。

      通过static关键字可以满足这两方面的需要。

      当声明一个事物时static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使未创建某个类的任何对象,也可以调用其static方法或访问其static域。

      通常,你必须创建一个对象,并用它来访问数据或方法。因为非static域和方法必须知道它们一起运作的特定对象。

  7. 第一个Java程序:HelloWorld

  8. 注释和嵌入式文档

  9. 编码风格

  10. 总结

 练习:

啦啦啦

    

ThinkingInJava 学习 之 0000001 一切都是对象的更多相关文章

  1. 重新开始学习javase_一切都是对象

    @学习thinking in java 一,一切都是对象 用句柄操纵对象 每种编程语言都有自己的数据处理方式.比如说c与c++中的指针,而java中尽管将一切都“看作”对象,但操纵的标识符实际是指向一 ...

  2. 【学习笔记】深入理解js原型和闭包(1)—— 一切都是对象

    “一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的运算符——typeof.typeof ...

  3. 程序猿都没对象,JS竟然有对象?

    现在做项目基本是套用框架,不论是网上的前端还是后端框架,也会寻找一些封装好的插件拿来即用,但还是希望拿来时最好自己过后再回过头了解里面的原理,学习里面优秀的东西,不论代码封装性,还是小到命名. 好吧, ...

  4. 从零开始学习jQuery (五) 事件与事件对象

    本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...

  5. 深入理解javascript原型和闭包(1)——一切都是对象

    “一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的函数——typeof().typeo ...

  6. JavaScript学习09 函数本质及Function对象深入探索

    JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...

  7. asp.net学习之GridView事件、GridViewRow对象

    原文:asp.net学习之GridView事件.GridViewRow对象 1. GridView控件的事件 GridView有很多事件,事件可以定制控件的外观或者行为.事件分为三类     1.1 ...

  8. Javascript学习1 - Javascript中的类型对象

    原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...

  9. thinkinginjava学习笔记04_初始化与清理

    java沿用了c++的构造器,使用一个和类名完全一样的方法作为类的构造器,可以有多个构造器来通过不同的参数进行构造,称为重载:不仅是构造器可以重载,其他方法也一样通过不同的形参以及不同的返回值来实现重 ...

随机推荐

  1. [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

    2003的access数据库文件后缀是mdb2007的access数据库文件后缀是accdb 我装的access2010所以驱动程序选择“Microsoft Access Driver (*.mdb, ...

  2. Revit API根据链接文件开洞

    开洞信息数据: ]);             ;                     ;                     ;                     ;          ...

  3. 深入学习 FutureTask

    原文出处: 天凉好个秋 第一部分:What 在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建多线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此 ...

  4. 普通用户使用docker命令免sudo权限的问题

    方法很多,只写一种 操作步骤: 使用有sudo权限的帐号登录系统. 创建docker分组,并将相应的用户添加到这个分组里面. sudo usermod -aG docker your_username ...

  5. Intellij IDEA 通过数据库表逆向生成带注释的实体类文件超级详细步骤,附详细解决方案

    参考:https://blog.csdn.net/qq_34371461/article/details/80571281  https://blog.csdn.net/mqchenrong/arti ...

  6. Facebook在代码里下毒,百度身受重伤。。。

    白首相知犹按剑     前两天看到有朋友分享说,WordPress停用了react.今天,在逛知乎时看到了另一个问题别细看这图,我赌你看不懂... 嗯...用人话来说就是百度内部要求他们的程序猿不要再 ...

  7. CentOS 6下 Oracle11gR2 设置开机自启动

    [1] 更改/etc/oratab # This file is used by ORACLE utilities. It is created by root.sh # and updated by ...

  8. List or delete hidden files from command prompt(CMD)

    In Windows, files/folders have a special attribute called hidden attribute. By setting this attribut ...

  9. system函数遇到的问题

     这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以 ...

  10. Socketserver 笔记

    引入Socketserver的背景: 我们之前使用socket编程的时候,Server端创建一个连接循环(建立连接)+一个通信循环(基于一次连接建立通信循环),(这里的黏包问题我们的实现方式是:我们在 ...