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编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
随机推荐
- JSONP面试
jQuery 的 JSONP的原理是动态创建一个 script 标签,利用src 发送请求,获取数据 回调函数的键名叫做 callback 跟ajax没有关系 JSONP:主要是利用 script标 ...
- Linux系统平台调优
- jenkins持续集成(一): 在Linux下的安装与配置
撸了今年阿里.网易和美团的面试,我有一个重要发现.......>>> 前提: 安装了JDK,并配置好环境变量:JAVA_HOME 安装了Maven,并配置好环境变量:MAVEN_HO ...
- chrome插件研发手册
chrome插件研发手册 一:需求前景 对于研发的小伙伴来说,总会遇到这样的需求,想要通过代码操作已有网站的行为动作,如:自动填充表格内容(表单内容太多,想一键将表单内容填充):自动登录网站(网站登录 ...
- MFC的Dlg和App什么区别?应用程序类与对话框类
MFC里有个app类..他是一个项目工程类,有一个全局的实例化.theApp你可以理解为整个项目的实例,它重载了入口函数,所有的窗口神马的,都是在这个类里实例化的. dlg是对话框,是一个窗口.一个程 ...
- 【串线篇】Mybatis之缓存原理
所谓二级缓存是名称空间级别的缓存,什么意思呢? TeacherDao.xml首行 <mapper namespace="com.atguigu.dao.TeacherDao" ...
- nyoj 78:圈水池 【凸包入门】
题目链接 将所有点按从左至右顺序排序,然后将所有点先从左到右扫描再从右到左扫描,逐渐将凸包轮廓“勾勒”出来 (凸包轮廓满足,轮廓上连续的三个点按先后顺序给出的话呈逆时针方向) 最后删去一个重复的起(终 ...
- 学习笔记:Apache Kylin 概述
一.kylin解决了什么关键问题? Apache Kylin的初衷就是解决千亿.万亿条记录的秒级查询问题,其中的关键就是打破查询时间随着数据量呈线性增长的这一规律. 大数据OLAP,我们可以注意到两个 ...
- boost datetime
To create a date, use the class boost::gregorian::date 1. date #include <boost/date_time/gregoria ...
- HTML基础知识笔记摘要
HTML互联网三大基石:1.HTML:显示数据2.HTTP:传输数据 http传输协议3.URL:定位数据协议://ip地址或主机名:端口/网络中的内容... HTML(hyper text make ...