1,异常处理
jvm提供了垃圾回收机制,垃圾回收机制属于java内存管理的一部分,它只是负责回收堆内存中分配出来的内存,至于程序中打开的物理资源,如输入/出流,垃圾回收机制是无能为力的,要正确关闭。通常结合finally块
当java程序执行try/catch时遇到return或者throw语句时,return或throw会导致该方法立即结束。系统执行完retrun语句之后(注意,finally中如果没有return语句最终要返回的值是这里的,并且已经保存,不管finally中对数据是否修改了,如果finally有return,则根据finally中的返回),而是去寻找是否有finally块,如果有,系统立即执行finally块,只有当finally执行完成后,系统才会再次跳回来根据return或throw异常结束方法,如果finally中有return,则不用返回,直接结束
public class Test { public static int t(){ int a=5; try{ throw new Exception(); } catch(Exception e){ return a++; } finally{ ++a; System.out.println("finally:"+a); } } public static void main(String[] args) { System.out.println(t()); //finally:7 //5 } } //如果在finally最后加上return a; 则t()返回的是7java语言规定,子类重写父类方法时不能抛出比父类方法类型更多,范围更大的异常
2,final关键词
修饰数据:编译时常量,对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变,如果是形参,则在函数中不能改变这个参数,对于对象变量,很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。
修饰方法:类中所有private 方法被隐式的声明为final的不能修改,所以final无法覆盖,即不能被重载,注意这点在继承时,被声明为private 的方法并不能被继承到子类中修饰类:不能被继承
在任何内部类中访问的局部变量都应该使用final修饰,因为对于普通局部变量而言,它的作用域停留在该方法内,当方法执行结束,该局部变量也消失,但内部类可能产生隐式的“闭包”,将使得局部变量脱离它所在的方法继续存在,如:
public class Test { public static void main(String[] args) { final int a = 1; new Thread(new Runnable() { public void run() { for (int i = 0; i < 100; i++) System.out.println(a); } }); }//------1 }正常情况下,程序执行完1处的代码后,main方法生命周期结束,a的作用域也就结束了,但新线程没执行完,匿名内部类实例的生命周期就没有结束,将一直访问a。
3,java程序允许某个方法通过retrun this;返回调用该方法的java对象,但不允许直接return super;甚至不允许直接将super当成一个引用变量使用
4.当程序需要使用内部类时,就尽量使用静态内部类,而不是非静态的。当使用静态内部类时,外部类相当于静态内部类的一个包,因此使用起来比较方便,但另一方面,静态内部类不能访问外部类的非静态成员。Outer.Inner in=new Outer.Inner();普通内部类对象隐式地保存了一个引用,指向创建它的外围类对象,不能有static数据和static字段,可以有static final。
5.java中有一些native方法,对于这些方法,java程序不会为该方法提供实现体,虽然java语言本身是跨平台的,但这些方法依赖于具体的平台,尤其是jdk提供的方法,包含了大量的native方法
6.数组 初始化方式两种:静态初始化数组,动态初始化数组
int[] a={5,4,3}; int[] b=new int[]{4,5,3};//不能指定数组大小 int[] c=new int[5];