-“假设我们说还有一种不用的语言,那么我们就会发觉一个有些不同的世界”

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) - 一切都是对象的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. jsp页面必填项如何加红星号*

    1.加*号 并且设置*号大小 <span style="color:red; font-size: 20px">*</span>

  2. lvm相关

    LVM 概念:PV(单个硬件)--VG(组合)--LV(分区) pv打头的:代表pv相关的命令vg带头的:代表vg相关的命令lv带头的: 代表lv相关的命令 create:创建相关remove:移除相 ...

  3. 脚本_检测 MySQL 数据库连接数量

    #!bin/bash#功能:检测 MySQL数据库连接数量,以满足对 MySQL 数据库的监控需求,查看 MySQL 连接是否正常.#作者:liusingbon#本脚本每 2 秒检测一次 MySQL ...

  4. linux内核启动过程

    作者:严哲璟 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 通过qemu以 ...

  5. 01.基础架构:一条SQL查询语句是如何执行的?学习记录

    01.基础架构:一条SQL查询语句是如何执行的?学习记录http://naotu.baidu.com/file/1c8fb5a0f2497c3a2655fed89099cb96?token=ff25d ...

  6. PHP 配置多站点多目录

    Apache配置httpd.conf #增加监听端  可以通过netstat -n -a查看端口是否开启# Listen: Allows you to bind Apache to specific ...

  7. Xcode7.1环境下上架iOS App到AppStore 流程①

    前言部分 之前App要上架遇到些问题到网上搜上架教程发现都是一些老的版本的教程 ,目前iTunesConnect 都已经迭代好几个版本了和之前的 界面风格还是有很大的差别的,后面自己折腾了好久才终于把 ...

  8. Vue.js----date与时间戳的转换(unixTime)Moment.js让日期处理变得更简单

    当前日期格式化 let curTime = moment().format('YYYY-MM-DD HH:mm:ss') console.log('当前日期时间curTime:' + curTime) ...

  9. 【leetcode】820. Short Encoding of Words

    题目如下: 解题思路:本题考查就是找出一个单词是不是另外一个单词的后缀,如果是的话,就可以Short Encode.所以,我们可以把words中每个单词倒置后排序,然后遍历数组,每个元素只要和其后面相 ...

  10. Linux系统重要文件

    Linux系统重要文件介绍与配置 一网卡配置文件 (一)网卡配置文件参数介绍 文件路径信息:/ec/sysconfig/network-scripts/ifcfg-eth0 文件作用说明:配置网卡地址 ...