Java只支持单继承,不支持多继承,但是支持同时实现多个接口
子类不能继承父类的构造函数,但是:
在子类的构造函数中,必须调用父类的构造函数,且必须放在子类构造函数的第一行;【this和super不能同时使用】
省略时,默认调用无参构造。
Java的类中包括:静态代码块、非静态代码块(也叫构造代码块)、静态成员变量、非静态成员变量、构造函数、成员函数(不区分静态/非静态)
1)没有继承父类的情况下,实例化对象时的执行顺序是:
静态代码块/静态成员>非静态代码块/非静态成员变量>构造函数>成员函数
其中:同一级别的部分按出现位置从前往后执行
2)继承父类的情况下,子类实例化对象时的执行顺序时:
父类的静态代码块/静态成员>子类的静态代码块/静态成员>父类的非静态代码块/非静态成员变量>父类的构造函数>子类的非静态代码块/非静态成员变量>子类的构造函数
其中:同一级别的部分按出现位置从前往后执行
示例:
class m_0019_s extends m_0019_f{
static{
System.out.println("子类静态代码块2");
}
static{
System.out.println("子类静态代码块1");
}
{
System.out.println("子类非静态代码块1");
}
public m_0019_s(){
System.out.println("子类构造方法1");
}
{
System.out.println("子类非静态代码块2");
}
}
class m_0019_f {
static{
System.out.println("父类静态代码块2");
}
static{
System.out.println("父类静态代码块1");
}
{
System.out.println("父类非静态代码块1");
}
int i;
static int j=2;
public m_0019_f(){
System.out.println("父类构造方法");
}
{
System.out.println("父类非静态代码块2");
}
}
public class m_0019{
public static void main(String [] args) {
m_0019_s m = new m_0019_s();
}
}
运行结果:
父类静态代码块2
父类静态代码块1
子类静态代码块2
子类静态代码块1
父类非静态代码块1
父类非静态代码块2
父类构造方法
子类非静态代码块1
子类非静态代码块2
子类构造方法1
扩展:子类实例化过程进阶
/**
* 函数执行顺序测试
*/
public class m_0015 {
public static void main(String [] args){
System.out.println(new B().getValue());
}
}
class A{
protected int value;
public A(int v) {
setValue(v);
}
public void setValue(int value){
this.value = value;//this指本类
}
public int getValue(){
try{
value++;
return value;
} catch(Exception e){
System.out.println(e.toString());
} finally {
this.setValue(value);//this指当前对象
System.out.println(value);
}
return value;
}
}
class B extends A{
public B() {
super(5);
setValue(getValue() - 3);
}
public void setValue(int value){
super.setValue(2 * value);
}
}
/**
* 子类继承父类,调用方法时先是调用子类中的方法,如果没有就调用父类中的方法
* try{ }、catch{ }、finally{ }返回值的问题,一旦try{ }中返回了某一个值,如果finally有返回值,finally中的返回值会覆盖try的返回值,如果finally没有返回值,就是try中的返回值。
*/
运行结果:
22
34
17