1.需要注意的是,如果将一个类声明成public,则也要将文件名称取成和这个类一样的名称,如图2-1所示。本例中的文件名为TestJava2_1.java,而public之后所接的类名称也为TestJava2_1。也就是说,在一个Java文件里,最多只能有一个public类,否则.java的文件便无法命名。
2.在Java中取得数组的长度(也就是数组元素的个数)可以利用“数组名.length”完成
3.“匿名对象”,顾名思义,就是没有明确的声明的对象。读者也可以简单的理解为只使用一次的对象,即没有任何一个具体的对象名称引用它。
System.out.println(new Person().talk());
4.有两种方式可用于对象间的比较,它们是“= =”运算符与equals()方法,“= =”操作符用于比较两个对象的内存地址值是否相等,equals()方法用于比较两个对象的内容是否一致。
5.在使用static类型声明的方法时需要注意的是:如果在类中声明了一static类型的属性,则此属性既可以在非static类型的方法中使用,也可以在static类型的方法中使用。但用static类型的属性调用非static类型的属性时,则会出现错误。
6.静态代码块 一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只执行一次,静态代码块经常用来进行类属性的初始化。
public class TestStaticDemo5 {
// 运行本程序时,静态代码块会被自动执行
static
{
System.out.println("3.TestStaticDemo5类的静态代码块被调用!");
}
7.对象用final标记,表示不能再重新实例化
8.内部类可声明成public或private。当内部类声明成public或private时,对其访问的限制与成员变量和成员方法完全相同。
9.内部类不仅可以在类中定义,也可以在方法中定义内部类。
10.Java类的继承
class 子类extends 父类 // 用extends关键字实现类的继承 |
11.在java中只允许单继承,而不允许多重继承,也就是说一个子类只能有一个父类,但是java中却允许多层继承
12.super主要的功能是完成子类调用父类中的内容,也就是调用父类中的属性或方法。
13.用super调用父类中的构造方法,只能放在程序的第一行。
14.Object类 Java中有一个比较特殊的类,就是Object类,它是所有类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类就默认继承Object类。因此,Object类是Java类层中的最高层类,是所有类的超类。换句话说,Java中任何一个类都是它的子类。由于所有的类都是由Object类衍生出来的,所以Oject类中的方法适用于所有类。
15.final 在Java中声明类、属性和方法时,可使用关键字final来修饰。
* final标记的类不能被继承。
* final标记的方法不能被子类复写。
* final标记的变量(成员变量或局部变量)即为常量,只能赋值一次。
16.接口(interface)是Java所提供的另一种重要技术,它的结构和抽象类非常相似,也具有 数据成员与抽象方法,但它与抽象类又有以下两点不同:
*接口里的数据成员必须初始化,且数据成员均为常量。
*接口里的方法必须全部声明为abstract,也就是说,接口不能像抽象类一样保有一般的方法,而必须全部是“抽象方法”。
接口定义的语法如下:
interface 接口名称 // 定义抽象类 { final 数据类型成员名称 = 常量; // 数据成员必须赋初值 abstract 返回值的数据类型方法名称(参数…); |
17.既然接口里只有抽象方法,它只要声明而不用定义处理方式,于是自然可以联想到接口也没有办法像一般类一样,再用它来创建对象。利用接口打造新的类的过程,称之为接口的实现(implementation)。
格式6-6为接口实现的语法:
【 格式6-6 接口的实现】 |
class 类名称 implements 接口A,接口B // 接口的实现 { ...} |
18.一个类只可以继承一个父类,但却可以实现多个接口。
19.
接口的扩展(或继承)也是通过关键字extends来实现的。有趣的是,一个接口可以继承多个接口,这点与类的继承有所不同。格式6-7是接口扩展的语法: 【 格式6-7 接口的扩展】 interface 子接口名称 extends 父接口1,父接口2,… { ...} |
20.匿名内部类
get(new A()
{
public void fun1()
{
System.out.println(i) ;
}
}
) ;
异常处理
21.*try程序块若是有异常发生时,程序的运行便中断,并抛出“异常类所产生的对象”。
*抛出的对象如果属于catch()括号内欲捕获的异常类,则catch会捕捉此异常,然后进到catch的块里继续运行。
*无论try程序块是否有捕捉到异常,或者捕捉到的异常是否与catch()括号里的异常相同,最后一定会运行finally块里的程序代码。
异常处理的流程图
异常处理的方法
包及访问权限
22.当一个大型程序由数个不同的组别或人员开发共同开发时,用到相同的类名称是很有可能的事。如果这种情况发生,还要确保程序可以正确运行,就必须通过package关键字来帮忙了。
package是在使用多个类或接口时,为了避免名称重复而采用的一种措施。那么具体应该怎么使用呢?在类或接口的最上面一行加上package的声明就可以了。
package package名称 ; 例如:package demo.java ;
23.import demo.java.a.*,表示导入包中的所有类,另外需要告诉读者的是,在java中有这样的规定:导入全部类或是导入指定的类,对于程序的性能是没有影响的,所以在开发中可以直接写导入全部类会比较方便。
24.JDK中常见的包
SUN公司在JDK中为程序开发者提供了各种实用类,这些类按功能不同分别被放入了不同的包中,供开发者使用,下面简要介绍其中最常用的几个包:
1、 java.lang — 包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。在java.lang包中还有一个子包:java.lang.reflect用于实现java类的反射机制。
2、 java.awt — 包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
3、 javax.swing — 此包用于建立图形用户界面,此包中的组件相对于java.awt包而言是轻量级组件。
4、 java.applet — 包含applet运行所需的一些类。
5、 java.net — 包含执行与网络相关的操作的类。
6、 java.io — 包含能提供多种输入/输出功能的类。
7、 java.util — 包含一些实用工具类,如定义系统特性、与日期日历相关的函数。
注意:java1.2以后的版本中,java.lang这个包会自动被导入,对于其中的类,不需要使用import语句来做导入了,如前面经常使用的System类。
25.JAVA中有四种访问控制权限,分别为:private、default、protected、public
private访问控制符
在前面已经介绍了private访问控制符的作用,如果一个成员方法或成员变量名前使用了private访问控制符,那么这个成员只能在这个类的内部使用。
注意:
不能在方法体内声明的变量前加private修饰符。
默认访问控制符(c++没有此控制符,默认是private)
如果一个成员方法或成员变量名前没有使用任何访问控制符,就称这个成员所拥有的是默认的(default)访问控制符。默认的访问控制成员可以被这个包中的其它类访问。如果一个子类与其父类位于不同的包中,子类也不能访问父类中的默认访问控制成员。
protected访问控制符
如果一个成员方法或成员变量名前使用了protected访问控制符,那么这个成员既可以被同一个包中的其它类访问,也可以被不同包中的子类访问。
public访问控制符
如果一个成员方法或成员变量名前使用了public访问控制符,那么这个成员可以被所有的类访问,不管访问类与被访问类是否在同一个包中。
26.Java的命名习惯
读者通过查看JDK文档,可以发现,在JDK中类的声明、方法的声明、常量的声明都是有一定规律的,规律如下:
◆ 包名中的字母一律小写,如:demo.java。
◆ 类名、接口名应当使用名词,每个单词的首字母大写,如:TestPerson。
◆ 方法名,第一个单词小写,后面每个单词的首字母大写,如:talkMySelf。
◆ 常量名中的每个字母一律大写,如:COUNTRY。
27.Jar文件的使用
开发者用的JDK中的包和类主要在JDK的安装目录下的jre\lib\rt.jar文件中,由于Java虚拟机会自动找到这个jar包,所以在开发中使用这个jar包的类时,无需再用classpath来指向它们的位置了。
jar文件就是Java Archive File,而它的应用是与Java息息相关的。jar文件就是一种压缩文件,与常见的ZIP压缩文件格式兼容,习惯上称之为jar包。如果开发者开发了许多类,当需要把这些类提供给用户使用时,通常都会将这些类压缩到一个jar文件中,以jar包的方式提供给用户使用。只要别人的classpath环境变量的设置中包含这个jar文件,Java虚拟机就能自动在内存中解压这个jar文件,把这个jar文件当作一个目录,在这个jar文件中去寻找所需要的类及包名所对应的目录结构。
jar命令是随JDK一起安装的,存放在JDK安装目录下的bin目录中(比如在本书中是c:\j2sdk1.4.0\bin目录下),Windows下的文件名为jar.exe,Linux下的文件名为jar。jar命令是Java中提供的一个非常有用的命令,可以用来对大量的类(.class文件)进行压缩,然后存为.jar文件。那么通过jar命令所生成的.jar压缩文件又有什么优点呢?一方面,可以方便管理大量的类文件,另一方面,进行了压缩也减少了文件所占的空间。对于用户来说,除了安装JDK之外什么也不需要做,因为SUN公司已经帮开发者做好了其它的一切工作。
28.
此要使一个类可激活线程,必须按照下面的语法来编写: 【 格式9-1 多线程的定义语法】 |
class 类名称 extends Thread // 从Thread类扩展出子类 { 属性 方法… 修饰符 run(){ // 复写Thread类里的run()方法 以线程处理的程序; } } |
29.JAVA程序只允许单一继承,即一个子类只能有一个父类,所以在Java中如果一个类继承了某一个类,同时又想采用多线程技术的时,就不能用Thread类产生线程,因为Java不允许多继承,这时就要用Runnable接口来创建线程了。
30.Thread类实现了Runnable接口,也就是说Thread类也是Runnable接口的一个子类。
31.可见,实现Runnable接口相对于继承Thread类来说,有如下显著的优势:
(1)、适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码、数据有效分离,较好地体现了面向对象的设计思想。
(2)、可以避免由于Java的单继承特性带来的局限。开发中经常碰到这样一种情况,即:当要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么就只能采用实现Runnable接口的方式了。
(3)、增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程可以操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。(继承Thread类的子类的对象之间不能共享数据)
事实上,几乎所有多线程应用都可用第二种方式,即实现Runnable接口。
32.任何线程一般具有五种状态,即创建、就绪、运行、阻塞、终止。
33.main()方法也是一个线程,实际上在命令行中运行java命令时,就启动了一个JVM的进程,默认情况下此进程会产生两个线程:一个是main()方法线程,另外一个就是垃圾回收(GC)线程。
34.对Java程序来说,只要还有一个前台线程在运行,这个进程就不会结束,如果一个进程中只有后台线程在运行,这个进程就会结束。前台线程是相对后台线程而言的,前面所介绍的线程都是前台线程。那么什么样的线程是后台线程呢?如果某个线程对象在启动(调用start()方法)之前调用了setDaemon(true)方法,这个线程就变成了后台线程。
35.使用sleep()方法会抛出一个InterruptedException,所以在程序中需要用try..catch()捕获。
36.在同一类中,使用synchronized关键字定义的若干方法,可以在多个线程之间同步,当有一个线程进入了有synchronized修饰的方法时,其它线程就不能进入同一个对象使用synchronized来修饰的所有方法,直到第一个线程执行完它所进入的synchronized修饰的方法为止。