一切都是对象
欢迎转载。转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040221
虽然以C++为基础,但 Java 是一种更纯粹的面向对象程序设计语言
正式用它设计之前,必须先将自己的思想转入一个面向对象的世界
1 用句柄操纵对象
在 Java 里,不论什么东西都可看作对象。可採用一种统一的语法。不论什么地方均可照搬不误。注意,虽然将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle)。
2 全部对象都必须创建
创建句柄时,希望同一个新对象连接。
通经常使用 newkeyword达到这一目的。
程序执行时,特别要注意的是内存的分配。
有六个地方都能够保存数据
2.1 寄存器
这是最快的保存区域。由于它位于和其它全部保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是依据须要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的不论什么踪迹。
2.2 堆栈
驻留于常规 RAM(随机訪问存储器)区域。但可通过它的“堆栈指针”获得处理的直接支持。
堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java 编译器必须准确地知道堆栈内保存的全部数据的“长度”以及“存在时间”。这是因为它必须生成对应的代码,以便向上和向下移动指针。
这一限制无疑影响了程序的灵活性,所以虽然有些Java 数据要保存在堆栈里——特别是对象句柄,但Java
对象并不放到当中。
2.3 堆
一种常规用途的内存池(也在 RAM区域)。当中保存了Java 对象。和堆栈不同。“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。
因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,仅仅需用new命令编制相关的代码就可以。运行这些代码时,会在堆里自己主动进行数据的保存。
必定会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!
2.4 静态存储
“静态”(Static)是指“位于固定位置”(也在RAM里)。
程序执行期间。静态存储的数据将随时等候调用。可用static keyword指出一个对象的特定元素是静态的。但 Java 对象本身永远都不会置入静态存储空间。
2.5 常数存储
常数值通常直接置于程序代码内部。
它们永远都不会改变。
有的常数须要严格地保护。所以可考虑将它们置入仅仅读存储器(ROM)。
2.6 非RAM 存储
若数据全然独立于一个程序之外。则程序不执行时仍可存在,并在程序的控制范围之外。
当中两个最基本的样例便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,一般会发给还有一台机器。而对于固定对象。对象保存在磁盘中。即使程序中止执行。它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别实用的技巧就是它们能存在于其它媒体中。一旦须要,甚至能将它们恢复成普通的、基于RAM的对象。
2.6.1 主要类型
有一系列类需特别对待;可将它们想象成“基本”、“主要”或者“主”(Primitive)类型,进行程序设计时要频繁用到它们。
2.6.2 Java 的数组
差点儿全部程序设计语言都支持数组。
在C和C++里使用数组是很危急的,由于那些数组仅仅是内存块。若程序訪问自己内存块以外的数组,或者在初始化之前使用内存(属于常规编程错误),会产生不可预測的后果。在C++里。应尽量不要使用数组,换用标准模板库(Standard TemplateLibrary)里更安全的容器。
Java 的一项主要设计目标就是安全性。所以在C 和C++里困扰程序猿的很多问题都未在Java 里反复。一个Java 能够保证被初始化。并且不可在它的范围之外訪问。
因为系统自己主动进行范围检查。所以必定要付出一些代价:针对每一个数组。以及在执行期间对索引的校验,都会造成少量的内存开销。
换回的是更高的安全性,以及更高的工作效率。为此付出少许代价是值得的。
2.7 不要清除对象
在大多数程序设计语言中,变量的“存在时间”(Lifetime)一直是程序猿须要着重考虑的问题。
大多数程序设计语言都提供了“作用域”(Scope)的概念。
对于在作用域里定义的名字。作用域同一时候决定了它的“可见性”以及“存在时间”。
Java 对象不具备与主类型一样的存在时间。用new keyword创建一个Java 对象的时候,它会超出作用域的范围之外。
在 C++里。一旦工作完毕,必须保证将对象清除。
Java 有一个特别的“垃圾收集器”,它会查找用new创建的全部对象,并辨别当中哪些不再被引用。
随后。它会自己主动释放由那些闲置对象占领的内存。以便能由新对象使用。这意味着我们根本不必担心内存的回收问题。仅仅需简单地创建对象,一旦不再须要它们,它们就会自己主动离去。这样做可防止在C++里非经常见的一个编程问题:因为程序猿忘记释放内存造成的“内存溢出”。
2.8 数据类型:类
但从历史看来,大多数面向对象的语言都用keyword“class”表达这样一个意思:“我准备告诉你对象一种新类型的外观”。在这个keyword的后面。应该尾随新数据类型的名称。
比如:
class ATypeName{/*类主体置于这里}
这样就引入了一种新类型,接下来便可用new 创建这样的类型的一个新对象:
ATypeName a =new ATypeName();
在ATypeName 里,类主体仅仅由一条凝视构成(星号和斜杠以及当中的内容。本章后面还会具体讲述),所以并不能对它做太多的事情。其实。除非为其定义了某些方法。否则根本不能指示它做不论什么事情。
2.8.1 字段和方法
可在自己的类里设置两种类型的元素:数据成员(有时也叫“字段”)以及成员函数(通常叫“方法”)
数据成员是一种对象(通过它的句柄与其通信),能够为不论什么类型。它也能够是主类型(并非句柄)之中的一个。
假设是指向对象的一个句柄,则必须初始化那个句柄,用一种名为“构建器”(的特殊函数将其与一个实际对象连接起来(就象使用newkeyword)。
但若是一种主类型,则可在类定义位置直接初始化(正如后面会看到的那样,句柄亦可在定义位置初始化)。
每一个对象都为自己的数据成员保有存储空间;数据成员不会在对象之间共享。
一旦将变量作为类成员使用。就要特别注意由 Java 分配的默认值。
这样做可保证主类型的成员变量肯定得到了初始化(C++不具备这一功能)。可有效遏止多种相关的编程错误。
2.9 方法、自变量和返回值
JAVA用方法来替代 函数的叫法。
返回类型是指调用方法之后返回的数值类型。显然,方法名的作用是对详细的方法进行标识和引用。自变量列表列出了想传递给方法的信息类型和名称。
Java 的方法仅仅能作为类的一部分创建。仅仅能针对某个对象调用一个方法,并且那个对象必须可以运行那个方法调用。若试图为一个对象调用错误的方法。就会在编译期得到一条出错消息。
为一个对象调用方法时,须要先列出对象的名字。在后面跟上一个句点,再跟上方法名以及它的參数列表。即“对象名.方法名(自变量1,自变量2,自变量3...)。
如果我们有一个方法名叫f(),它没有自变量,返回的是类型为int的一个值。那么,如果有一个名为 a 的对象,可为其调用方法f(),则代码例如以下:
int x = a.f();
返回值的类型必须兼容 x的类型。
象这样调用一个方法的行动通常叫作“向对象发送一条消息”。
在上面的样例中,消息是f(),而对象是 a。
面向对象的程序设计通常简单地归纳为“向对象发送消息”。
在上面的样例中,消息是f()。而对象是 a。面向对象的程序设计通常简单地归纳为“向对象发送消息”。
2.9.1 自变量列表
自变量列表规定了我们传送给方法的是什么信息。
採用的都是对象的形式。我们必须在自变量列表里指定要传递的对象类型,以及每一个对象的名字。
正如在Java 其它地方处理对象时一样。我们实际传递的是“句柄”。倘若希望自变量是一个“字串”,那么传递的必须是一个字串。
一个程序仅仅是一系列对象的集合,它们的方法将其它对象作为自己的自变量使用。并且将消息发给那些对象。
2.10 构建JAVA程序
2.10.1 名字可见
在全部程序设计语言里,一个不可避免的问题是对名字或名称的控制。
怎样区分两个名字,并防止两个名字互相冲突呢?C++用额外的keyword引入了“命名空间”的概念。Java为了给一个库生成明白的名字。採用了与Internet域名类似的名字。所以能全然避免这些问题。
2.10.2 使用其它组件
一旦要在自己的程序里使用一个预先定义好的类。编译器就必须知道怎样找到它。
import的作用是指示编译器导入一个“包”——或者说一个“类库”(Java 的全部代码都必须写入一个类中)。
大多数时候。直接採用来自标准Java 库的组件(部件)就可以,它们是与编译器配套提供的。
使用这些组件时,没有必要关心冗长的保留域名
2.10.3 static keyword
除非用new 创建那个类的一个对象,否则实际上并未得到不论什么东西。仅仅有运行了new 后,才会正式生成数据存储空间,并可使用对应的方法。
在两种特殊的情形下,上述方法并不堪用。一种情形是仅仅想用一个存储区域来保存一个特定的数据——不管要创建多少个对象。甚至根本不创建对象。
还有一种情形是我们须要一个特殊的方法,它没有与这个类的不论什么对象关联。也就是说,即使没有创建对象,也须要一个能调用的方法。为满足这双方面的要求。可使用static(静态)keyword。
一旦将什么东西设为static,数据或方法就不会同那个类的不论什么对象实例联系到一起。所以虽然从未创建那个类的一个对象,仍能调用一个
static方法,或訪问一些 static数据。
对于非 static数据和方法,我们必须创建一个对象,并用那个对象訪问数据或方法。这是因为非static数据和方法必须知道它们操作的详细对象。当然,在正式使用前,因为static方法不须要创建不论什么对象。所以它们不可简单地调用其它那些成员,同一时候不引用一个已命名的对象,从而直接訪问非 static成员或方法(因为非static成员和方法必须同一个特定的对象关联到一起)。
有些面向对象的语言使用了“类数据”和“类方法”这两个术语。
它们意味着数据和方法仅仅是为作为一个总体的类而存在的,并非为那个类的不论什么特定对象。
static一项重要的用途就是帮助我们在不必创建对象的前提下调用那个方法。
正如以后会看到的那样,这一点是至关重要的——特别是在定义程序执行入口方法main()的时候。
和其它不论什么方法一样,static方法也能创建自己类型的命名对象。
所以常常把static方法作为一个“领头羊”使用,用它生成一系列自己类型的“实例”.
2.JAVA编程思想——一切都是对象的更多相关文章
-
java编程思想 一切都是对象
java是一种面向对象程序设计语言,一切都是对象,并且用引用操作对象,如一个电视机就是一个对象,而操作电视机的遥控器就是引用,引用可以单独存在,如遥控器可以单独存在. String s; 这里只是创建 ...
-
<;Java编程思想>;读书笔记(1)-对象导论、一切都是对象
1.面向对象编程:OOP (Object-oriented Programming) 2.Alan Kay 总结的面向对象语言5个基本特性: 1) 万物皆为对象 2) 程序是对象的集合,他们通过发送消 ...
-
Java编程思想(第一章 对象入门)总结
面向对象编程(oop) 1.1抽象的进步 所有编程语言的最终目的都是提供一种“抽象”方法. 难点是 在机器模型(位于“方案空间”)和实际解决问题模型(位于“问题空间”)之间,程序员必须建立起一种联 ...
-
《Java编程思想》读书笔记-对象导论
计算机是头脑延伸的工具,是一种不同类型的表达媒体.本文以背景性的和补充性的材料,介绍包括开发方法概述在内的面向对象程序设计(Object-oriented Programming,OOP)的基本概念. ...
-
java编程思想(1)--对象导论
对象导论: 1.1 抽象过程 所有的语言都有抽象机制,抽象是解决复杂问题的根本方法.例如:汇编语言是对底层机器的轻微抽象.命令式语言(如:FORTRAN.BASIC.C)又是对汇编语言的抽象. jav ...
-
Java编程思想之十一 持有对象
如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序. 11.1 泛型和类型安全的容器 使用ArrayList:创建一个实例,用add()插入对象,然后用get()访问对象 ...
-
Java编程思想阅读收获
15年8月份买了一本Java编程思想第四版中文版.之所以买中文版是因为我试读了同事的英文版发现自己英语水平还是有限,单词虽然认识,但对很多句子把握不准,这样看书太慢了,要理解英文还要理解技术有些hol ...
-
Java编程思想 4th 第2章 一切都是对象
Java是基于C++的,但Java是一种更纯粹的面向对象程序设计语言,和C++不同的是,Java只支持面向对象编程,因此Java的编程风格也是纯OOP风格的,即一切都是类,所有事情通过类对象协作来完成 ...
-
Java编程思想读书笔记(一)【对象导论】
2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
随机推荐
-
https连接的前几毫秒发生了什么
在讨论这个话题之前,先提几个问题: 为什么说https是安全的,安全在哪里? https是使用了证书保证它的安全的么? 为什么证书需要购买? 我们先来看https要解决什么问题 (手机读者推荐移步ht ...
-
gnuWin32-mini-2016.10.30
2016-10-28 04:48 1,017,856 awk.exe ver 4.1.4 2016-10-29 00:26 77,312 bc.exe ver 1.06 2016-10-30 01:4 ...
-
mysql实体关系(mysql学习五)
实体关系 表设计 1:1 两个实体表内,存在相同的主键字段 如果记录的主键值等于另一个关系表内记录的主键值,则两条记录的对应为一一对应 优化上称为垂直分割 1:n 一个实体对应多个其他实体(一个班级 ...
-
搭建单节点Hadoop应用环境
虚拟机: VirtualBox 5 Server操作系统: Ubuntu Server 14.04.3 LTS 如果对虚拟机空间和性能不做考虑, 且不习惯用Linux命令, 你也可以使用Ubuntu ...
-
01_自动化构建工具之Maven
目前技术中存在问题(为什么使用Maven): 一个项目就是一个工程: 缺陷:如果项目太过庞大,就不适合使用package来划分层次,最好是一个模块就是一个工程,利于分工协作. 解决:Maven可以将一 ...
-
Hessian源码分析--HessianSkeleton
HessianSkeleton是Hessian的服务端的核心,简单总结来说:HessianSkeleton根据客户端请求的链接,获取到需要执行的接口及实现类,对客户端发送过来的二进制数据进行反序列化, ...
-
【hihocoder】 Magic Box
题目1 : Magic Box 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 The circus clown Sunny has a magic box. When ...
-
C#中如何实现json转化时只处理部分属性
把对象转化为json字符串,很常用,但如果因为现在大部分项目都是用了ORM映射,导致一个对象的属性特别多,如果前台只需要部分属性如何实现? 当然最简单是所有属性都json化,前台只处理需要的属性,多余 ...
-
CAS操作原理分析
一.CAS简单介绍 CAS:Compare and Swap, 翻译成比较并交换. java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁 ...
-
qbxt的题:运
运 题意: 包含4,7的数成为幸运数.给一个序列,求多少个长度为k子序列满足:不包含两个及以上的相同的幸运数.(4出现两次就是不合法的,而4,7各出现一次是合法的). 分析: 1e9内幸运数只有2^1 ...