Java的动态代理
- 静态代理:针对每个被代理的对象,写一个代理类
- 动态代理:可=可以根据接口动态的生成代理类,这动态生成的类不需要自己书写,jdk帮你完成了
Ststic关键字
- static关键字的用途:方便再没有创建对象的时候调用方法或变量
static方法
又称为静态方法,不需要依赖任何对象就可以访问 ,所以this在static方法中是不适用的,因为staic不依附任何对象,既然没有对象就谈不上this。
由于这个特性,在静态方法中,不能访问非静态成员方法,也不能访问非静态成员变量,因为非静态的成员方法或者变量都是必须依赖具体的对象才能被调用。
注意:在非静态成员方法中可以调用静态成员方法和变量的。
class MyObject{
private static String str1 = "111";
private String str2 = "222";
public MyObject(){
}
public void print1(){
System.out.println(str1);
System.out.println(str1);
print1();
}
public static void print2(){
System.out.println(str1);
System.out.println(str1);(错误)
print2();(错误)
}
}
在上面的代码中,由于print2方法是独立于对象存在的,可以直接用过类名调用。假如说可以在静态方法中访问非静态方法/变量的话,那么如果在main方法中有下面一条语句:MyObject.print2();
此时对象都没有,str2根本就不存在,所以就会产生矛盾了。同样对于方法也是一样,由于你无法预知在print1方法中是否访问了非静态成员变量,所以也禁止在静态成员方法中访问非静态成员方法。
而对于非静态成员方法,它访问静态成员方法/变量显然是毫无限制的。
因此,如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。我们最常见的static方法就是main方法,至于为什么main方法必须是static的,现在就很清楚了。因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
static变量
- static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。static成员变量的初始化顺序按照定义的顺序进行初始化。
static代码块
-
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
class Person{ private Date birthDate; public Person(Date birthDate) { this.birthDate = birthDate; } boolean isBornBoomer() { Date startDate = Date.valueOf("1946"); Date endDate = Date.valueOf("1964"); return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0; } }
这时每次调用isBornBoomer方法时,每次都会创建startDate和endDate两个对象,造成空间浪费
-
使用static关键字,很多时候会将一些只需要改变一次的初始化操作都放在static代码块中进行
class Person{ private Date birthDate; private static Date startDate,endDate; static { Date startDate = Date.valueOf("1946"); Date endDate = Date.valueOf("1964"); } public Person(Date birthDate) { this.birthDate = birthDate; } boolean isBornBoomer() { return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0; } }