static 关键字:
1、 修饰成员变量:static修饰的成员成为类成员或者是静态成员,被static修饰的成员会被jvm分配在静态储存区,没有被修饰的则被分配在堆区。
2、修饰成员方法:可以直接导入类包,使用类名加方法名的是方式进行调用。相当于定义了一个全局函数。不过这样是是有局限的,一个被static修饰的类里是不能有static修饰的成员变量和方法的。(因为static修饰的方法是属于类的,如果直接去使用对象的成员变量,他会没有办法是识别应该用哪个对象的属性)
3、静态块:一般情况下,如果有些代码必须要在项目启动的时候执行的时候就需要用静态代码块,这种代码块是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下其他程序来调用的时候需要使用静态方法,静态方法这种代码时被动执行的,静态方法在类加载的时候就已经加载,可以直接用类名调用,比如mian方法就必须是静态的,这是程序入口两者的区别;静态代码块是主动执行的,静态方法是被动执行的。
4、静态导包:静态导包是通过import static导入某个类的方法,直接通过方法名就可以直接调用了。
transient关键字:
一个对象只要实现Serializable接口(将对象序列化的一个接口),这个类的属性和方法就会被自动序列化。当有些时候有些方法和属性不需要序列化,就用trabsient修饰方法和属性,这样被修饰过的方法和属性就不会被序列化。
final关键字:他的用法有很多,最长用的是有四种;
1、用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次并且他的值无法被改变。对于成员变量来讲我们必须在声明时或者构造方法中使用。
2、用来修饰方法参数,表示在变量的生存期中该变量不能被改变。
3、修饰方法,表示该方法不能被重写。
4、修饰类,表示该类无法被继承。
以上四种方法中第三种和第四种方法需要谨慎使用,因为大多数情况下,如果仅仅是为了一点设计上的考虑,我们并不需要用final来修饰类和方法。
foreach循环原理:
1、arrayList之所以能用foreach循环遍历,是因为arrayList所有的List都是Collection的子接口,而Collection是Iterable的子接口,ArrayList的父类AbstractList正确的实现了iterable接口的iterator方法;
2、任何一个集合,无论是jdk提供的还是自己写的想要使用foreach循环就必须正确的实现Iterable接口(这时候做法就是设计模式中的迭代模式)
3、对于数组就是转化为数组中的每一个元素的循环引用。
Switch
基本语法:
switch (表达式){
case 目标值1:
执行语句1
break;
case 目标值2:
执行语句2
break;
......
case 目标值n:
执行语句n
break;
default:
执行语句n+1
break;
}
底层的是switch只能处理4个类型的值;其他三种类型需要通过其他的方式连接处理,就是转成基本数据类型处理;
编译器对包装类的处理是通过拆箱和装箱;
对枚举类型的处理是通过枚举常量的序号及一个数组;
对字符串string的处理是通过string的hash值;
java的反射机制:
概念:在运行状态中对任意一个类都能够知道这个类的属性和方法、对于任意一个对象,都能够调用他的任何方法和属性,这种动态获取信息以及动态调用对象的方法功能称之为java反射机制。
原理:
1、将java文件保存到本地硬盘
2、编译java文件,生成.class文件
3、使用java虚拟机(JVM)将字节码文件加载到内存
4、字节码文件在内存中使用.class类表示
5、使用反射的时候首先获取到Class类,就可以得到class文件里的所有内容,包括属性、构造方法、普通方法
6、属性通过Filed类表示
7、构造方法通过Constructor表示
8、普通方法通过Method
Exception和Error区别
Exception是程序错误,可控或不可控,可以在程序中捕获异常
error是系统异常,不可控,可能的话可在系统中捕获异常
java.util.Date和java.sql.Date的区别及应用
java.util.Date就是在处理sql语句情况下使用
java.util.Date是针对sql语句使用的,他只包含日期而没有时间部分,他都有gettime方法返回毫秒数,自然就可以直接构建
java.util.Date是java.sql.Date的父类
java.util.Date d = new java.util.Date(sqlDate.getTime());
java.util.Date d=new java.util.Date (date.getTime());