【java】子类继承父类程序各成员的执行顺序详解
java的面向对象包括封装、继承、多态3个主要要点,那么子类继承父类后程序中各成员的执行顺序是怎样的呢?下面教大家怎么自己测试子类继承父类程序各成员的执行顺序。
1、首先定义2个类Person和Student,代码如图所示。
①Person.java
Person{ String name; int age; { System.out.println("父类的非静态代码块"); } static{ System.out.println("父类的静态代码块"); } Person(){ System.out.println("父类的无参构造函数"); } Person(String name,int age){ this.name=name; this.age=age; System.out.println("父类的有参数构造函数"); } void eat(){ System.out.println("父类吃饭"); } public static void main(String args[]){ System.out.println("父类主方法"); Person p=new Person("张三",18); p.eat(); } }②Student.java
Student extends Person{ int grade; { System.out.println("子类的非静态代码块"); } static{ System.out.println("子类的static"); } Student(){ //super();//运行子类的要先运行父类无参构造函数,此处省略默认执行父类无参构造函数 System.out.println("子类的无参构造函数"); } Student(String name,int age,int grade){ //super(name,age);//运行子类的有参构造函数要先运行父类的有参构造函数,若父类无有参的,则运行父类无参的构造函数 this.grade=grade; System.out.println("子类的有参数构造函数:"+name+":"+age+":"+grade); } void eat(){ System.out.println("子类吃饭"); } public static void main(String args[]){ System.out.println("子类主方法"); Student s1=new Student(); Student s2=new Student("张三",19,10001); s1.eat(); s2.eat(); } }2、因为目的是要解决子类继承父类后程序的执行顺序,所以只运行Student.java就可以了,如果运行Person.java就相当于没有了继承关系也失去了意义。
3、由第二步可以看出静态代码块是程序首先执行的,而且先执行父类再执行子类的,并且有几个对象只执行一次静态代码块。
其次是从程序主方法开始执行,再执行非静态代码块和无参构造函数,而且仍然是先执行父类再执行子类的。
如果子类含有有参的构造函数,那么执行子类的有参构造函数,就不执行子类的无参构造函数了,但同样要执行父类的无参构造函数。
看到这里你会发现,非静态代码块和静态代码块的区别在于非静态代码块和构造函数一样,需要创建一次对象就执行一次的。
随后执行子类的成员函数,如果子类的成员函数重写了父类的成员函数,则只执行子类的不执行父类的。
最后是主函数,因为主函数一个程序只有一个,所以只执行一次本程序的主函数。
4、综上所述,java中子类继承父类程序各成员的执行顺序应该是:
父类的静态代码块—>子类的静态代码块—>主方法(执行哪个程序就执行哪个程序的主方法)—>父类的非静态代码块—>父类的无参构造函数—>子类的非静态代码块—>子类的无参构造函数(若实际子类执行的是有参构造函数,则不执行无参构造函数)—>成员函数(指定执行哪个就执行哪个成员函数,若重写了父类成员函数,则只执行子类的成员函数)
注意事项:
学习面向对象思想要结合实际考虑,初学者可能不容易理解,但做实际例子多的多了,自然而然就有了自己的思想,从而达到面向对象的要求。
想成为一个厉害的程序员,多敲代码吧!