2. 一切都是对象

来源:互联网 发布:中国js 12.7mm狙击步枪 编辑:程序博客网 时间:2024/06/05 02:34

2.1 用引用操作对象

[什么是对象]
(http://www.runoob.com/java/java-object-classes.html)

在java中,你可以把一切看作是对象,但操作的标识符实际上是对象的一个“引用”。可以将这一情形想象成用遥控器(引用)来操作电视机(对象)。当然没有电视机,遥控器亦可以独立存在的。也就是说你拥有一个引用,并不需要有一个对象与他关联。例如:创建一个String引用

String s;

这里只是引用,并不是对象。如果此时向s发送一个消息,就会返回一个运行时的错误。这是因为此时s实际上没有与任何事物相关联(即,没有电视机)。当然你也可以创建一个引用的同时进行初始化

String s = "asdf";

字符串可以用带引号的文本初始化。

2.2 必须由你创建所有对象

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

String s = new String"asdf");

它不仅表示“给我一个新的字符串”,而且通过提供一个初始字符串,给出了怎样产生这个String的信息。

2.2.1 存储到什么地方

1. 寄存器。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。
2.堆栈。位于RAM(随机访问存储器)中,但通过堆栈指针进行内存分配。若向下移动,则分配新的内存,若向上移动,则释放那些内存。
3.堆。一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆不同于堆栈的好处:编译器不需要知道存储的数据在堆里存活多长时间。
4.常量存储。常量值通常直接存放在程序代码内部。
5.非RAM存储。如果数据完全存活在程序之外,不受程序的任何控制,在程序没有运行时也可以存在。不需要时,把对象转化成可以存放在其他媒介上的事物。需要时,可恢复成常规的、基于RAM的对象。

2.2.2 特例:基本类型

基本类型之所以特殊对待,是因为特别小的、简单的变量所形成的对象存储在“堆”里面往往不是很有效。所以不用new来创建变量,而是创建一个并非是引用的“自动”变量,把这个变量直接存储“值”,并置于堆栈中,更高效了。

基本类型 大小 最小值 最大值 包装器类型 boolean —— —— —— Boolean char 16-bit Unicode 0 Unicode 2^{16}-1 Character byte 8 bits -128 +127 Byte short 16 bits -2^{15} +2^{15}-1 Short int 32 bits -2^{31} +2^{31}-1 Integer long 64 bits -2^{63} +2^{63}-1 Long float 32 bits IEEE754 IEEE754 Float double 64 bits IEEE754 IEEE754 Double void —— —— —— Void

boolean类型所占存储空间的大小没有明确指定,仅定义能够取字面值truefalse
基本类型具有的包装器类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。例如:

char c = 'x';Character ch = new Character(c);

也可以这样用

Character ch = new Character('x');

高精度计算的类:BigInteger和BigDecimal
这个两个类包含的方法,提供的操作与对基本类型所能执行的操作相似。
BigInteger支持任意的精度的整数。也就是说,在运算中,可以准确地表示任何大小的整数值,而不会丢失任何信息。

2.2.3 Java中的数组

当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null。一旦Java看到null,就知道这个引用还没有指向某个对象。在使用任何引用前,必须为其指定一个对象;如果试图使用一个还是null的引用,在运行时将会报错。

2.3 永远不需要销毁对象

2.3.1 作用域

作用域决定了在其内定义的变量名的可见性和生命周期。作用域由花括号决定。例如:

{int x = 12;//Only x available{    int q = 96;    //Both x & q available;}//Only x available//q is "out of scope"}

2.3.2 对象的作用域

Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象,它可以存活于作用域之外。例如:

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

引用s在作用域终点就消失了。然而,s指向的String对象(new String(“a string”))仍然继续占据内存空间。
new创建的对象,只要你需要,就会一直保留下来,不需要就会被垃圾回收器回收,释放内存空间给其他新对象使用。

2.4 创建新的数据类型:类

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

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

这样就引入了新类型。

2.4.1 字段和方法

一旦定义了一个类(在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象),就可以在类中设置两种类型的元素:字段(有时被称为数据成员)和方法(有时被称为成员函数)。字段可以是任何类型的对象,也可通过其引用(对象引用)和其(对象)进行通信;也可以是一种基本类型中的一种。如果字段是对某个对象的引用,那么必须初始化该应用,以便使其与一个实际的对象(如前所述,使用new来实现)相关联。
怎么引用一个对象的成员。具体实现为:在对象引用的名称之后紧接着一个句点,然后再接着是对象内部成员名称:

objectReference.member

如果想修改的数据也有可能位于对象所包含的其他对象中。在这种情况下,只需要再使用连接句点就可以了:

myPlane.leftTank.capacity = 100;对象名称    对象名称  对象内部成员

DataOnly类除了保存数据外没有别的用处,因为它没有任何成员方法。
基本成员默认值
某些类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值。

基本类型 默认值 boolean false char ‘\uoooo’(null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d
int x;

像这种“局部”变量,不会自动初始化为零,没有对变量x赋值使用的话,Java在编译时返回一个错误。

2.5 方法、参数和返回值

Java的方法决定了一个对象能够接收什么样的消息。方法的基本组成部分包括:名称、参数、返回值和方法体。下面是它最基本的形式:

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

返回类型描述的是在调用方法之后从方法返回的值。
参数列表给出了要传给方法的信息的类型和名称。方法名和参数列表(它们合起来被称为“方法签名”)唯一地标识出某个方法。
Java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用,且这个对象必须能执行这个方法调用。通过对象调用方法时,需要先列出对象名,紧接着是句点,然后是方法名和参数列表。如:

objectName.methodName(arg1,arg2,arg3);对象名      方法名         参数列表

2.5.1 参数列表

方法的参数列表指定要传递给方法什么样的信息。所以,在参数列表中必须指定每个所传递对象的类型和名字。例如:

           对象类型  名字int storage(String s) {    return s.length() * 2;}

这个方法告诉你,需要多少个字节才能容纳一个特定的String对象中的信息。
还可以通过这个例子了解return关键字的用法,它包括两方面:首先,它代表“已经做完,离开此方法”。其次,如果此方法产生一个值,这个值要放在return语句后面。
你可以定义方法返回任意想要的类型,如果不想返回任何值,可以指示方法返回void(空)。例如:

boolean flag() { return ture; }double naturalLogBase() { return 2.718; )void nothing() { return; }void nothing2() {}

若返回类型是voidreturn关键字的作用只是用来退出方法。因此,没不要等方法结束时才离开,可以任何地方返回。
若返回类型不是void,那么无论在何处返回,编译器都会强制返回一个正确类型的返回值。

2.6 创建一个Java程序

2.6.1 名字可见性

为了给一个库类生成不会与其他名字混淆的名字,Java设计者希望程序员反过来使用自己的Interner域名,因为这样可以保证它们肯定是独一无二的。由于我的域名为MindView。net,所以我的各种奇奇怪怪的应用工具类库就被命名为net.mindview.utility.foibles.反转域名后,句点就用来代表子目录的划分。
这用机制意味着所有文件都能自动存活在于它们自己的名字空间内,而且同一个文件内的每个类都有唯一的标识符。

2.6.2 运用其他构件

这个类:

  1. 可能在发出调用的那个源文件中:直接使用这个类(即使这个类在文件后面才被定义)。

  2. 在于其他文件中,使用关键字import

import来准确地告诉编译器你想要的类是什么。import指示编译器导入一个包,也就是一个类库(在其他语言中,一个库不仅包含类,还可能包括方法和数据;但是Java中所有的代码都必须写在类中)。

import java.util.ArrayListl;

这行代码告诉编译器,你想使用Java的ArrayList类。util包含了数量众多的类,有时你想使用其中几个,又不想明确的逐一说明;那么你可以使用通配符“*”来达到这个目的:

import java.util.*;

2.6.3 static 关键字

通常来说,但创建类时,就是描述这个类的对象的外观与行为。除非用new创建这个类的对象,否则,实际并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。
一般情况下,你必须创建一个对象,并用它来访问数据和方法。
static特殊在这里:
当声明一个事物是static的时,就意味着这个域或方法不会与包含它的那个类的任何对象实力关联在一起。所以,即使从未创建某个类的任何对象,就可以调用其static方法和访问其static域。(不创建任何对象的前提下就可以调用它
只须将static关键字放在定义之前,就可以将字段或方法设定为static。例如

class StaticTest {    static int i = 47;}

即使你创建了两个StaticTest对象,StaticTest.i也只有一份存储空间,这个对象共享一个i

StaticTest st1 = new StaticTest();StaticTest st2 = new StaticTest();

在这里,st1.i和st2.i指向同一个存储空间,因此它们具有相同的值47。
引用static变量

  1. 通过一个对象去定位它:StaticTest st2 = new StaticTest ();

  2. 通过其类名直接引用(对于非静态成员不行)StaticTest i++;

静态方法(类似):

  1. 像其他方法一样通过一个对象来引用某个静态方法。

  2. 通过特殊的语法形式ClassName.method()加以利用

2.7 你的第一个Java程序

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

public static void main(String[] args) {

其中,public关键字意指这是一个可由外部调用的方法。main()方法的参数是一个String对象的数组。在个程序中并未用到args,但是Java编译器要求必须这样做,因为args要用来存储命令行参数。

2.8 注释和嵌入式文档

/* This is a comment * that continues * across lines * //* This is a comment thatcontinues across lines */

注释以“/*”开始,随后是注释内容,并可以跨越多行,最后以“*/”结束。注意,许多程序员在连续的注释内容的每一行都以一个“*”开头,但是,进行编译时,/**/之间的所有东西都被忽略,所以这两个注释都是一样的。

// This is a one-line comment

这个是“单行注释”,以一个“// ”开头。

2.8.1 注释文档

用javadoc来提取注释,并将其转化成有用的形式。它输出的是一个HTML文件,可以用Web流浪器查看。

2.8.2 语法

所有javadoc命令都只能在/**注释中出现,和通常一样,注释结束于*/
共有三种类型的注释文档,分别对应于注释位置后的三种元素:类、域和方法。也就是说,类注释正好位于类定义之前:域注释正好位于域定义之前;二方法注释也正好位于方法定义的前面。

//: object/Doucumetation1.java  (":"作为特殊记号说明这是包含源文件的注释行,该行包含文件的路径信息)/** A class comment */   类注释public class Documentation1 {    /** A field comment */  域注释    public int i;    /** A method comment */  方法注释    pubic void f() {}} ///:~  ("///:~"标志源代码清单的结束)

注意,javadoc只能为public(公共)和protected(受保护)成员进行文件注释。private(私有)和包内可访问成员的注释会被忽略掉,所以输出的结果中看不到它们(不过可以用-private进行标记,以便private成员的注释也包括在内)。

2.9 编码风格

“驼峰风格”:类名的首要字母要大写,如果类名有几个单词构成,那么把它们并在一起(也就是说,不要用下划线来分隔名字),其中每个内部单词的首字母都采用大写形式。例如:

class AllTheColorsOfTheRainbow { //....

几乎其他所有内容——方法、字段(成员变量)以及对象引用名称等,公认的风格与类的风格一样,只是标识符的第一个字母采用小写。例如:

class AllTheColorsOfTheRainbow {    int anIntegerReprisentingColors;    void changeTheHueOfTheColor(int newHue) {    //...    }    //...}
0 0
原创粉丝点击