1创建对象

String s ;创建引用,并未初始化,即引用未关联任何东西

String s2="asda"; 初始化
System.out.println(s2);
System.out.println(s);//报错

用new 来初始化

String s = new String("sgjadfjaf");

1.1如何存储

程序运行时,对象时怎么放置安排的呢?内存怎么分配的呢?

 (1)寄存器

  --处理器内部,外部程序感觉不到其存在

(2)堆栈

  --位于RAM(随机访问存储器中),通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。java系统必须知道存放在堆栈上所有对象的确切生命周期,以便上下移动堆栈指针,但这一约束限制了程序的灵活性,所以最燃某些java数据存储在堆栈中--特别是对象引用,但是java对象并不存在其中。

(3)堆

  一种通用的内存池(也位于RAM中),用于存放所有的java对象。堆不同与堆栈的好处是:编译器不需要知道存储的数据在堆栈里存活多长时间。因此在堆里分配时有很大的灵活性。当需要一个对象时,只要new一下,当执行到new时,会自动在堆里进行存储分配。当然,这种灵活性也要付出相应的代价;用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。

(4)常量对象

  常量值通常直接存放在程序代码内部,这样做是安全的,因为他们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分割离开,这种情况下可以存放在只读存储器ROM中。

(5)非RAM存储

  如果数据完全存活在程序之外,那么它可以完全不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是 流对象和持久化对象。在流对象中,对象转化成字节流,通常被发送给另一台机器。在“持久化对象”中,对象被存放于磁盘上,因此即使程序被终止,他们仍能保持自己的状态。这种存储的技巧在于:把对象转化成可以存放在其他媒介上的事物,在需要时,可以恢复成常规的、基于RAM的对象。java提供了对轻量级持久化的支持,而存储JDBC和hibernate这样的机制提供了更加复杂的对在数据数据库中存储和读取对象信息的支持。

1.2 特例:基本类型

  在程序设计时经常使用到一系列基本类型,他们需要特殊对待,因为new将对象存储在“堆”里,故用new创建一个对象--特别是小的、简单的变量,往往不是很有效。java对于这种类型不用new 来创建变量,而是创建一个并非是引用的“自动”变量、这个变量是直接存储“值”,并置于堆栈中,因此更加高效。

序号

数据类型

位数

默认值

取值范围

包装器类型

1 byte(位) 8 0  -2^7 - 2^7-1 Byte
2 short(短整数) 16 0 -2^15 - 2^15-1 Short 
3 int(整数) 32 0 -2^31 - 2^31-1 Integer
4 long(长整数) 64 0 -2^63 - 2^63-1 Long
5 float(单精度) 32 0.0 -2^31 - 2^31-1 Float
6 double(双精度) 64 0.0 -2^63 - 2^63-1 Double 
7 char(字符) 16 0 - 2^16-1 Character
8 boolean(布尔值) 8 false true、false

Boolean

9          void                                                                             Void

  JAVA提供 了自动拆装箱的功能

高精度数字

java提供了两个高精度计算的类:BigInteger 和 BigDecimal,它们大体属于包装器的范畴,但是却没对应的基本类型。

这两个类以方法调用的方式取代运算符方式来实现运算,所以速度会比较慢,但是以速度换取了精度

BigInteger 支持任意精度的整数,可以表示任意大小的整数值,而不损失精度。

BigDecimal 支持任意精度的定点数,可以进行精确地货币计算

1.3java中的数组

java会确保数组被初始化,而且不能被他的范围之外访问。这种范围检查是以每个数组上少量的内存开销及运行时的下标检查为代价的,因此换来了安全性和效率的提升。

当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化一个特定值,该值拥有自己的关键字null.一旦java看见null,就知道这个引用还未指向某个对象,运行时就会报错。

2.永远不需要销毁对象

2.1 作用域

{

}

2.2对象的作用域

java对象的作用域不具备和基本类型一样的生命周期。new一个java对象时,它可以存活作用域之外。

{

  String  s = new String(" a String");

}//end of Scope

引用s在作用域终点就消失了。然而s指向的String对象继续占用着内存空间。java通过垃圾回收器完成对不在引用的对象的回收,释放内存空间。

2.3创建类

class

字段和方法

方法、参数和返回值、参数列表

2.4 static关键字

  static关键字解决了,一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至不需要创建对象。另一种情形是,希望某个方法不与包含它的类的任何对象关联在一起,即使没有创建对象,也能够调用这个方法。

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

尽管当static作用于某个字段时,肯定会改变数据创建的方式(因为一个static字段对每个类来说都只有一份存储空间,而非static字段则是对每个对象有一个存储空间),但是如果static作用域某个方法,差别却没有那么大。static方法的一个重要用法就是在不创建任何对象的前提下就可以调用它,正如我们所看到的那样,这一点对main()方法很重要,这个方法是运行一个应用的入口点。

和其他任何方法一样,static方法可以创建或使用与其类型相同的被命名对象,因此,static方法常常拿来做“牧羊人”的角色,负责看护与其隶属同一类型的实例群。

java编程思想(2)--一切都是对象的更多相关文章

  1. 《java编程思想》一切都是对象

    1. 用引用操纵对象 在Java中一切皆对象,我们平常在对java中的类进行操作时,其实操作的不是对象本身而是对象的引用.我们可以将这想象成用遥控器(引用)操作电视机(对象),只要握住这个遥控器,就能 ...

  2. JAVA编程思想(1) - 一切都是对象

     -"假设我们说还有一种不用的语言,那么我们就会发觉一个有些不同的世界" 1. 用引用操纵对象        每种编程语言都有自己的数据处理方式. 有些时候,程序猿必须时刻留意准备 ...

  3. 阅读java编程思想之一切都是对象

    温故而知新--- 1. 用句柄操作对象 现实生活中,我们可以把遥控器当作句柄,电视机当作对象.当我们拿到句柄(遥控器)的时候,我们是可以控制对象的(电视机).比如说调节音量大小,色彩等.那么在程序里, ...

  4. Java程序员的日常——《编程思想》一切都是对象

    今天终于看完了第一章,哈哈,万事开头难....刚开始被编程思想的第一章给蒙住了,讲一堆理论,没什么意思.从第二章开始,真正的开始讲解Java相关的内容,有了一定的开发经验后,再次阅读起来,感觉收获良多 ...

  5. Java编程思想 4th 第1章 对象导论

    所有编程语言都提供抽象机制. 面向对象编程似乎是一种很好的编程思想和方式,面向对象编程中的对象简洁描述是:对象具有状态.行为和标识.状态指的是数据存储,存储的数据能反应状态:行为指的是方法,方法表示对 ...

  6. 《Java编程思想》笔记 第一章 对象导论

    1.抽象过程 Q:什么是对象??? A:   1) 万物皆对象 --- 对象具有状态,行为和标识 2)程序是对象的集合,他们通过发送消息来告诉彼此要做的 3)通过创建包含现有对象的包的方式来创建新类型 ...

  7. Java编程思想 - 第11章 持有对象

    · 大量笔记存放在Github Java文件中,请移步查看:https://github.com/iGuure/AndroidCodeHub/tree/master/Java%20pratice/Th ...

  8. Java编程思想读书笔记 第一章 对象导论

    抽象过程 纯粹的面向对象程序设计方式: 万物皆为对象: 对象可以存储数据,还可以在其自身执行操作 程序是对象的集合: 通过发送消息告诉彼此要做的 每个对象都有自己的由其它对象构成的存储:可以在程序中构 ...

  9. Java编程思想 4th 第2章 一切都是对象

    Java是基于C++的,但Java是一种更纯粹的面向对象程序设计语言,和C++不同的是,Java只支持面向对象编程,因此Java的编程风格也是纯OOP风格的,即一切都是类,所有事情通过类对象协作来完成 ...

  10. Java编程思想读书笔记(一)【对象导论】

    2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...

随机推荐

  1. centos 进程查看

    查看pid 所属文件/项目 ps -aux |grep -v grep|grep 51073

  2. void的几点用法

    1.可以通过void 0 获取undefined.等同于void(0). void 任意数 === undefined   // true void(0) === undefined  // true ...

  3. Shell脚本的学习笔记一:变量

    三种变量: 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量. 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需 ...

  4. MySQL常用内置函数

    本篇博客源自以下博客地址: http://www.mamicode.com/info-detail-250393.html

  5. scrapy框架的日志等级和请求传参

    日志等级 请求传参 如何提高scrapy的爬取效率 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息 ...

  6. day07 深浅拷贝

    今日概要 深浅拷贝(重点) 文件操作 详细内容 直接赋值: 直接将对象的引用赋值给另一个对象 v1=1000 v2=v1 #v1 v2指向同一个内存地址 print(id(v1),id(v2))#相等 ...

  7. 我的代码-cleaning

    # coding: utf-8 # In[18]: import pandas as pdimport numpy as npfrom sklearn import treefrom sklearn. ...

  8. 原来bug解决了,是这样的感觉

    终于过了,感觉好想哭啊,又莫名其妙的爽,原来这就是bug

  9. BIOS + MBR > UEFI + GPT

    BIOS + MBR > UEFI + GPT硬件接口系统与磁盘分区UEFI用于取代老旧的BIOS,而GPT则取代老旧的MBR. 名词解释: BIOS (Basic Input/Output S ...

  10. 关于C++指针

    C++继承于C,对C的语法做了一些扩展.C语言中的指针占一个机器长度(32位处理器上一个指针占32位,64位处理器上安装64位操作系统一个指针占64位),指针的作用就是使用这块内存(4字节或者8字节) ...