一、Java基础语法
1.参数传递
void change(String s, Integer x, Double f, ArrayList<Integer> list, Node node, char[] a);
- 前三个是传值调用,方法里修改形参不会对原来的值造成影响;
- 后三个是引用调用,方法里修改形参会对原来的值(地址中的值)造成影响;
2.静态变量能否用this调用?
在语法上行得通,但是静态变量是所有实例共享的一个变量,而this通常指当前对象;用对象名调用普通变量,用类名调用静态变量更加直观。许多题目把this调用直接打死,按它们的来。
3.形参引用
静态变量或普通变量a和方法形参a同名,不论类型是否相同,在方法里都是优先使用形参。方法里形参是老大,所以set方法形参同名需要加上this,不同名可以不加this。
4.初始化二维数组
不一定按照n*m矩阵来初始化
int[][] a=new int[][]{ {1,2},{3,4,5,6,7},{1},{33},{21,352} };
a.length=5;a[0].length=2;a[1].length=5;
等号左边合法的有:int[][] a、int[] b[]、int c[][];等号右边合法的有new int[5][5]、new int[5][]、{}、{{}};
5.try-catch-finally
- try中有异常不会执行异常语句后的代码,因此有异常时try中的return作废;
- catch,有异常才会执行,return等级>try的return;
- finally,有没有异常都会执行,return等级>catch>try;
- try必然要有,catch和finally至少保留一个;
(1)try和finally都没有return
- 如果try没有异常则执行try→finally;
- 如果try有异常,则执行try→catch→finally;
- 并且会继续执行finally后的代码块,若是停了那就体现不出捕获异常的作用了;
如果try里有异常并且finally里又有异常,如果不捕获finally里的异常则程序终止(不会运行finally后的代码),捕获则按常理度之;
(2)try有return,catch没有return,finally没有return
由于try中异常语句后的代码不会执行,所以finally代码块后还有需要有return语句兜底;
- 如果try有异常,执行try-catch-finally,最终返回值取finally代码块后的return;(如果catch里有return 则取catch里的,最后的return语句作废;)
- 如果没有异常,执行try代码块就跑了,返回值取try里的;
(3)try有return,catch有return,finally没有return
- try没有异常,返回值取try的;
- try有异常,返回值取catch的;
finally代码块后不可以有代码,因为try或者catch会返回函数,不执行到后面;
(4)finally有return
不论try和catch有没有return,返回值都取finally里的,并且finally代码块后不允许有代码了;
(5)没有catch,有finally
无返回值时,发生异常程序终止(不会执行finally后的语句),因此catch是解决异常的关键;
6.运算&赋值
- System.out.println( (5>4)?8:4.05 );//输出8.0
- (short)10/10.2*2; 结果是double类型,先将10强转为short,又因为运算过程自动向上转型变成double的运算,最后结果是double类型
- int x=20,y=5;System.out.println(x+y+""+(x+y)+y);//25255
- System.out.println(5+6+""+5+7);//1157 任何字符与字符串相加都是字符串,但是字符串前面的按原格式相加后拼接,字符串后面的直接按字符串拼接
- 运算优先级:>、<、&&、||。例如b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;变成b=(x>50&&y>60)||(x>50&&y<-60)||(x<-50&&y>60)||(x<-50&&y<-60);
- 乘除模运算优先级相同,10%3*2=1*2=2;
- int a=1_0_2_4;数值间插入下划线这是合法的;
- char、byte和short参与运算时会自动将这些值转换为int类型再进行运算;short a1=3,a2=4,a3;a3=a1*a2;这样会报错,但是a3=3*4;不会报错;
7.Java变量
- 实例变量:定义在类中但不在方法里,即类的成员属性。具有默认值,数值类型默认0,布尔类型默认false,引用类型默认null,可以在声明时指定,也可以在构造方法中指定;
- 局部变量:方法中的变量,需要先赋值再运算。不赋值直接使用会导致 编译不通过。在方法中任意写个花括号也属于一个局部,在花括号内定义的变量不能用在括号外;
- 静态变量:类似方法,只加载一次,放在堆里,类的多个对象共享一个静态变量(方法);
8.StringBuilder、StringBuffer、String
- 线程安全性:StringBuffer和String线程安全,StringBulider线程不安全。
- 运行速度:StringBuilder>StringBuffer>String。
9.数组复制效率
System.arraycopy > clone > Arrays.copyOf > for循环
System.arraycopy和clone都是native方法,记一下就好。Arrays.copyOf是对System.arraycopy的调用,多了一层肯定不是最快的,for循环我都会写肯定是最慢的。
10.Java程序的种类
内嵌于Web文件中由浏览器观看的Applet;可独立运行的Application;服务器端的Servlets。
11.注释与编译
注释是给人看的,不是给机器看的。编译器不会编译注释中的内容;字节码文件也没有注释内容;注释过多也不会导致编译后的程序尺寸变大。
点开一些jar包的看看字节码文件.class,发现全都没有注释,然而Java文件就有注释。
12.基本数据类型的声明
double d0=1;//正确,输出1.0 double d1=1.0;//正确,输出1.0 Double d2=1.0;//正确,输出1.0 Double d3=1;//错误;正确的是1D,输出1.0 double d4=666.00;//正确,输出666.0 float f1=4.0;//错误;正确的是4.0F,输出4.0 float f2=4;//正确,输出4.0 Float f3=4;//错误;正确的是4F,输出4.0 Float f4=4.0;//错误;正确的是4.0F,输出4.0 int i=(int)true;//错误,boolean不可以和其他类型转换 long l1=012;//正确 0前导表示八进制,0x表示十六进制 long l2=12;//正确 Long l3=12;//错误;正确的是12L Long l4=012;//错误;正确的是012L
13.集合类的线程安全
14.构造方法
- 构造方法没有返回值,并不是void;
- 构造方法优先级最低;
- 构造函数不能被继承,构造方法只能被显式或隐式的调用。
15.初始化代码执行顺序
父类静态变量→父类静态代码块→子类静态变量→子类静态代码块→
父类普通变量→父类普通代码块→父类构造方法→
子类普通变量→子类普通代码块→子类构造方法
严格的说,静态变量+静态代码块=静态域,不包括静态方法,谁先谁后根据在类中的位置,由于一般都是先声明变量的,所以有这样的总结。这里有一个难以想象的题目,十有八九会被坑,详看代码及注释,节省篇幅。
public class B { public static B t1 = new B(); public static B t2 = new B(); { System.out.println("构造块"); } static { System.out.println("静态块"); } public static void main(String[] args) { B t = new B(); } } /** 输出: 构造块 构造块 静态块 构造块 -------------------------------------------------- 解释: 1.加载B.class 2.按照顺序先对t1和t2进行初始化,默认为null 3.又需要对t1和t2进行显示初始化,所以需要加载默认的构造方法和普通代码块 4.为什么不会加载静态代码块呢? 5.因为刚开始加载B.class时就算是加载了静态域,现在还没加载完,又不能重复加载,所以没有在初始化t1的时候输出静态块 6.t1和t2加载完了按顺序就轮到静态代码块了 7.走main方法,又创建一次B对象,执行构造方法和普通代码块 要点:静态域只加载一次,不能重复加载 */