JAVA编程思想(1) - 一切都是对象
-“假设我们说还有一种不用的语言,那么我们就会发觉一个有些不同的世界”
1. 用引用操纵对象
每种编程语言都有自己的数据处理方式。
有些时候,程序猿必须时刻留意准备处理的是什么类型。
您曾利用一些特殊语法直接操作过对象。或处理过一些间接表示的对象吗(C或C++里的指针)?
全部的这一切在JAVA里都得到了简化。在JAVA里一切都被视为对象,虽然是一切都被看成对象。但操纵的标识符实际上是一个“引用”而已。简单来说是:对象好比”电视“。我们拥有的引用是"遥控器",因此我们即使没有对象的真实存在,我们也能够拥有引用,也就说你能够拥有一个引用。而它并不须要和一个对象关联
如: String s;
我们这里创建的仅仅是引用,并非对象,假设此时向s发送一个消息。就会返回一个执行错误。由于没有真正的对象与它关联。因此一个安全的做法是:创建一个引用同一时候进行初始化。
如: String s = "haha";
这里用到了Java语言的一个特性:字符串能够用带引號的文本初始化,通常,必须对“对象”採用一种更通用的初始化方法。
2. 必须由你创建全部的对象
(1) 一旦创建一个引用,就希望它能与一个新的对象相关联。通经常使用new操作符来实现这一目的。
如: String s = new String("haha");
----------------------------------------------------------------------------------------------------------------------------------------------------
(2) 程序执行时,有五个不同的地方能够储存数据
-寄存器:这是最快的存储区。由于它位于不同于其它储存区的地方——处理器内部。可是数量有限,所以须要进行分配。无法直接控制(还有一方面,C和C++同意你向编译器建议寄存器的分配方式)
-堆栈:位于通用RAM(随机訪问存储器)中。但通过堆栈指针能够从处理器那里获得直接的支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。分配储存方式效率仅次于寄存器
-堆:一种通用的内存池(也位于RAM),用于存放全部的对象。堆不同于堆栈的优点是:编译器不须要知道存储的数据在堆里存活多长时间。因此有很多其它的灵活性。能够方便创建对象。
可是因此付出的代价是:用堆进行存储分配和清理能够比用堆栈分配更须要时间(假设确实能够在Java中像在C++一样在栈中创建对象)
-常量存储:常量值通常直接存放在程序代码内部。这样做非常安全,由于它永远不会被改变
-非RAM存储:假设数据全然存活在程序之外。那么它能够不受程序的不论什么控制,在程序没有执行时也能够存在。
当中两个主要的样例是流对象和持久对象。在流对象中。对象转化成字节流。通常被发送到还有一台机器。在持久化对象中,对象被存放在磁盘上。因此即使程序终止了,它们仍然保持自己的状态。正如Java提供的对轻量级持久化的支持
----------------------------------------------------------------------------------------------------------------------------------------------------
(3) 特例:基本类型
-在程序设计中经经常使用到一系列类型,它们须要特殊对待,能够把他们想象成“基本”类型。
之所以特殊对待,是由于new将对象存储在“堆”里,故用new创建一个对象——特别是小的。简单的变量。往往不是非常有效。因此,对于这些类型。Java採用和C和C++同样的方法,也就是不用new来创建变量。而是创建一个并非是引用的“自己主动”变量。
这个变量直接存储“值”并置于堆栈中,因此更加有效
-Java要确定每种基本类型所占存储空间的大小。它们的大小并不像其它大多数语言那样随机器硬件架构的变化而变化这样的所占空间大小的不变性是Java程序比其它大多数语言编写的程序更具可移植性的原因之中的一个。
----------------------------------------------------------------------------------------------------------------------------------------------------
(3) Java中的数组
-差点儿全部的程序设计语言都支持数组,在C和C++中使用数组是危急的。由于C和C++中数组就是内存快。假设一个程序要訪问其内存块之外的数组,或在数组初始化前使用内存。都会产生难以预料的后果。
-Java的主要目标之中的一个是安全,所以Java确保数组会被初始化。并且不能在它的范围之外被訪问。这样的范围检查,是以每一个数组上少量的内存开销及执行时的下标检查为代价换来安全性和效率的提高。
-当创建一个数组对象时,实际上就是创建一个引用数组。并且每一个引用都会自己主动被初始化为一个特定值。该值拥有自己的keywordnull。一旦Java看到null,就知道这个引用还没有指向某个对象,试图使用一个null引用是会造成执行错误的。对于基本类型的数组,Java会为这样的数组所占的内存全部置0
3. 永远不须要销毁对象
-大多数的程序设计语言中,变量的生命周期的概念,占领了程序设计工作中非常重要的部分。
(1) 作用域
作用域决定了在其内定义的变量名的可见性和生命周期。
在C和C++以及Java中,作用域由花括号决定的。
{
int x = 12;
// only x available
{
int q = 36;
//both x & q available
}
//only x available
// q is "out of scope"
}
还有在Java中不同意重命名
{
int x = 12;
{
int x = 96; // Illegal
}
}
(2) 对象的作用域
Java对象不具备和基本类型一样的生命周期。当用new创建一个对象时,它能够存活于作用域之外
{
String s = new String("a string");
} // End of scope
引用s在作用域终点就消失了。然后,s指向的String对象仍继续占用内存空间。
我们无法在作用域之后訪问消失的对象引用。
-事实证明,由new创建的对象,仅仅要你须要,就会一直保留下去。这样,很多C++编程问题在Java就全然消失了。
我们不必在像在C++一样:实时关注我们的对象。
在Java中有一个“垃圾回收器”来监视用new创建的对象。一旦不再须要了,它们就会被回收。这样做就消除了这类编程问题(即:内存泄露)。
JAVA编程思想(1) - 一切都是对象的更多相关文章
- 《java编程思想》一切都是对象
1. 用引用操纵对象 在Java中一切皆对象,我们平常在对java中的类进行操作时,其实操作的不是对象本身而是对象的引用.我们可以将这想象成用遥控器(引用)操作电视机(对象),只要握住这个遥控器,就能 ...
- 阅读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编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
随机推荐
- 2. ZooKeeper基础
1. ZooKeeper的特性 ZooKeeper的特性主要从会话.数据节点,版本,Watcher,ACL权限控制,集群角色这些部分来了解,其中需要重点掌握的数据节点与Watcher 1.1 会话 客 ...
- winform中进行post上传文件
winform中要上传文件到远程的服务器上面,我在本地用的是post方式传递数据,用的是HTTP协议,具体代码如下: 下面的代码就是一个上传的方法,参数需要路径和文件路径就可以了,我本地winform ...
- ES6——解构赋值
解构赋值: 注意: 1.左右两边结构必须一样 练习1,2,3 2.右边必须是个东西(有值)练习4 3.声明和赋值不能分开(必须在一句话里完成)练习5 /* 练习1: // let arr = [1,2 ...
- linux清理缓存
在free -h中查看自己的内存发现在运行一段时间后,有很多内存都被缓存占用, 所以要清理下缓存,增大可用内存 直接进入root账户,输入以下命令 echo 3 > /proc/sys/vm/d ...
- wraps的补充
# import time# def index(name):# '''index函数'''# time.sleep(1)# print('Welcome %s to China'%name)# re ...
- JPA @Id 和 @GeneratedValue 注解详解
JPA @Id 和 @GeneratedValue 注解详解 @Id: @Id 标注用于声明一个实体类的属性映射为数据库的主键列.该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上 ...
- sublime text3 手动安装插件package control
好久没写了,今天换了新电脑,先安装前端神器“sublime” 一,安装 下载sublime,官方网址:http://www.sublimetext.com/: 二.插件包安装( Package Con ...
- docker 报错端口被占用 sqlserver 占用80端口
本想开启个容器,却发现有程序居然占用了我的80端口 C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response fr ...
- 【靶场练习_sqli-labs】SQLi-LABS Page-2 (Adv Injections)
Less-21:括号+单引号绕过+base64cookie编码 总感觉我已经把sql注入做成代码审计了:P <?php //including the Mysql connect paramet ...
- ansible控制winserver笔记
原文地址: https://www.cnblogs.com/kingleft/p/6391652.html 环境描述: ansible控制远程windows .系统必须是sp1 .安装framewor ...