继承
面向对象的计算机编程语言的三大特点:
继承,封装,多态
继承:即子类继承父类的除构造方法外的一切,可增加代码的复用率。
实现语法为:
class 子类 **extend** 父类{
//子类方法
}
继承的注意及特点:
-
使用 extends 指定父类.
-
Java 中一个子类只能继承一个父类,Java为单继承或多级继承。 (而C++/Python等语言支持多继承).
-
子类会继承父类的所有 public 的字段和方法.
-
对于父类的 private 的字段和方法, 子类中是无法访问的.
-
子类的实例中, 也包含着父类的实例. 可以使用 super 关键字得到父类实例的引用.
Super.成员方法 ——>调用父类成员方法
Super.成员属性 ——>调用父类成原属性
Super(参数) ——>调用父类的构造方法(必须放到第一行) -
被fianl修饰的密封类不能被继承。
-
Java中对于字段及方法的四种访问权限:(访问权限从上至下一次减小)
public:类内部以及内外部都能进行访问
protected:类内部及不同包中的子类与其同一包中的类可以访问,其他类不能访问
default(包访问权限,一般默认为其):类内部及同一包中的类可以访问,其他类不能访问
private:只有类内部可以访问,其他类不能访问 -
Java中当实例化子类对象时,静态代码块只能初始化一次。
1.即如果父类及当前类的静态代码块未加载过时,那么执行顺序是:
父类静态初始化块——>子类静态初始化块——>父类非静态初始化块——>父类构造方法——>子类非静态初始化块——>子类构造方法
2.如果父类及当前类的静态代码块已经被加载过,则执行顺序为:
父类非静态初始化块——>父类构造方法——>子类非静态初始化块——>子类构造方法(静态代码块将不会被加载)
public class Parent {
static {
System.out.println("父类静态初始化块");
}
{
System.out.println("父类非静态初始化块");
}
public Parent() {
System.out.println("父类构造方法");
}
//方法与类名同名
public int Parent() {
return 0;
}
public static void main(String... args) {
//第一次创建时类还没有被加载,会执行静态初始化块
Child c = new Child();
System.out.println();
//第二次创建时类已经被加载,只执行非静态初始化块与构造方法
Child d = new Child();
}
}
class Child extends Parent {
public Child() {
System.out.println("子类构造方法");
}
static {
System.out.println("子类静态初始化块");
}
{
System.out.println("子类非静态初始化块");
}
}
运行结果:
父类静态初始化块
子类静态初始化块
父类非静态初始化块
父类构造方法
子类非静态初始化块
子类构造方法
父类非静态初始化块
父类构造方法
子类非静态初始化块
子类构造方法