继承、final关键字

2016/10/15 Java Object-Oriented

继承

  • 好处:
    • 提高了代码的复用性
    • 提高了代码的维护性
    • 让类与类之间产生了关系,是多态的前提
  • 弊端:
    • 类的耦合性增强了
    • 打破了封装性

注意事项

  • 子类只能继承父类所有非私有的成员(成员方法和成员变量)
  • 子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法
  • 不要为了部分功能而去继承

方法重写

  • 父类中私有方法不能被重写
    • 因为父类私有方法子类根本就无法继承
  • 子类重写父类方法时,访问权限不能更低
    • 最好就一致
  • 父类静态方法,子类也必须通过静态方法进行重写
    • 其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中讲解

子类重写父类方法的时候,最好声明一模一样。

继承中构造方法的关系

子类中所有的构造方法默认都会访问父类中空参数的构造方法,因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。

  • 子类每一个构造方法的第一条语句默认都是:super();
  • 可以通过super(…);或者this(…);语句直接或简介调用父类构造方法完成父类初始化
  • this(…)或者super(…)必须出现在第一条语句上。
    • 如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句上。
class Father {
    static {
        System.out.println("静态代码块Fu");
    }

    {
        System.out.println("构造代码块Fu");
    }

    public Father() {
        System.out.println("Fu的无参构造方法");
    }

    public Father(String name) {
        System.out.println("Fu的带参构造方法");
    }
}

class Son extends Father {
    static {
        System.out.println("静态代码块Zi");
    }

    {
        System.out.println("构造代码块Zi");
    }

    public Son() {
        //super();
        System.out.println("Zi的无参构造方法");
    }

    public Son(String name) {
        //super();
        System.out.println("Zi的带参构造方法");
    }
}

class ExtendsDemo {
    public static void main(String[] args) {
        //创建对象
        Son s = new Son();
        System.out.println("------------");
        Son s2 = new Son("林青霞");
    }
}

// 静态代码块Fu
// 静态代码块Zi
// 构造代码块Fu
// Fu的无参构造方法
// 构造代码块Zi
// Zi的无参构造方法
// ------------
// 构造代码块Fu
// Fu的无参构造方法
// 构造代码块Zi
// Zi的带参构造方法

继承中的初始化过程

  • 静态代码块 > 构造代码块 > 构造方法
  • 一个类的初始化过程
    • 成员变量的初始化
      • 默认初始化
      • 显示初始化
      • 构造方法初始化
  • 子父类的初始化(分层初始化)
    • 先进行父类初始化,然后进行子类初始化。
class X {
    Y b = new Y();

    X() {
        System.out.print("X");
    }
}

class Y {
    Y() {
        System.out.print("Y");
    }
}

class Z extends X {
    Y y = new Y();

    Z() {
        //super
        System.out.print("Z");
    }

    public static void main(String[] args) {
        new Z();
    }
}
//YXYZ

final关键字

  • 修饰类,类不能被继承
  • 修饰变量,变量就变成了常量,只能被赋值一次
    • 基本类型:基本类型的值不能发生改变。
    • 引用类型:引用类型的地址值不能发生改变,但是,该对象的堆内存的值是可以改变的。
  • 修饰方法,方法不能被重写
final int y = 10;
//无法为最终变量y分配值
//y = 100;
System.out.println(y);
System.out.println("--------------");

final Student ss = new Student();
System.out.println(ss.age);
ss.age = 100;
System.out.println(ss.age);

//重新分配内存空间
//无法为最终变量ss分配值
//ss = new Student();

final修饰变量的初始化

  • 被final修饰的变量只能赋值一次。
  • 在构造方法完毕前。(非静态的常量)

以上概念总结于传智播客Java基础课程

Search

    Post Directory