java类的继承就是一个类(子类)可以使用extends继承另一个类(父类)。在继承中,除了父类的构造器以外,子类几乎可以继承父类所有的功能和属性。java类的继承只可以单继承,也就是说一个子类只能有一个父类,而多继承是出现在C++中的,但是在java类的继承中可以间接的继承,也就是说多层继承(A类继承B类,B类继承C类)
基本语法:
class类名extends父类名
{
}
当子类继承了某个类之后,便可以使用父类中的成员变量和成员方法,但是并不是完全继承父类的所有成员变量和成员方法。具体的原则如下:
1)能够继承父类的public和protected成员变量和成成员方法;不能够继承父类的private成员变量和成员方法;
2)对于父类的包访问权限成员变量和成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
3)对于子类可以继承的父类成员变量和成员方法,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量和成员方法会屏蔽掉父类的同名成员变量和成员方法。如果要在子类中访问父类中同名成员变量和成员方法,需要使用super关键字来进行引用。
和this一样,super也不能出现static方法中。 继承的时候不继承父类的构造器,如果在子类中一定要用的话,也可以通过super来调用。而即使不显示的调用父类构造器,系统也会默认在子类构造器执行体的第一行调用父类构造器一次,只不过是调用父类的无参构造器。 super调用和this调用不会同时出现。
子类构造器调用父类构造器有几种情况:
1)super显示调用,系统会根据super里的实参列表选择调用父类的哪个构造器。
2)子类构造器执行体的第一行用了this调用本类重载的构造器,那么在执行调用的构造器的第一行会调用父类的构造器。
3)子类中既没有this调用也没有super调用,系统会默认在子类构造器执行体的第一行调用父类的无参构造器。 创建任何对象总是从该类继承树的最顶层构造开始执行,然后依次向下,最后才是本类。
要记住的是父类的构造器调用以及初始化过程一定在子类的前面,看下面的这个例子:
public class Test {
public static void main(String[] args)
{
new Master();
}
}
public class Register {
public Register(String name)
{
System.out.println(name+" will register?");
}
}
public class Student{
private Register register=new Register("student");
public Student()
{
System.out.println("Student will register!");
}
}
public class Master extends Student {
private Register register = new Register("master");
public Master()
{
System.out.println("Master will register!");
}
}
运行结果:
student will register?
Student will register!
master will register?
Master will register!
父类的构造器调用以及初始化过程一定在子类的前面,Master类的父类是Student类,所以先初始化Student类,再执行Student类的构造器,然后再初始化子类Master类,再执行Master类的构造器。