java编程思想(2)--一切都是对象
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)--一切都是对象的更多相关文章
- 《java编程思想》一切都是对象
1. 用引用操纵对象 在Java中一切皆对象,我们平常在对java中的类进行操作时,其实操作的不是对象本身而是对象的引用.我们可以将这想象成用遥控器(引用)操作电视机(对象),只要握住这个遥控器,就能 ...
- JAVA编程思想(1) - 一切都是对象
-"假设我们说还有一种不用的语言,那么我们就会发觉一个有些不同的世界" 1. 用引用操纵对象 每种编程语言都有自己的数据处理方式. 有些时候,程序猿必须时刻留意准备 ...
- 阅读java编程思想之一切都是对象
温故而知新--- 1. 用句柄操作对象 现实生活中,我们可以把遥控器当作句柄,电视机当作对象.当我们拿到句柄(遥控器)的时候,我们是可以控制对象的(电视机).比如说调节音量大小,色彩等.那么在程序里, ...
- Java程序员的日常——《编程思想》一切都是对象
今天终于看完了第一章,哈哈,万事开头难....刚开始被编程思想的第一章给蒙住了,讲一堆理论,没什么意思.从第二章开始,真正的开始讲解Java相关的内容,有了一定的开发经验后,再次阅读起来,感觉收获良多 ...
- Java编程思想 4th 第1章 对象导论
所有编程语言都提供抽象机制. 面向对象编程似乎是一种很好的编程思想和方式,面向对象编程中的对象简洁描述是:对象具有状态.行为和标识.状态指的是数据存储,存储的数据能反应状态:行为指的是方法,方法表示对 ...
- 《Java编程思想》笔记 第一章 对象导论
1.抽象过程 Q:什么是对象??? A: 1) 万物皆对象 --- 对象具有状态,行为和标识 2)程序是对象的集合,他们通过发送消息来告诉彼此要做的 3)通过创建包含现有对象的包的方式来创建新类型 ...
- Java编程思想 - 第11章 持有对象
· 大量笔记存放在Github Java文件中,请移步查看:https://github.com/iGuure/AndroidCodeHub/tree/master/Java%20pratice/Th ...
- Java编程思想读书笔记 第一章 对象导论
抽象过程 纯粹的面向对象程序设计方式: 万物皆为对象: 对象可以存储数据,还可以在其自身执行操作 程序是对象的集合: 通过发送消息告诉彼此要做的 每个对象都有自己的由其它对象构成的存储:可以在程序中构 ...
- Java编程思想 4th 第2章 一切都是对象
Java是基于C++的,但Java是一种更纯粹的面向对象程序设计语言,和C++不同的是,Java只支持面向对象编程,因此Java的编程风格也是纯OOP风格的,即一切都是类,所有事情通过类对象协作来完成 ...
- Java编程思想读书笔记(一)【对象导论】
2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
随机推荐
- firstPage
自己写的科比的一个简单介绍的网页,画面,布局还是太垃圾了,图片放大缩小标签不知道,简直难受. <!DOCTYPE html><html> <head> <me ...
- Selenium HTMLTestRunner 执行测试成功但无法生成报告
为什么用PyCharm或者Eclipse执行测试成功但无法生成HTMLTestRunner报告 最近遇到一些人问这样的问题: 他们的代码写的没问题,执行也成功了,但就是无法生成HTMLTestRunn ...
- .net ORM框架(Dapper简单应用)
1.引入 Dapper.dll类库 2.创建书籍模型book using System; using System.Collections.Generic; using System.Linq; us ...
- scrapy中crawlspide中callback和follow函数的作用及使用方法
Rule(LinkExtractor(allow=r'i/tems'),callback='parse_item',follow=True) 当前代码的含义就是将当前页面及按照allow=r'i/t ...
- ip本地查询
下载地址:http://www.cz88.net/ http://www.crsky.com/soft/2611.html QQWry.dat文件在结构上分为3块:文件头,记录区,索引区. 一般我们要 ...
- 1.python+appium环境配置
环境部署 本博客以32位的Windows 7操作系统为例介绍Appium+Python的环境搭建步骤 1.安装Node.js 访问 https://nodejs.org/en/download/,下载 ...
- 关于idea的debug
idea的debug真的是超级好用哎.分享几个今天学会的新方式: 1.右键会发现此选项 ,点击出现 在输入框中输入,可以通过某些公式单独计算. 2.点击属性值,右键点击set values 会出现一个 ...
- C# 注册机功能开发,机器码设计
前言 本文将使用一个NuGet公开的组件技术来实现机器码注册码功能开发,提供了一些简单的API,来方便的实现. 在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet ...
- mission 01
A.自己目前在专业能力上的短板,及打算如何弥补. answer:由于在课本中所学的知识是死板的,加上不知如何课外提高自己在专业上的实践应用能力,所以我认为我在专业能力上的短板是缺乏将所掌握的知识应用到 ...
- ngnix 500错误原因分析
参考http://www.cnblogs.com/huqiang/p/5333975.html