Thinking in Java 自学笔记——第二章 一切皆对象

来源:互联网 发布:i menu安装软件 编辑:程序博客网 时间:2024/05/01 18:01

第二章 一切都是对象

目录

第二章 一切都是对象...1

2.1 用引用操纵对象...1

2.2 必须由你创建所有对象...2

2.2.1 储存到什么地方...2

2.2.2 特例:基本类型...2

2.2.3 Java中的数组...3

2.3 永远不需要销毁对象...3

2.3.1 作用域...3

2.3.2 对象的作用域...4

2.4 创建新的数据类型:类...4

2.4.1 字段和方法...4

2.5 方法、参数和返回值...5

2.5.1 参数列表...5

2.6 构建一个Java程序...6

2.6.1 名字可见性...6

2.6.2 运用其他构建...6

2.6.3 static关键字...6

2.7你的第一个Java程序...6

 

 

“如果我们说另一种不同的语言,那么我们就会发觉一个有些不同的世界。”

                                                                                             ——LuduingWittgerstein(1889-1951)

尽管Java是基于C++的,但是相比之下,Java是一种更“纯碎”的面向对象程序设计语言。

2.1 用引用操纵对象

每种编程语言都有自己的操纵内存中元素的方式。有时候,程序猿必须注意将要处理的数据是什么类型。你是直接操纵元素,还是用某种基于特殊语法的简介表示来操纵对象?

所有这一切在Java里都将得到了简化。一切都被视为对象,因此可采用单一固定的语法。尽管一切都看作对象,但操纵的标识符实际上是对象的一个引用。

你拥有一个引用,并不一定需要有一个对象与它关联。如:

String s ;

一种安全的做法是:创建一个引用的同事便进行初始化。如:

String s = “asdf” ;

2.2 必须由你创建所有对象

一旦创建了一个引用,就希望它能与一个新的对象相关联。通常用new操作符来实现这一目的。new关键字的意思是“给我一个对象。”如:

String s = new String(“asdf”)  ;

2.2.1 储存到什么地方

有五个地方可以存储数据

1)寄存器。最快的存储区——处理器内部。数量及其有限,根据需求分配,不能直接控制。

2)堆栈。位于通用RAM。通过堆栈指针可以从处理器那里获得直接支持,仅次于寄存器。某些java数据存储于堆栈中——特别是对象引用,但是java对象并不存储于其中。

3)堆。一种通用的内存池(也位于RAM),用于存放所有的java对象。

4)常量存储。直接放在程序代码内部。

5)非RAM存储。数据完全存活于程序之外,不受程序的任何控制。

2.2.2 特例:基本类型

用new将对象存储在“堆”里,故用new创建一个对象——特别是小的、简单的变量,往往不是很有效。因此,对于这些类型,不用new来创建变量,而是创建一个并非是引用的“自动”变量。这个变量直接存储“值”,并置于堆栈中,因此更加高效。

java确定了每种基本类型所占存储空间的大小。这种占存储空间大小的不变形是java程序比用其他大多数语言编写的程序更具有可移植性的原因之一。


所有数值类型都有正负号,所以不要去寻找无符号的数值类型。

boolean类型所占存储空间的大小没有确定制定,仅定义为能够取字面值true或false。

基本类型具有包装器类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。如:

char c = ‘x’ ;Character ch = new Character(c) ;//也可以用Character ch = new Character(‘c’) ;

Java SE5的自动包装功能能自动地将基本类型转换为包装器类型:

Character ch = ‘x’ ;//并可以反向转换char c = ch ;

高精度数字:

java提供了两个用于高精度计算的类:

BigInteger:支持任意精度的正数。

BigDecimal:支持任何精度的定点数。

2.2.3 Java中的数组

Java的主要目标之一是安全性。

Java确保数组会被初始化,而且不能在它的范围之外访问。

当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值。

2.3 永远不需要销毁对象

在大多数程序设计语言中,变量生命周期的感念,占据了程序设计工作中非常重要的部分。

2.3.1 作用域

作用域决定了在其内定义的变量名的可见性和生命周期。

注意:Java中不能这样写:

{int x = 12 ;{int x = 96 ;  //  Illegal         }}

2.3.2 对象的作用域

当用new创建了一个Java对象时,它可以存活于作用域之外。

{String s = new String(“a string”) ;}// End of scope

应用s在作用域终点就消失了。然而,s指向的String对象仍继续占据内存空间。

Java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。

2.4 创建新的数据类型:类

大多数面向对象的程序设计语言习惯用关键字class来表示“我准备告诉你一种新类型的对象看起来像什么样子”。class这个关键字之后紧跟着新类型的名称。如:

class ATypeName { /* Class body goes here */}

这就引入了一种新的类型,你已经可以用new来创建这种类型的对象:

ATypeName a = new ATypeName() ;

2.4.1 字段和方法

一旦定义了一个类,就可以在类中设置两种类型的元素:字段和方法。

字段可以是任何类型的对象,可以通过其引用与其进行通信;也可以是基本类型中的一种。如果字段是某个引用的对象,那么必须初始化该引用,以便使其与一个实际的对象相关联。

每个对象都有用来存储字段的空间;普通字段不能在对象间共享。下面是一个具有某些字段的类:

class DataOnly {int i ;double d ;boolean b ;}

可以给字段赋值:在对象引用的名称之后紧接着一个句点,然后再接着是对象内部的成员名称:如:

DataOnly data = new DataOnly() ;data.i = 47 ;data.d = 1.1 ;data.b = false ;

基本成员默认值

若类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值。如下表:


当变量作为类的成员使用时,Java才确保给定其默认值,以确保那些是基本类型的成员变量得到初始化。

然而上述确保初始化的方法并不适用于“局部”变量。

2.5 方法、参数和返回值

方法的基本组成部分包括:名称、参数、返回值和方法体。如下:

ReturnType methodName(/* Argument list */) {/* Method body */}

Java中的方法只能作为类的一部分来创建。方法只有通过对象来调用,且这个对象必须能执行这个方法调用。通过对象调用方法时,需要先列出对象名,紧接着是句点,然后是方法名和参数列表。如:

ObjectName.methodName(arg1, arg2, arg3) ;

这种调用方法的行为通常成为发送消息给对象。

2.5.1 参数列表

在参数列表中必须指定每个所传递对象的类型和名字。像Java中任何传递对象的场合一样,这里传递的实际上也是引用,并且引用的类型必须正确。

2.6 构建一个Java程序

2.6.1 名字可见性

Java设计者希望程序猿反过来自己的Internet域名。

2.6.2 运用其他构建

关键字import来准确的告诉编译器你想要的类是什么。import指示编译器导入一个包,也就是一个类库。

2.6.3 static关键字

除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。

两种情形是以上方法无法解决的:

一:只想为某特定域分配单一存储空间,而不去考虑究竟要创建什么对象,甚至根本就不创建任何对象。

二:希望某个方法不与包含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能调用这个方法。

通过static关键字可以满足这两个方面的需要。当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象事例关联在一起。

使用类名是引用static变量的首选方式,这不仅是因为它强调了变量的static结构,而且在某些情况下它还为编译器进行优化提供了更好的机会。

尽管当static作用于某个字段时,肯定会改变数据创建的方式,但是如果static作用于某个方法,差别却没有那么大。static方法的一个重要用法就是在不创建任何对象的前提下就可以调用它。

2.7你的第一个Java程序
//HelloDate.javaimport java.util.* ;public class HelloDate {public static void main(String[] args) {System.out.println("Hello, it's: ") ;System.out.println(new Date()) ;}}

类的名字必须和文件名相同。

java最强大的优势之一就是它具有庞大的标准类库集。

//object/ShowProperties.javapublic class ShowProperties {public static void main(String[] args) {System.getProperties().list(System.out) ;System.out.println(System.getProperty("user.name")) ;System.out.println(System.getProperty("java.library.path")) ;}}

0 0
原创粉丝点击