java 中采用单继承机制,即一个子类只能有一个父类。
1.继承性
子类继承父类中的变量和方法受到访问限制修饰符的限制。当子类和父类在同一个包中时,子类可以继承父类中除了private访问权限修饰的变量和方法。当父类和子类不在同一个包中时,子类可以继承父类中的protected和public修饰的成员变量和方法。
2.内存的分配
当用子类的构造方法创建一个子类的对象时,子类和父类中的成员变量都被分配了内存。父类中的一些不被继承的变量也被分配了空间,这样感觉似乎是在浪费内存空间。但事实上子类从父类继承的一部分方法可以操作这些变量。
3.类的加载和执行顺序
记得刚刚找工作那会儿,面试就遇到过一个有关于执行顺序的问题,应该和下面的例子差不多。
class A {
A() {
System.out.println("C");
}
static {
System.out.println("A");
}
{
System.out.println("E");
}
void printLine() {
System.out.println("---------");
}
}
public class B extends A {
B() {
System.out.println("D");
}
static {
System.out.println("B");
}
{
System.out.println("F");
}
public static void main(String[] args) {
new B().printLine();
}
}
程序输出:
A
B
E
C
F
D
---------
有继承关系的类加载时,先加载父类再加载子类。类加载时执行用static修饰的静态代码块。当用 new 关键字实例化类时,先执行父类的代码块再执行父类的构造方法,之后执行子类的代码块再执行子类的构造方法完成实例化。后面就执行调用的方法了。
4.方法的重写
子类可以继承父类的方法,也可以有自己的方法。当子类的方法和父类的方法相同时,父类的方法就被覆盖了,这就是方法的重写。但实际上父类的方法并没有被处理掉,可以使用super关键字调用父类的方法。要注意的是在重新方法的时候,方法的访问权限不能降低。
5.上转型对象
以前在学校刚刚学这个的时候,感觉这个不明所以,java用多了之后发现这个实在是太重要了。在我们面向抽象编程和面向接口编程时都和这个上转型对象有很大的联系。这个需要单独拿出来记录下。