1、Java命名规范
类名,首字母大写
变量和方法,第一个单词要小写,后面的单词首字母大写。缩写要大写。
包名,全部小写
常量,大写,单词之见用_隔开
2、Java关键字
java的关键字都是小写的。NULL、then、sizeof都不是。
3、类型
java对一些原生类型如int float等进行封装成Integer,等。但是一般简便起见能用int就用,特别的,不要混合使用。
4、初始化
java中声明的时候直接会进行初始化。而且可以直接定义。
如public int a=1;
public Info info=new Info();
5、小技巧
输入",或者(,{等,会自己补全,这一点我很喜欢
F11为直接debug,F3转到定义。F6单步执行,F5进入函数体执行。
6、java中没有指针
但是有数组,而且非常方便,如定义一个类型数组,可以这样做
public Method[] method;
...
method=new Method[count];//此处相当于初始化
for(int i=0;i<count;i++){
method[i]=new Method(i)//此处为实例化多个Method
method[i].start();
}
用这种方法,成功实现了多线程。同时传入不同的参数i.
线程创建的两种方法
extends和Runnable,只要重写run函数即可,不需要@Override.
对于前者,实例化后可以直接调用start方法。
对于后者,只能用Thread t=new Thread(tt),其中tt为线程类。
t.start()来启动。同样可以用匿名内部类来实现。
Thread t=new Thread(new Runnable(){
public void run(){
}
});
7、java中没有多重继承
只能单继承,但是能有多个接口。
用extends关键字。调用父类的构造函数用super.
8、接口和抽象类的区别
接口是要实现的,需要重写其方法。
抽象类中,可以有非抽象方法,但是其抽象方法必须要重写,且要加上@Override
9、instanceof
a instanceof B
判断实例a的类型是否是B
返回boolean
10、区分equals和==的区别
equals和==都为引用比较
区别是,String 对这个函数进行了重写,变成了对内容的比较。
因此,建议在String中使用equals。
String s1="abc";//new String("abc");
String s2="abc";//new String("abc");
System.out.println(s1==s2);//true,false
System.out.println(s1.equals(s2));//true,true
String s1=new String("abc");
System.out.println(s1=="abc");//false
11、参数传递和引用
对于基本类型,如char/int等是按值传递的。
其他的如String StringBuffer是按引用传递的,但是要注意的是,String是例外,是不能被改变的。
在函数中进行修改,会修改引用指向的值,
但是若用 如r=new StringBuffer("test");
则r变成了一个新的引用,且有一个新的值,而原来引用是不变的。
12、final参数
(1)修饰 类,说明不能被继承
(2)修饰方法,说明不能被重写
(3)修饰变量,说明不能被修改,是一个常量,必须要初始化。
13、类型转换,强制转换
(1)从低向高是自动转换
(2)高向低是强制转化 如 byte a=(int) b;
(3)String的相关转化,如String 转int 可以用
int a=Integer.ValueOf(str);
Integer i=1;
String a=i.toString();//只有封装的类型才可以这样用
int a=2;
String a=String.ValueOf(a);
14、数组可以用 int [][]a,int a[][],int []a[]=new int[4][],new int[4][4],但是new int[][4]是不允许的。
直接初始化,new int[][]={{},{}};,但是new int int[4][]是不可以的,不能带参数。
不过可以new int[4][4],之后在程序中进行初始化。
返回数组的长度,用.length
15、类的声明
只能是public、abstract、final,但不能是private,因为用final就是阻止继承
16、静态关键字static
(1)静态代码块,只执行一次。
(2)静态函数只能调用静态成员,且没有this
(3)非静态成员函数可以调用静态成员
17、访问权限修饰符
可以是public private friendly
(1)friendly 是默认的,即什么都不加则是friendly,而且是不能加friendly
当子类和父类在同一个包中时,作用和protected一样,
在不同的包中时,则不能继承 ,而protected可以。
(2)protected在同一个包中可以被访问,在不同包中不能被访问,但是可以继承。
18、日期格式转换
(1)
Date now=new Date();
DateFormat df=DateFormat.getDateInstance();
String a=df.format(now);
System.out.println(a);//2015-10-4
(2)
GregorianCalendar gc=new GregorianCalendar(2015,Calendar.JULY,20);
Date d=gc.getTime();
DateFormat df=DateFormat.getDateInstance();
String a=df.format(d);
System.out.println(a);
加上第一句之后,就能够修改日期了。注意第二个参数为英文。
同样,GregorianCalendar 有add参数
如gc.add(GregorianCalendar .DATE,80);
19、覆盖和重载
覆盖只能用于子类覆盖父类,重载用于同一个类中的所有方法。
20、线程同步
可以用synchronized 和volatile
volatile只适用于基本变量如(int char 类型等),读写直接绕过高速缓存,读取内存。//非常简洁
synchronized 则用于代码块的操作,且是原子操作。
如:
private static Object lock=new Object();
synchronized(lock){
...
}
同样是很方便的。对于界面更新,以及文件操作都是非常有用的。
同样还有同步的方法,如
public synchronized void setName(int x){
}
线程调度:
java线程优先级共10级,数字越高代表等级越高,默认为5,
yield会让当前线程从运行状态转到准备运行状态,让出CPU时间,供其他线程使用。
Object 的几个方法:
wait(),wait(long timeout) 导致当前线程等待,直到其它线程调用此对象的notify()方法或notifyAll()方法
notify() 唤醒在此对象监视器上等待的单个线程。
getClass() 返回一个对象的运行时类
hashCode() 将地址转化成int并返回
toString() 返回对象的字符串表示,如对象名,在内存中的位置等。
clone() 创建并返回此对象的一个副本。
Math类
21、覆盖和重载
(1)覆盖要求参数和返回值都一致。而重载要求参数必须不一致
(2)覆盖只能用于子类覆盖父类,而重载适用于同一个类中的所有方法
(3)覆盖对访问权限和抛出的异常有特殊要求如:
不能降低权限,不能抛出更多的异常。私有不能被覆盖。若一个为静态,另一个也必须为静态。反之亦然。
父类的抽象方法可以通过两种途径被覆盖:一种是子类实现父类的抽象方法,另一种是子类重新声明父类的抽象方法。父类的非抽象方法可以被覆盖为抽象方法。
而重载没有这方面的需求
(4)父类的方法只能被覆盖一次,而重载可以重载多次。
22、文件操作
23、数据库JDBC
24、构造器
(1)初始化顺序为:父类静态变量->子类静态变量->父类非静态变量->父类静态代码块,->父类构造函数
->子类非静态变量->子类静态代码块->子类构造函数
注意:也就是说子类构造函数之前,必须调用父类构造函数,当没有显示调用时,会默认隐式调用父类的构造函数,相当于编译的时候插入super;语句
另外,如果子类重载了父类的public方法,那么初始化父类函数中,会用到重载过的方法,而不是原来的方法,这个和c++中的虚函数一致。
而成员变量则不受影响,父类成员函数调用父类成员变量,子类成员函数调用子类成员变量。(注意,若调用子类成员变量,注意此时可能只是默认初始化)
(2)构造器不能被继承,因此可以是任何方法的修饰符。
但是若为private ,则不能被实例化,不能被继承。
25、this和super
(1)this指当前对象,可以调用当前对象的成员,方法。在构造函数中,用this(参数)可以调用自己的其它构造函数
(2)可以将this作为参数传递给别的对象,如 Thread t=new Thread(this)
(3)匿名内和内部内使用this时,要用内名,如A.this.成员
super
(1)指父类对象,调用父类的成员,方法等。在构造函数中可以用super(参数)调用父类的构造函数,如果子类没有调用父类构造函数,则默认会添加super;调用父类构造函数。
(2)this()和super()不能同时使用,不然会构造父类两次。若父类没有定义默认构造函数,super()会出错
26、面向对象的特征
抽象、继承、封装、多态
继承:只能单一继承,但是可以实现多个接口
27、类的内部类,非常适合用于测试,注意不是在主类里面的,只是在同一个文件中,没有修饰符。
28、switch()和catch类型必须为byte short int char这几种类型,string是不可以的。default位置可以随便
29、注意循环中可以使用break label continue label来实现跳转,少用goto,这个是dijkstra提出的goto危害论。
30、异常
(1)try 可以抛出一个或多个异常。嵌套的try会压入堆栈,当throw发生的时候,会从内向外找,找到匹配的再处理。
(2)catch catch语句可以有多个,分别处理不同的异常。
(3)finally 当抛出一个异常时,其后的代码不会被执行,但是finally中的代码一定会被执行,常用来进行资源的清除工作,如关闭文件等操作。
建议不要用return,因为会使得catch抛出的异常不能被上级捕获,只能获得return的返回值。
(4)throws 总是出现在一个函数头中,用来表明该成员函数可能抛出的各种异常。
使用: bool f() throws Exception{
}
(5)throw 总是出现在函数体中,抛出异常后,程序终止。在嵌套的try语句中,找到合适的处理代码。
使用:catch(Exception e){
throw e;
//或者 throw new Exception("aaa");
}
31、断言 assert
assert 表达式
当为false的时候会抛出异常
32、垃圾回收机制
(1)JVM的垃圾回收机制对堆空间(存储着正在运行的应用程序所建立的所有对象)进行实时检测。当一个对象的引用计数为0时,则将其加入待回收列表中
但什么时候回收则由回收算法所决定。
(2)finalize()方法
对象销毁时,会执行finalize方法,因此可以将一些善后工作放在里面,相当于c++的析构函数。
33、初始器
(1)表达式型字段初始器
若用一个未初始化的变量来初始化一个变量,用i=this.j,加上this,会调用j的默认值0
使用如 int a=1;
(2)代码块静态初始器
只执行一次,
(3)代码块型实例初始器
对于一些常量的初始化,可以放在里面。记住常量必须要初始化。
final int a;
{
a=1;
}
34、Servlet/JSP基础
35、lang包中的接口,如vector等。
36、接口和虚函数