1、一般地,一个文件只存放一个类。当然,也可以将多个类放在同一个文件内,但只能有一个类声明为public,
此文件的名字需和声明为public的类同名。
2、Java严格区分大小写。
3、命名的习惯:类名中,各个英文名字的第一个字母使用大写,并且不要使用任何符号作为字与字之间的分隔。
4、类似C++,main()是Java程序执行的起点。Java只能执行包含main()的文件,它必须为public(热合对象都可
读取它)和,static(可被直接调用而无需有对象存在)以及void(无返回值),但这也不是绝对的。例如,
Apple和Servlet,它们不是从main()开始执行的。
5、分号(;)是用来表示一个程序语句的结束。
6、/** …… */用来生成Java程序的说明文件。
7、javap可以用来读取.class文件的内容。
8、可利用Java反编译器来得到.class文件的Java源程序代码,如Jad或Decafe。
9、为了避免他人利用反向工程的方法来解读Java程序,可使用模糊器进行保护。如JBuilder就提供了此功能,
其他还有JCloak、JProof。
10、Applet是包含在HTML网页内,在客户端浏览器执行的Java小程序,Servlet是在服务器执行的Java程序。
11、Applet小程序需要有两个文件,一是Java小程序的源程序,二是包含此小程序的HTML文件。
12、有两种执行Applet小程序的方法,一是直接使用浏览器打开该HTML文件;二是使用appletviewer来执行该HTML文件。
13、标识符必须以字母、下划线(_)或美元符号($)开头,其余部分可由前面所说的字符以及数字(0~9)所组成。
14、关键字(keyword)不能作为标识符。
15、true、false、null并不是关键字,但也不能用作标识符。
16、Java基本上有类变量、实例变量和区域(local)变量3种类型的变量。类变量和实例变量只能在方法之外
声明,而区域变量只能在方法之内声明。
17、由于类变量和实例变量并不会占据命名的空间,因此,类内的方法仍可声明同名的变量。
18、数据类型分为引用数据类型和基本数据类型。
19、整数类型:byte、short、int、long、char
20、Java内置的运算符并不会处理溢出(overflow)或下溢(underflow)的问题。只有在使用运算符/或%时,
当被零除发生时会显示Arithmetric Exception,表示在数值处理时发生例外状况。
21、变量命名时,第一个英文字使用小写,其余英文字的第一个字母使用大写,并且不要使用任何符号作为字与字之间的分隔。
22、long numLong=5000000000L;L表示此数值的类型为long。
23、十六进制数值需在所要表示的数值前加0x或0X;八进制数值前需加0。
24、浮点类型:float、double
25、浮点运算时不会处理例外状况。当结果是溢出时,结果为Infinity;下溢时,则结果为0.0;若其结果时
数学上没有定义的,则结果为NaN(not a number)。所有和NaN有关的运算结果为NaN,和NaN进行数值比较时,
其结果总是false。
26、当指定浮点运算值时,其默认类型为double,要指定一个值为float时,需要在数值的后面加上F或f。
27、当由int或long转换为float,或由long转换为double时,由于float与double有效位数限制的关系,可能会造成精确度的损失。
28、1+"2"="12",由于"2"是字符串,当然不能执行数值运算,此时加号是作为字符串合并使用。
加号是一种运算符重载(operator overloading)
29、委派转换,等号左右两边的变量类型必须相同,否则,在编译程序时,会得到错误信息。
30、成员变量(类变量或实例变量)或数组有默认初始值;对于区域变量,没有默认初始值,因此,
在使用区域变量时,必须给它指定值。如果没有,在编译时往往会出现错误信息。
31、由封装对象转换为基本数据类型:obj.XXXValue();obj为封装类的对象,XXX为该封装对象所表示的
基本数据类型。
32、由字符串转换为基本数据类型:obj.parseXXX(String str);obj是封装类的对象,XXX为该封装对象
所表示的基本数据类型。
33、由字符串转换为封装对象:obj.valueOf(String str)。
34、由封装对象转换为字符串:obj.toString()。
35、由基本数据类型转换为字符串:obj.toString(XXX value)。
36、不等于:!=
37、运算符instanceof,如v1 instanceof v2。检查对象v1是否为class v2的一个实例。
38、逻辑运算符两边的式子需属于boolean。与C++不同,C++中,0之外的整数都视为true。
39、位(Bitwise)逻辑运算符: & ,v1 & v2。位AND,若相对位都为1,则1,否则0
| ,v1 | v2。位OR,若相对位都为0,则0,否则1
^ ,v1 ^ v2。位XOR,若相对的位有相同值,则0,否则1
~ ,~v1。v1的补码,1变成0,0变成1。
v1和v2需属于整数类型。
40、Java不支持操作重载,也不支持C++的::和>>以及<<运算符。
41、常量的指定:static final int NUM =1。
42、数组定义:int num []; or int [] num; num=new int [15]; or int [] num=new num[15]; or int
num[]={1,2,3,4,5};
43、若二维数组的第2维的长度不同,由于数组变量本身是参考类型,可将第1维指向另一个数组。
44、复制数组:void arraycopy(Object src,int srcPosition,Object dest,int destPosition,int
length) or clone() for example int [] newA=(int [])A.clone();
45、Arrays类提供的一些数组运算,如排序和搜索
static void sort(dataType[] data):将数组data内的元素由小到大排列(使用quicksort)
static void sort(dataType[] data,int fromIndex,int toIndex)
static int binarySearch(dataType[] data,dataType key):利用二进制搜索的方式搜索数组data
(必须事先排过序)内的元素key。若搜索到,则返回key在data中的位置;若无法找到,返回值为(-插
入点-1),插入点(insert point)为第一个大与所要搜索元素值的索引。
static void fill(dataType[] data,dataType val):将数组内的各元素设置为val。
static void fill(dataType[] data,int fromIndex,int toIndex,dataType val)
46、在Java中,char数组及String类并不以'\0'为结尾。char数组并不等于String对象,数组是可变的,
但String对象是不变的。
47、将char数组转换成一个String对象。char[] data={'s','t','r','i','n','g'};String str=new
String(data);
48、length()得到一个字符串的长度,而length可用来得到一个数组所含元素的数目。
49、由于Java的对象为引用类型,因此,string1==string2,只是比较变量string1和string2是否指向
同一个地址,并不会比较字符串的内容。
50、int compareTo(String str):s1.compareTo(s2)。若s1和s2相等,则返回0;若s1>s2,则返回值大于
0;若s1
boolean equals(Object obj):s1.equals(s2)。
boolean equalsIgnoreCase(String str):s1.equalsIgnoreCase(s2)。
51、搜索和读取部分字符串的操作:
boolean startsWith(String str):检查str是否在字符串的最前面
boolean endsWith(String str)
int indexOf(char ch):得到ch第一次在字符串中出现的位置,若无法找到则返回-1
int indexOf(String str)
int lastIndexOf(char ch):由后面开始搜索,得到ch第一次在字符串中出现的位置,若无法找到返
回-1
int lastIndexOf(String str)
String substring(int begin):生成一个新的字符串,它包含原有字符串位置begin至最末端的所有
字符
String substring(int begin,int end)
52、StringTokenizer(String str):使用默认的分界符来分析一个字符串,它们分别为:'','\t','\n'
,'\r','\f'。
StringTokenizer(String str,String delimiter):使用所指定的delimiter来分析字符串
53、StringBuffer类是用来生成字符串缓冲区,这种字符串称为可变字符串。StringBuffer对象的默认容
量是16个字符。
54、StringBuffer无法像String对象一样直接将字符串指定给StringBuffer对象,例如StringBuffer
myString3="this is worong"。必须使用new生成StringBuffer对象。
55、StringBuffer对象有容量和长度之分,容量是不变的,长度是可变的。长度小于等于容量,表示实际
存储的字符数目。
56.int capacity():返回StringBuffer对象的容量。
int length():返回StringBuffer对象的长度。
StringBuffer append(dataType data):将data加入StringBuffer对象后面
StringBuffer insert(int offset,dataType data):将data插入到offset位置前
String toString():将StringBuffer对象转换为String对象。
57、当存储的字符串长度超过其容量,容量会改为原来容量的两倍加上2。预先指定足够的容量效率较高
58、数据成员代表类内所声明的变量,分为static(类变量)和non-static(实例变量)
59、类内的方法分为static(类方法)和non-static(实例方法)
60、每个对象都有一个属于自己的实例变量和变量值,通过对象来存取实例变量。
61、每个类 只有一个类变量,属于该类的对象会共享类变量。不需要通过对象来存取类变量。
62、一个static方法只能存取类的static数据;一个static方法只能存取类的static方法;无法在算他题
词方法中使用this;一个static方法无法被非static方法所替代。
63、构造函数并没有返回值,它需和所在的类同名,如果所用的类并没有构造函数,Java编译器会自动生
成一个默认构造函数(不含参数)。
64、Java中,new是不可省略的,使用new表示该变量的内存是动态分配的,但必须记得将该内存释放掉。
65、基本数据类型将其值存放在堆栈中,而引用数据类型是将其引用存在堆栈中,但其所引用的对象则是
存在堆(heap)中。
66、Java有引用数据类型和基本数据类型,但只有一种传递方法,即通过数值传递(pass-by-value),
并没有通过引用传递(pass-by-reference)。方法接收到的是一份原来值的复制,对于基本数据类型,
所接收到的是一份该数据值的复制;而对于引用数据类型,所接收到的是一份该引用值的复制,而不是该
引用本身。
67、如果要在Java中达到像C/C++的通过引用传递的效果,一个办法是把数组作为参数。
68、除了声明为private的数据成员外,同一个包的类可以继承其他所有的数据成员,而其他包的类可以
继承public和protected的数据成员。这些准则适用于所有的数据成员(类或实例变量),同时也适应于
方法,但父类的构造函数并不会被继承。对定义为final的成员也无法被继承。
69、在使用方法重载时无法在同一个类中声明签名(方法名、参数数目、参数类型)相同但返回值不同的
方法。
70、将方法重载称为静态方法绑定或先期绑定,这是由于在编译时编译器会根据参数的类型和数目来决定
调用哪个方法,而不是在执行时决定。
71、可以将许多的类放在同一个文件中,但只能有一个类声明为public,其他的类称为辅助(helper)类
,辅助类也可包含main(),但会被忽略。
72、以下情况,此类必须声明为abstract:
该类有一个或超过一个abstract方法(声明但没有定义的方法)
该类从一个abstract类继承一个或超过一个abstract方法,但没有提供这些方法的实现方法
该类实现一个接口,但没有将该接口所有的方法加以实现
73、abstract方法不能被声明为private,因为abstract类会被其他类继承。无法生成一个abstract类的
对象,但可声明一个abstract类类型的变量。
74、多态(polymorphism)代表同样的表示法可用来处理多种不同类型的数据。重载是多态的一种,称为
静态多态。一般的多态是动态多态,是在执行时才根据对象来决定一个方法的行为,这是一种动态方法绑
定(后期绑定)。
75、C++中,多态通过虚拟函数实现,Java使用abstract类实现多态。
76、接口是用来表明一个类能做什么,但不表明如何完成(实际的工作会交由使用此接口的程序员来完成
),因此常使用接口来制定类设计的协议(protocol),而Java API设计的主要精神就是将接口和实际类
的实现分开,因为不同的系统可能会有不同的实现方法,但用户所使用的方式却是一样的,这可解决可移
植性问题。
77、接口和类一样可当作一种数据类型,但和abstract类一样,无法用它来生成新的对象。
78、一个接口是一群常量和abstract方法的组合,接口内的常量总是为public和static以及final(因此
,有时我们只会单纯地使用接口来存储用户自定义地常量而不包含任何方法),而方法总为public和
abstract,即使没有明确地声明。
79、一个类可通过关键字implements来实现接口,而类可实现一个以上的接口。
80、和类定义相同,一个接口可通过extends来继承其他接口,不同的是,接口支持多重继承,这是由于
接口内方法未定义,并不会产生类多重继承的问题。
81、和abstract类不同的是,当一个类实现接口,此类必须定义所有接口内的方法。
82、将接口和abstract类结合在一起。除了使用接口来进行多重继承外,一个常用的设计方式是使用接口
来生成新的数据类型,但不会被特定的实现方式限制住,这有点类似基本数据类型,并不会生成该类型的
对象,也没有实现任何方法。而abstract类也可用来定义新的数据类型,但会选择性地实现共同地方法。
当然,一般地类也可用来定义新地数据类型,但会实现全部地方法。因此,在设计一个较有扩充性地数据
类型时,往往会以接口为最上面一层,再以abstract类为中间的一层,而下面则为一般的类。
83、将类定义在另一个类内称为内部类。
84、匿名类是一种没有名称的内部类,它也没有构造函数。如:
button.addActionListener(new ActionListener()
{
用来实现ActionListener的程序主体
}//此对象仅用于addActionListener()中
)
85、在Java中,最常使用内部类和匿名类的地方是GUI。
86、由于匿名类并没有名称,因此生成的类文件会用数字表示,如Outer$1.class
87、垃圾回收:一个较好的方法是将不用的对象设为null。
88、强制执行垃圾回收:System.gc()。
89、finalize()是在对象释放前先执行,它是所有Java对象都会继承的方法。
90、生成包:只要在所定义的类程序的最前面加上package{packageName};放在import之前
评论