1、变量常量声明与系统默认赋值总结
· 对基本数据类型来说,对于类变量(static)和全局变量,如果不显式地对其赋值而直接使用,则系统会为其赋予默认的零值,而对于局部变量来说,在使用前必须显式地为其赋值,否则编译时不通过。
· 对于同时被static和final修饰的常量,必须在声明的时候就为其显式地赋值,否则编译时不通过;而只被final修饰的常量则既可以在声明时显式地为其赋值,也可以在类初始化时显式地为其赋值,总之,在使用前必须为其显式地赋值,系统不会为其赋予默认零值。
· 对于引用数据类型reference来说,如数组引用、对象引用等,如果没有对其进行显式地赋值而直接使用,系统都会为其赋予默认的零值,即null。
·如果在数组初始化时没有对数组中的各元素赋值,那么其中的元素将根据对应的数据类型而被赋予默认的零值。
总结:被static和final同时修饰的常量必须在声明时显式赋值,被final修饰的常量必须显示赋值。类变量和全局变量、引用数据类型、数组,不显式赋值系统默认赋值。
2、静态块main方法构造块
静态域中包含静态变量、静态块和静态方法,其中需要初始化的是静态变量和静态块.而他们两个的初始化顺序是靠他们俩的位置决定的。
静态块:用static修饰的代码块,JVM加载类时执行,仅执行一次
构造块:类中直接用大括号{}定义的代码块,每一次创建对象时执行,且同时具有构造块和构造函数时,构造块先于构造函数运行
上面两种特性在定义一个类时static修饰定义的属性和非static修饰定义的属性中也适用
执行顺序优先级:静态块>main()>构造块>构造方法
本题中,先加载类执行有 static 修饰的两句
public static B t1 = newB();静态变量
public static B t2 = newB();静态变量
运行两次构造块,输出构造块
接着运行静态块,输出静态块,
最后运行main()方法再输出一次构造块
3、类加载机制
4、对于接口这个类,接口只能用public、abstract或者无修饰符(系统会自动加上public与抽象类相同)
接口中的成员包括:全局变量和抽象方法。接口成员都有固定的修饰符:
接口中变量默认是 public static final
方法默认是public abstract
5、StringBuffer是线程安全的,很多方法被synchronized修饰,StringBuilder是非线程安全的
效率 String<StringBuffer<StringBulider
6servlet的生命周期
7.抽象类和接口的区别
类中只要含有一个抽象方法,该类就是抽象类;抽象类中可以包含一个或者多个抽象方法,也可以不含有抽象方法,直接在类声明的时候加上abstract.该类就是抽象类。
大括号里的是方法体,如果没有{},就没有方法体,有{}里面没有内容说明方法体为空,但是有方法体。一个抽象类可以有构造方法,接口没有构造方法,抽象类中的方法不一定是抽象方法,即其中的方法可以有实现(方法体),接口中的方法都是抽象方法,不能有方法体,只有声明,接口中的方法是有声明,没有实现,类似于抽象方法,但是不含有Abstract。
接口中的方法声明 public void sub();
抽象类中的方法声明 public abstract void sub(){}或者public void sub();
一个抽象类的访问修饰符可以是 public private protected default ,接口只能是public ,如果接口不被public修饰,则只有包访问权限。
一个抽象类中的方法可以是public private protected default ,接口中的方法只能是public和default不含有abstract修饰符,默认方式是public.
接口中默认变量是final和static,意思是只有常量。必须声明时进行初始化。
一个子类只能继承一个抽象类,但是能实现多个接口。