Java程序员生存手册

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、接口和虚函数













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值