Java编程思想学习笔记——2、一切都是对象

用句柄操作一个对象

句柄:引用或者指针,相当于遥控器(句柄)控制电视机(对象

例如,String s;这只是声明一个句柄,并没有连接一个对象,一种更安全的做法是:创建一个句柄时,记住无
论如何都进行初始化

所有对象都必须创建

String s = new String("asdf");

Java对象保存到什么地方

计算机有六个地方可以存储数据(2、3、4在ram中)

(1)寄存器:是由编译器控制,我们不能控制

(2)堆栈:存储数据需要知道数据的数量及lifetime,灵活性差,有些java数据保存在其中,例如句柄、基本类型(int、String、boolean等)

(3)堆(heap):java对象存储的地方,用new命令来创建,在内存堆中创建对象会花更多的分配时间

(4)静态存储:可用static 关键字指出一个对象的特定元素是静态的。但 Java 对象本身永远都不会置入静态存储空间。

(5)常数存储:常数一般存储在代码内部,是安全的,有的存在ROM里

(6)非RAM存储:独立于程序外,程序结束了数据还在,有“流式对象”和“固定对象”

Java的数组

具有比C/C++更高的安全性,由于系统自动检测范围,会消耗少量的内存开销,且让java数组不可在系统不允许的范围内创建

创建对象数组时,实际创建的是一个句柄数组。而且每个句柄都会自动初始化成一个特殊值,并带有自己的
关键字:null(空)。一旦Java 看到null,就知道该句柄并未指向一个对象。正式使用前,必须为每个句
柄都分配一个对象,若试图使用依然为null 的一个句柄,就会在运行期报告问题

 

作用域是由花括号的位置决定的,作为在作用域里定义的一个变量,它只有在那个作用域结束之前才可使用

但在 Java 里不能象下面这样书写代码:   
 
{
  int x = 12;
  {
    int x = 96; /* illegal */
  }
}
 
编译器会认为变量x 已被定义。

 

字段和方法

一个对象包含数据成员(有时也叫“字段”)以及成员函数(通常叫“方法”)

如何引用一个对象的成员:“对象句柄.成员”

 

1. 主成员的默认值
若某个主数据类型属于一个类成员,那么即使不明确(显式)进行初始化,也可以保证它们获得一个默认
值。
 
主类型 默认值
 
Boolean false
Char '\u0000'(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d

并不适用于“局部”变量——那些变量并非一个类的字段。所以,假若在一个函数定义中
写入下述代码:
int x;
那么x 会得到一些随机值(这与C 和C++是一样的),不会自动初始化成零。

 

方法、自变量和返回值

方法

返回类型 方法名( /* 自变量列表*/ ) {/* 方法主体 */}

“静态”方法可针对类调用,毋需一个对象:有static声明的方法

 

名字的可见性:

Java 的设计者鼓励程序员反转使用自己的Internet 域名,因为它们肯定是独一无二的

 

如何使用类

要用import 关键字准确告诉Java 编译器我们希望的类是什么。import的作用是指示编译器导入一个“包”——或者说一个“类库”(在其他语言里,可将“库”想象成一系列函数、数据以及类的集合。但请记住,Java 的所有代码都必须写入一个类中)。

 

用static关键字的两种情形

(1)只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象

(2)即使没有创建对象,也需要一个能调用的方法

下述代码能生成一个static数据成员,并对其初始化:
 
class StaticTest {
Static int i = 47;
}
 
现在,尽管我们制作了两个StaticTest 对象,但它们仍然只占据StaticTest.i的一个存储空间。这两个对
象都共享同样的i。请考察下述代码:
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
此时,无论 st1.i还是st2.i都有同样的值47,因为它们引用的是同样的内存区域。

StaticTest.i++;
其中,++运算符会使变量增值。此时,无论 st1.i 还是st2.i 的值都是48。

 

在某些编程环境里,程序会在屏幕上一切而过,甚至没机会看到结果。可将下面这段代码置于main()的末尾,用它暂停输出:
try {
Thread.currentThread().sleep(5 * 1000);
} catch(InterruptedException e) {}
}
它的作用是暂停输出5 秒钟。这段代码涉及的一些概念要到本书后面才会讲到。

第一个java程序:


// Property.java
import java.util.*;
 
public class Property {
  public static void main(String[] args) {
    System.out.println(new Date());
    Properties p = System.getProperties();

    p.list(System.out); //将属性列表输出到指定的输出流。
    System.out.println("--- Memory Usage:");
    Runtime rt = Runtime.getRuntime();
    System.out.println("Total Memory = "
                       + rt.totalMemory()
                       + " Free Memory = "
                       + rt.freeMemory());
  }
}

 

注释

①    /*    */

②    //

③文档注释:用于提取注释的工具叫作javadoc。

(1)文档标记

/** 一个类注释 */
public class docTest {
/** 一个变量注释 */
public int i;
/** 一个方法注释 */
public void f() {}
}

注意javadoc只能为 public(公共)和protected(受保护)成员处理注释文档。“private”(私有)和“friendly”(详见5 章)成员的注释会被忽略,我们看不到任何输出(也可以用-private标记包括private 成员)

 

(2)嵌入HTML

/**
* <pre>
* System.out.println(new Date());
* </pre>
*/

注意在文档注释中,位于一行最开头的星号会被javadoc 丢弃。同时丢弃的还有前导空格。不要将<h1>或<hr>这样的标题当作嵌入HTML 使用,因为javadoc会插入自己的标题,我们给出的标题会与之冲撞。

 

@see :引用其他类

所有三种类型的注释文档都可包含@see 标记,它允许我们引用其他类里的文档

@see 类名
@see 完整类名
@see 完整类名#方法名

注意 javadoc不会检查我们指定的超链接,不会验证它们是否有效

 

类文档标记
随同嵌入HTML 和@see 引用,类文档还可以包括用于版本信息以及作者姓名的标记。类文档亦可用于“接口”目的(本书后面会详细解释)。
 
1. @version
格式如下:
@version 版本信息
其中,“版本信息”代表任何适合作为版本说明的资料。若在 javadoc命令行使用了“-version”标记,就会从生成的 HTML 文档里提取出版本信息。
 
2. @author
格式如下:
@author 作者信息
其中,“作者信息”包括您的姓名、电子函件地址或者其他任何适宜的资料。若在javadoc命令行使用了“-author”标记,就会专门从生成的HTML 文档里提取出作者信息。 可为一系列作者使用多个这样的标记,但它们必须连续放置。全部作者信息会一起存入最终HTML 代码的单独一个段落里。

 

变量文档只能包括嵌入的HTML 以及@see 引用

 

方法文档标记
除嵌入HTML 和@see 引用之外,方法还允许使用针对参数、返回值以及违例的文档标记。
 
1. @param
格式如下@param 参数名 说明
其中,“参数名”是指参数列表内的标识符,而“说明”代表一些可延续到后续行内的说明文字。一旦遇到
一个新文档标记,就认为前一个说明结束。可使用任意数量的说明,每个参数一个。
 
2. @return
格式如下:
@return 说明
其中,“说明”是指返回值的含义。它可延续到后面的行内。
 
3. @exception 
@exception 完整类名 说明
其中,“完整类名”明确指定了一个违例类的名字,它是在其他某个地方定义好的。而“说明”(同样可以
延续到下面的行)告诉我们为什么这种特殊类型的违例会在方法调用中出现。
 
4. @deprecated
这是Java 1.1 的新特性。该标记用于指出一些旧功能已由改进过的新功能取代。该标记的作用是建议用户不
必再使用一种特定的功能,因为未来改版时可能摒弃这一功能。若将一个方法标记为@deprecated,则使用该
方法时会收到编译器的警告。

 

文档示例

//: Property.java
import java.util.*;
 
/** The first Thinking in Java example program.
 * Lists system information on current machine.
 * @author Bruce Eckel
 * @author http://www.BruceEckel.com
 * @version 1.0 
*/
public class Property {
  /** Sole entry point to class & application
   * @param args array of string arguments
   * @return No return value
   * @exception exceptions No exceptions thrown
  */
  public static void main(String[] args) {
    System.out.println(new Date());
    Properties p = System.getProperties();
    p.list(System.out);
    System.out.println("--- Memory Usage:");
    Runtime rt = Runtime.getRuntime();
    System.out.println("Total Memory = "
                       + rt.totalMemory()
                       + " Free Memory = "
                       + rt.freeMemory());
  }   59
} ///:~
 
第一行:
//: Property.java
将一个“:”作为特殊的记号,指出这是包含了源文件名字的一个注释行。最后一行也用这样的一条注释结尾,它标志着源代码清单的结束。这样一来,可将代码从本书的正文中方便地提取出来,并用一个编译器检查。

 

编码样式

类:每个单词首字母大写

标识符:第一个单词首字母小写,后面的单词首字母大写

class AllTheColorsOfTheRainbow {
int anIntegerRepresentingColors;
void changeTheHueOfTheColor(int newHue) {
// ...
}
// ...
}

posted @ 2012-01-16 01:27  薇清浅  阅读(217)  评论(0编辑  收藏  举报