注:*表示0或多个;+表示1个或多个
Object-Oriented Programming
1.ConstrUCtor
没有返回值
假如只定义一个带参数的constructor,则lose缺省的无参数的constructor,new xx()会出错。
2.Source file layout:
定义顺序:Package – import – class declaration
一个文件至少应该有一个class,只能有一个public class,文件名必须要和public class的名称一致,假如没有public class,对文件名没有限制。
3.Package:
假如文件中没声明Package,则class属于缺省包,即没有名字的包
Identifiers,KeyWords,and Type
1.Identifiers:
开头以Unicode letter,”_”和”$”。后面可以跟数字;(中文变量,方法名居然都可以!!!牛)
大小写敏感;
没有长度限制。
Warning:
类名必须是ASCII的字母。因为很多文件系统不支持UNICODE.(不过我试了一下,类名是中文的,Compile的时候是可以通过,Runtime时throw Java.lang.NoClassDefFoundError)
2.Keywords:
几个 很生僻的Keywords:
transient,strictfp,volatile
没有goto和const;没有sizeof()。
4.Basic Java Type:
共8种。
Boolean和integer Type之间不能转化。
5.Integral:
Byte:8bit -2的7次方~2的7次方-1
short:16bit
int:32bit
long:64bit
6.Floating point
float:32bit
double:64bit
浮点形默认是double.
float a = 1.02 //compile error
float a = 1.02f or float a = 1.02F //correct
7.类型的取值范围
Data TypeSize (bits)Initial ValueMin ValueMax Value
boolean1false falsetrue
Byte80-128 (-27)127 (27 – 1)
Short160-215 215 - 1
Char16‘\u0000’‘\u0000’ (0)‘\uFFFF’ (216 – 1)
Int320-231 231 - 1
Long640L-263 263 - 1
Float320.0F1.4E-453.4028235E38
Double640.04.9E-3241.7976931348623157E308
8.Assignment of Reference Type
基本类型的赋值是值的赋值;int x =6; int y = x;相当于复制x的内容到y上。
对象的赋值不会赋值内容,两个对象的指针都是指向同一个object..
9.Pass by Value
Pass argument by Value. 当方法的参数是对象的引用时,参数的值是对象的地址,对象是可以在参数调用时改变的。
Public class test{
Public static void changeObject(MyDate ref){
Ref = new MyDate(1,2,2002);
}
public static void main(String[] arv){
MyDate d = new MyDate(3,3,1988);
ChangeObject(d);
}
}
结果是d还是为1988,3,3;因为对象的地址是不变的。
10.Java Coding Convention(编码惯例)
Package – 名词且小写
Class--名词且第一个字母大写
Interface—同Class
Methods-动词且第一个字母小写,分隔词第一个字母大写,不用”-“
Variable—第一个字母小写,不用”_”,”$”(对于inner class有意义)
Constants—大写并用”_”
EXPression and Flow Control
1.
Local variables—Variable defined in method
Instance variables—Variable defined outside method
Instance variable initialize:
byte,short,int,long,float,double:0
boolean:false
char:’\u0000’
all reference type:null
2.Bitwise logic Operators
位逻辑运算符作用于整形。(byte,char,short,int,long)
3.
右移是把第一个操作数/2的第二个操作数次方
e.g
1284 returns 128/(2的4次方)
4.优先级
助记词 运算符类型 运算符
UlcerUnary+ - ++ – [[ rest...]],()cast
AddictsArithmetic (and shift)* / % + -
ReallyRelational =
LikeLogical (and bitwise)&& & ^
CConditional (ternary)A B ? X : Y
A LotAssignment= (and compound assignment like *=)
Note:
对于int,其实是右移右操作数的求32的模;对于long,其实是右移右操作数的求64的模
int y = x 32 ,y没有改变,而不是0.(我试了一下,byte和short分别右移8和16,结果都为0)
4.
110002 returns 11110
110002 returns 00110
Note:
只对int,long有效。假如对于byte和short,在之前先promote成int,右移完再折回byte或short,这样,通常unsigned shift becomes signed shift
5.
128
6.+
short x =5;
short y=6;
short z=x+y;//compile error
因为+的结果最小起码是int
7.cast
7.if()要求的是一个boolean表达式
if(x) //int x cause error
use if(x!=0)
8.switch(exp1)
exp1必须是和int兼容,(byte,short,int,char)
float,long,和类指针(String)都不答应。
9.label:statement
statement必须是循环(break 还可以是switch)
Array:
1.初始化
s = new char[5] //initialize for ‘\u0000’
2.多维数组的定义
int [][] a = new int [2][];
a[0] = new int[4];
a[1] = new int[6];
System.out.println(a.length);
System.out.println(a[0].length);
Result:
2
4
3.数组的复制
int a[]={1,2,3};
int b[]={4,5,6,7,8,9};
System.arraycopy(a,0,b,0,a.length);
Result:
b[]={1,2,3,7,8,9}
Note:
System.arraycopy拷贝的是引用,而不是Object.(我试了,假如是基本类型的数组,用arraycopy后,修改其中一个数组的值,另一个数组是不变的;假如是对象的数组,则值会改变)
Inheritance
1.Constructors Are not Inherited
2.instance of 检查对象的类型(类,接口,数组)
3.cast
Up Cast(parent class = subclass) :直接用=转化
Downward(subclass = parent class):假如该对象不是要转化的那个对象,则会在Runtime的时候出错。
4.OverLoading Method
必须有不同的参数,可以有不同的返回类型
5.Overriding Method
有相同的函数名,参数类型,和返回值,实现可以不一样。并且子类的方法不能比父类的函数的访问权限小。
6.Super
在Constructor中假如要调用Super的话应该写在第一行
Super能指定参数调用父类的Constructor
假如在Constructor中没有调用Super,则Compiler会隐含调用父类的”default”的Constructor
假如父类没有定义非私有的“default”的Constructor,则Compile Error
7.构造函数初始化
1.分配对象的空间,把instance variable设置default value(Boolean-false,Integer,float-0,reference-null)
2.
2.1绑定Constructor的参数
2.2假如有this(),跳到2.5
2.3递归调用implicit 或explicit的super
2.4执行instance variable的explict的赋值
2.5执行当前的Constructor.
7.Constructor的Rule
在Constructor中调用的函数应为私有函数。
因为假如超类Employee的Constructor中有公有函数getDetail,类Manager继续Employee,而manager中override此函数getDetail,声明一个manager的对象时会递归调用Employee的Constructor,而因为是runtime check,实际上Emplyee中调用的getDetail是Manager的getDetail。
public class Emploee extends Object {
private String name;
private double salary = 15000.00;
private Date birthDate;
private String summary;
public Emploee(String n, Date DoB) {
name = n;
birthDate = DoB;
summary = getDetails();
}
public Emploee(String n) {
this(n, null);
}
private String getDetails() {
return "Name: " + name + "\nSalary: " + salary
+ "\nBirth Date: " + birthDate;
}
public static void main(String[] arg)
{
Manager m = new Manager("2","gl");
}
}
class Manager extends Emploee {
private String department;
public Manager(String n, String d) {
super(n);
department = d;
}
public String getDetails() {
return "\nDept: " + department;
}
}
8.假如重载equals,最好重载hasCode()
9.toString