`
qqqckm
  • 浏览: 11575 次
  • 来自: ...
社区版块
存档分类
最新评论

《JAVA编程思想2》笔记

    博客分类:
  • Java
阅读更多

1 对象入门 <o:p></o:p>

Smalltalk 的五大基本特征 <o:p></o:p>

(1) 所有东西都是对象 <o:p></o:p>

(2) 每个程序都是一大堆对象的组合;通过消息的传递一个对象可告诉另一个对象该做什么 <o:p></o:p>

(3) 每个对象都有自己的存储空间可容纳其他对象,换句话说,通过封装一个现有的对象还可生成一个新对象 <o:p></o:p>

(4) 每个对象都有一种类型 <o:p></o:p>

(5) 同一类所有对象都能接收相同的消息 <o:p></o:p>

2 万事万物皆对象 <o:p></o:p>

一.所有对象都必须由你建立

1 存储在哪里

1) 寄存器:我们在程序中无法控制; 速度最快 数据位于处理器的内部

2) stack :存放基本类型的数据和对象的 reference ,但对象本身不存放在 stack 中,而是存放在 Heap 中;位于 RAM 中;处理器通过 堆栈指针访问,下移创建新内存,上移释放内存

3) Heap :存放用 new 产生的数据

4) Static storage :存放在对象中用 static 定义的静态成员

5) Constant storage :存放常量;需严格保护的常量,可考虑放入 ROM

6) NON-RAM :硬盘等永久存储空间

2 特例:基本型别

基本类型数据存放在 Stack 中,存放的是数据。而产生对象时,只把对象的 reference 存放在 stack 中,用于指向某个对象,对象本身存放在 Heap 中。

Java 提供了两个类,专门用于进行高精度运算 BigInteger BigDecimal

3 Java 中的数组

当你产生某个存储对象的数组时,真正产生的其实是存储 reference 的数组。引数组建立后,其中的每一个 reference 都会被自动设为 null ,表示“不指向任何对象”。

4 作用域 Scope <o:p></o:p>

作用域是由花括号的位置决定的。需要说明的是,在java中,如下代码是不允许的。 <o:p></o:p>

{<o:p></o:p>

int x = 12;<o:p></o:p>

{<o:p></o:p>

int x = 96; /* illegal */<o:p></o:p>

}<o:p></o:p>

}<o:p></o:p>

二.建立新的数据型别: Class

1 数据成员和函数

1.1 基本成员的缺省值

1 class 的某个成员属于基本型别时,即使你没有为它提供初值, Java 仍保证它有一个缺省值。

2 只有当变量身份是 class 内的成员时, Java 才保证为该变量提供初值。

*:浮点型数默认的是 double <o:p></o:p>

三.函数( Mehtods ),引数( arguments ),返回值( return values

1 引数列

当引数传递的是对象时,传递的是对象的 reference

*: packcage 的命名 以小写字母为标准; Java 的设计者鼓励程序员反转使用自己的 Internet 域名,因为它们肯定是独一无二的。 <o:p></o:p>

四.开始构建Java 程序<o:p></o:p>

import java.util.*;注意*只能包含当前目录下的所有类不能包含子目录中的类。<o:p></o:p>

五.注解用内嵌式文档

Java 提供两种注解风格: /*XXXX*/ //XXXX

javadoc /**   */ 两种方式来使用 javadoc 嵌入的 HTML 或 使用文档标记 <o:p></o:p>

文档标记 Doc tags 是一些以 @ 开头的命令,置于注释行的起始处,但最前头的 * 会被忽略。

@see 采用超链接的形式指向其他文档。后面跟上:类名、完整类名或者完整类名 # 方法名;

@version 版本信息

@author 作者信息

@since 是从该代码的哪个版本开始启用

@param 参数名 说明

@return 说明

@throws 完整类名 说明

@deprecated

3 控制程序流程 <o:p></o:p>

一. 使用 Java 运算符

1. 函数引数如果为对象类型,是传递引用的

2. 关系运算符

1. 当对两个对象运用关系运算符进行比较时,比较的是 object reference ,如:

Integer n1 = new Integer(3);

Integer n2 = new Integer(3);

System.out.println(n1==n2);

结果为 false ,因为两个 object reference n1 n2 )值是不同的

2 quals() 的缺省行为也是拿 reference 来比较。不过 Java 中的 class 大多覆写了 equals 方法,如:

Integer n1 = new Integer(3);

Integer n2 = new Integer(3);

System.out.println(n1.quals(n2));// 值为 true

2 逻辑运算符

1 只能将 and or not 施用于 boolean 值身上。如果逻辑运算符两边的值存在 non-boolean 值,将会出错,如:

int test1 = 1;

System.out.println((test && 1<2);// 编辑出错, test non-boolean

*: 操作逻辑运算符时,可能会遇到一种名为短路的情况。 <o:p></o:p>

3 位运算符

按位运算符可与等号 = 联合使用,以便同时进行运算和赋值, &= |= ^= 都是合法的,由于 ~ 是一元运算符,所以不可与 = 联合使用。

4 .位移运算符

如果所操作的位移对象是 char byte short ,位移动作发生之前,其值会先被晋升为 int ,运算结果会是 int

二.流程控制

1 迭代( iteration

1.1 逗号运算符

逗号运算符只能用于 for 循环的控制表达式中的 initialization step 两部分中,如: for(int i=0, j=I+1; I<5; i++, j=I*2)

1.2 break continue

break 表示退出循环; continue 表示退出本次循环,回来循环起始位置。

1.3 label

label 只有放在迭代语句之前才起作用,在 label 和迭代语句之间插入任何语句都不会起作用。

2 Switch

switch 中的选择器必须是 int char 型,如:

float i = 2;

switch ( i )// 将出错,因为 i 不是 int char 之一

3 计算细节

1 float double 转为整数值,总是以完全舍弃小数的方式进行。

4 Math.random() 的输出范围是 [0, 1)

4 初始化和清理 <o:p></o:p>

一.以构造函数( constructor )确保初始化的进行

如果某个 class 具备构造函数, Java 便会在对象生成之际,使用者有能力加以操作之前,自动调用其构造函数,于是便能名确保初始化动作一定被执行。

二.函数重载( Method overloading

1 区分重载函数

由于只能从函数名和函数的引数列来区分两个函数,而重载函数具有相同的函数名称,所以每个重载函数都必须具备独一无二的引数列。

2 default 构造函数

1 default 构造函数是一种不带任何引数的构造函数。如果你所开发的 class 不具任何构造函数,编译器会自动为你生成一个 default 构造函数。

2 如果你自行定义了任何一个构造函数(不论有无引数),编译器就不会为你生成 default 构造函数。

3 如果定义了一个 class ,如

class Bush{

Bush(int I){}

}

当想用 new Bush(); 来产生 class 的实例时,会产生错误。因为在定义 class 时已定义了构造函数,所以编译器就不会为 class 生成 default 构造函数。当我们用 new Bush() 来产生实例时,会尝试调用 default 构造函数,但在 class 中没有 default 构造函数,所以会出错。如:

class Sundae

{

Sundae(int i) {}

}

public class IceCream

{

public static void main(String[] args)

{

//Sundae x = new Sundae(); 会编译出错,无构造函数 Sundae()

Sundae y = new Sundae(1);

}

}

*:在定义一个 class 时,如果定义了自己的构造函数,最好同时定义一个 default 构造函数

3 关键字 this

1 this 仅用于函数之内,能取得“唤起此一函数“的那个 object reference

2 在构造函数中,通过 this 可以调用同一 class 中别的构造函数,如

public class Flower{

Flower (int petals){}

Flower(String ss){}

Flower(int petals, Sting ss){

//petals++; 调用另一个构造函数的语句必须在最起始的位置

this(petals);

//this(ss); 会产生错误,因为在一个构造函数中只能调用一个构造函数

}

}

**: 1 )在构造调用另一个构造函数,调用动作必须置于最起始的位置

2 )不能在构造函数以外的任何函数内调用构造函数

3 )在一个构造函数内只能调用一个构造函数

4 Static 的意义

无法在 static 函数中调用 non-static 函数(反向可行)。为什么不能呢,我们看下面的例子。

假设能在 static 函数中调用 non-static 函数,那么( a )处就将出错。因为在没有产生 Movie class 实例之前,在就不存在 Movie class 内的 name 实例,而在 getName() 中却要使用 name 实例,显然的错误的。

class Movie{

String name = “”;

Movie(){}

public Movie(String name) { this.name = name; }

public static String getName() { return name; }

}

public class Test{

public static void main(String[] args){

// 下面两名先产生实例后再调用 getName() 没有问题

//Movie movie1 = new Movie(“movie1”);

//String name1 = movie1.getName();

// 下面一行将出错

//String name2 = Movie.getname();   a <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Time

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics