(1)初始化块
和构造方法具有相同功能的是初始化块。当创建Java对象时,系统总是先调用类中定义的初始化块
(2)静态初始化块 如果定义初始化块使用了static修饰,则这个初始化块就变成了静态初始化块,也被称为类初始化块。静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行,因此静态初始化块比普通初始化块先执行。 注意:静态初始化块也被称为类初始化块,同样静态成员不能访问非静态成员,因此静态初始化块不能访问实例变量和实例方法。 静态代码块和初始化块的顺序: 父类静态块 ->子类静态块->父类初始化块和构造器->子类初始化块和构造器
public class Base { //先执行 创建子类对象时的代码 先调用父类初始化块和构造方法,然后执行子类的初始化块和构造方法 static Sub sub = new Sub(); //然后再按照静态代码块和初始化块的顺序的顺序执行 static{ System.out.println("Base静态初始化块!"); } { System.out.println("Base初始化块!"); } public Base() { System.out.println("Base构造方法!"); } }
public class Sub extends Base{
static{System.out.println("Sub静态初始化块!"); } {System.out.println("Sub初始化块!"); } public Sub() {System.out.println("Sub构造方法!"); }
}
运行结果:
Base初始化块! Base构造方法! Sub初始化块! Sub构造方法! Base静态初始化块! Sub静态初始化块! Base初始化块! Base构造方法! Sub初始化块! Sub构造方法! (3)final关键字 1.final修饰的类不能被继承 2.final修饰的变量初始化后不能被重新赋值。final修饰的实例变量可以直接初始化,也可以在初始化块和构造器中初始化。static修饰的常量只能在定义时静态块中初始化 3.final修饰的方法不能被重写(但是可以被重载) /**
-
父类
-
@author Ray * */ public class Base { String name; int age;
public final void test() { } //final修饰的方法可以被重载 public final void test(int i) { }
}
/**
-
子类
-
@author Ray * */ public class Sub extends Base{ // 子类不能重写父类中用final修饰的方法 // public void test() { // // }
} (4)抽象类和接口
父类一般描述了子类共有的,通用的行为或者属性,但是有些情况下,父类定义的方法体不具备通用性,或者该行为一定会被子类重写,那么此时定义方法体就显得多余,Java中提供了抽象方法,抽象方法只有方法头,没有方法体,也就是说抽象方法只规定子类的行为,而不提供实现。
(5)抽象类
使用abstract修饰的类就是抽象类,普通类中包含的内容,在抽象类中都可以包含(成员变量,成员方法,构造器,内部类),此外抽象类中还可以声明抽象方法。抽象类可以理解为是对普通父类的抽象。如果某个普通类继承了抽象类,那么就必须要重写抽象方法,否则这个普通类也必须是抽象类。
(6)抽象方法
使用abstract修饰的方法,叫做抽象方法,抽象方法只有方法头,没有方法体。定义抽象方法本来就是用来继承的,抽象方法不能用static、final、private修饰。
(7)接口 接口可以理解为对抽象类的抽象,因为抽象类中不但有抽象方法,还有实例方法及类方法等等,而接口中的内容则更加简洁。一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。 接口中只能包含:常量,抽象方法,默认方法,私有方法,类方法,不能包含构造器,初始化块,静态初始化块。
声明:
public interface Test { //常量 //抽象方法方法
//Java8新增了默认方法(可以有方法体) default void interfaceTest() {System.out.print("123"); } //Java8新增了类方法 static void interfaceTest2() { } //Java9新增了私有方法(可以有方法体) @SuppressWarnings("unused") private void interfaceTest3() {System.out.print("123"); }
}
(8)接口和抽象类的区别
1、接口和抽象类都不能被实例化 2、接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。 3、接口里只能包含抽象方法、静态方法、默认方法和私有方法,抽象类则完全可以包含实例方法。 4、接口里只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态常量。 5、接口里不包含构造器; 抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象。 6、接口里不能包含初始化块; 但抽象类则完全可以包含初始化块。 7、一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口