第二章:一切都是对象
如果我们说另一种不同的语言,那么我们就会发觉一个有些不同的世界。
Java是一种纯粹的面向对象语言。在Java中(几乎一切都是对象)。
2.1 用引用操作对象
每种编程语言都有自己的操作内存元素的方式。有时候,程序员必须要注意将要处理的数据时什么类型的。你是直接操作元素,还是用某种特殊语法的间接表示来操作对象。所有这些再Java里得到了简化,一切都被视为对象。但操作的标识符实际上是对象的一个引用。比如遥控器(引用)来操作对象(电视机)。只要抓住这个遥控器就可以保持和电视的连接。如想改变频道,实际上就操作遥控器。再由遥控器来操作电视。拿着遥控器房间里走来走去都允许的。
即,没有电视机,遥控器即可独立存在。也就是说,因拥有了一个引用,并不一定需要一个对象与它关联。比如创建一个引用,如:String str;
这里创建的只是引用,并不是对象。如果此时给str发送一个消息,就会返回一个运行时错误。原因是,str没有任何事物相关联。因此,一种安全的做法是,创建一个引用的同时进行初始化,如:String str = "abcd";
2.2 必须由你创建所有对象
一旦创建了一个引用,就希望它能与一个新的对象相关联。通常是new操作符来实现这一目的。new关键字的意思是:给我一个新对象。如下:
String str = new String("abcd");
它不仅表示:给我一个新的字符串,而且通过提供一个初始字符串,给出了怎样产生这个String的信息。
存储到什么地方
程序运行时,对象是怎么进行放置安排的呢?特别是内存如何分配的呢?下列五种不同的地方可以存储数据,如下:
寄存器,这是最快的存储区。在于处理器内部。寄存器的数量有限的,所以寄存器根据需要分配,你不能直接控制,也不能再程序中感觉到寄存器的存在。
堆栈,位于RAM中,但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若往下移动,说明分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配方式,其次与寄存器。
堆,一种通用的内存池(位于RAM),用于存放所有的Java对象。堆不同于堆栈的好处是:编译器不需要知道存储的对象在堆里存活多长时间。当然,这种分配也需要代码的,用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。
常量存储,常量值通常直接存放程序代码内部,这样做是安全的,因为它们永远都不会改变。有些嵌入式系统需要隔开,这时考虑放在ROM中。
非RAM存储器,如果数据完全存活于程序之外,那么它不受程序的任何控制。在程序没有运行时也可以存在,其中两个基本的例子是:流对象,持久化对象。
特例:基本类型
在程序设计中经常用到一系列类型,它们需要特殊对待,可以把它们称为基本类型。之所以特殊对待,是因为new将对象存储在堆中,故有new创建对象,特别是小而简单的变量,往往不是很有效。因此,对这些类型,Java采用不用new来创建变量,而是创建一个并非是引用的“自动”变量,这个变量直接存储“值”,并置于堆栈中,因此更加高效。
Java要确定每种基本类型所占存储空间大小,大小不像其他语言一样随机器硬件架构的变化而变化,这就是可移植性的原因之一,如下:
image.png
所有数值类型都有正负号,所以不要寻找一个无符号的数据类型。
基本类型有包装器类(如Integer),使得可以在堆中创建一个非基本对象,用来表示对应的基本类型,如:Integer i = new Integer(123);
高精度数字
BigInteger,支持任意精度的整数。
BigDecimal,支持任意精度的定点数。
它们属于包装器类型,没有对应的基本类型。但是它们提供的方法,提供的操作与基本类型相似
Java中的数组
Java确保数组被初始化,而且不能在它的范围之外被访问。这种范围检查,是以每个数组上少量的内存开销及运行时的下标检查为代价的,但由此带来安全性和效率。
当创建一个数组对象时,实际上就创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值。该值有自己的关键字null,一旦java看到null,就知道该引用没有指向某个对象。在使用任何引用前,必须为其指定一个对象。如果视图使用一个还是null的引用,在运行时将会报错,因此,常犯的数组错误在Java中可以避免。
可以创建用来存放基本数据类型的数组。同样,编译器确保这种数组的初始化,因为它会将这种数组所占的内存全部置零。
2.3 永远不需要销毁对象
作用域
作用于决定了在其内定义的变量名的可见性和生命周期,Java中作用于由花括号{}的位置决定。在作用于里定义的变量只可用于作用于结束之前。
对象的作用域
Java的对象不具备基本类型一样的生命周期,当new创建一个对象时,它可以存活于作用域之外,对象会继续占用空间。
事实证明,通过new创建的对象,只要你需要,就会一直保留下去。这样就产生一个问题,Java让对象继续存在,那么靠什么才能防止这些对象填满内存空间,进而堵塞你的程序呢?Java有个垃圾回收器,用来监视new来创建的所有对象。并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间。
也就是说,你不用担心回收的问题,你只需要创建对象,一旦不再需要,它们将会自动消失。
2.4 创建新的数据类型,类
如果一切都是对象,那么是什么决定了某一类对象的外观与行为呢?换句话说,是什么确定的对象的类型?大多数面向对象语言中使用clss关键字来表"我准备告诉你一种新类型的对象看起来是什么样的“。
字段,方法
字段,成员变量。如果是某某对象的引用,得必须初始化。
方法。
每个对象都有用来存储其字段的空间;普通的字段不能再对象间共享;
基本成员默认值
若的类的某个成员是基本数据数据类型,即使没有进行初始化,Java也会确保它获得一个默认值。默认值可能不是你想要的值,所以要自己初始化哦,如下:
image.png
局部变量时不会初始化的,初始化前得到的可能是任意值。如果忘了初始化,Java会编译时返回一个错误,告诉你此变量没有初始化。
2.5 方法,参数,返回值
在Java里用方法来描述:做某些事情的方式。Java中的方法决定了一个对象能接收什么样的消息。方法的组成部分包括:名称,参数,返回值,方法体。
方法名和参数列表用来唯一的识别出某一个方法。Java中的方法只能作为类的一部分来创建的,方法只能通过对象才能被调用。且这个对象必须执行这个方法调用。
这行调用方法的行为通常被称为发送消息给对象。
参数列表
方法的参数列表指定要传递给方法什么样的信息,这些信息像Java中的其他信息一样,采用的都是对象形式。因此,在参数列表中指定每个所传递的对象的类型及名字。像Java中任何传递对象的场合一样,这里的传递的实际上也是引用。而且引用的类型必须准确。
若返回类型是void,return关键字的作用只是退出方法。因此,没有必要方法结束时才离开,可以在任何地方返回。若返回类型不是void,无论何处返回,编译器都强制要求返回一个准确类型的返回值。
2.6 构造一个Java程序
名字可见性
名字管理对任何程序语言来说,都是一个重要的问题。如果程序的某个模块里使用了某个名字,而在其他人在这个程序的其他模块里也使用了相同的名字,那么怎么才能区分这两个名字,并防止二者互相冲突呢?Java使用一种全新的方式来避免这个问题,为了给一个类库生成不会与其他名字混乱的名字,Java设计者希望程序员反过来使用internet域名,因为这样保证独一无二。推荐是小写。
运用其他构件
如果想自己的程序里使用别的库,那么编译器就必须知道怎么定位它们。当然,这个类可能就在发出的那个原文件中,在这种情况下,就直接使用这个类:即使这个类在文件的后面才会被定义。
如果类位于其他文件中,如果你想使用某一个特定名字的类,但是定义不止一份,为了解决这个问题,必须消除所有可能的混乱情况。为实现这个目的,可以使用关键字import来告诉编译器你想要什么类,import指示编译器导入一个包,也就是一个类库。
static关键字
通常来说,当创建类时,就是在描述那个类的对象的外观与行为。除非用new创建那个类的对象,否则,世界上并没有获得任何对象。执行new来创建对象时,数据存储空间才会分配,其方法才被外界调用。
有两种情形用上述方法是无法解决的:
只想为某特定的域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本不创建任何对象。
希望某个方法不于包含它的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用这个方法。
使用static可以满足如上两方面的需求,当生命一个事务是static时,就意味着这个域或方法不会于包含它的那个类的任何对象实例关联在一起。所以,即使从未某个类的任何对象,也可以调用其static方法或其satatic域。通常,你必须创建一个对象,并用它来访问数据或方法。因为非static域或方法必须知道它们一起运作的特定对象。
静态资源的访问,如下两种
对象来访问。
类来访问,推荐。
尽管static作用于某个字段时,肯定会改变数据创建的方式(因为一个static对每个类来说只有一份存储空间,而非static字段则是对每个对象有一个存储空间)。但是static作用于某个方法,差别没有那么大。static方法的好处是不创建任何对象的情况下直接调用这个方法。
和任何其他方法一样,static方法可以创建或使用与其类型相同的被命名对象,因此,static方法通常拿来做“牧羊人“的角色,负责看护与其同一个类型的实例群。
2.7 注释,嵌入式文档
Java中有两种注释风格:
/* */
//
注释文档
代码文档编写的最大问题,大概就是文档的维护了。如果是文档与代码是分开的,那么每次修改代码时,都需要修改相应的文档。解决方法是代码和文档链接起来。
javadoc其他部分忽略
28 编码风格
见阿里的Java开发手册。
©著作权归作者所有:来自51CTO博客作者u2r2otkit的原创作品,如需转载,请注明出处,否则将追究法律责任