java接口和抽象父类的区别(Java中的父子类的执行顺序到底是怎么一回事)
java接口和抽象父类的区别(Java中的父子类的执行顺序到底是怎么一回事)class A static class B static class A I'm A class class B I'm B class Dclass A static I'm A class class A class B static I'm B class class B C运行下面代码,输出的结果是()class A { public A() {//构造函数 System.out.println("class A"); } { //代码块 System.out.println("I'm A class"); } static { //静态代码块 System.out.println("class A static"); } } public class B extends A { public B() {//构造函数 System.out
————下课后————
结论
类的加载顺序。
- (1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
- (2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 )
- (3) 父类非静态代码块( 包括非静态初始化块,非静态属性 )
- (4) 父类构造函数
- (5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 )
- (6) 子类构造函数
例子1
运行下面代码,输出的结果是()
class A { public A() {//构造函数 System.out.println("class A"); } { //代码块 System.out.println("I'm A class"); } static { //静态代码块 System.out.println("class A static"); } } public class B extends A { public B() {//构造函数 System.out.println("class B"); } { //代码块 System.out.println("I'm B class"); } static { System.out.println("class B static"); } //静态代码块 public static void main(String[] args) { new B(); } }
A
class A static class B static I'm A class class A I'm B class class B
B
class A static I'm A class class A class B static I'm B class class B
C
class A static class B static class A I'm A class class B I'm B class
D
class A static class A I'm A class class B static class B I'm B class
例子2
class Print{ Print(){ System.out.println("haha"); } } public class Cats { static { System.out.println("static Casts"); } static Print test1 = new Print(); } class qiaoGeli extends Cats{ public static void main(String [] args) { qiaoGeli t1 = new qiaoGeli(); } }
以上程序输出:
static Casts haha
换一下静态变量和静态代码块的执行顺序。
class Print{ Print(){ System.out.println("haha"); } } public class Cats { static Print test1 = new Print(); static { System.out.println("static Casts"); } } class qiaoGeli extends Cats{ public static void main(String [] args) { qiaoGeli t1 = new qiaoGeli(); } } 以上程序输出: haha static Casts
例子3
class Print{ Print(){ System.out.println("haha"); } } public class Cats { Print test = new Print(); Cats(){ System.out.println("I'm qiaoGeLi"); } { System.out.println("I'm xiaoMeng"); } public static void main(String [] args) { Cats cat = new Cats(); } }
以上程序输出:
haha I'm xiaoMeng I'm qiaoGeLi
例子4
class Print{ Print(){ System.out.println("haha"); } } public class Cats { Cats(){ System.out.println("I'm qiaoGeLi"); } { System.out.println("I'm xiaoMeng"); } Print test = new Print(); public static void main(String [] args) { Cats cat = new Cats(); } }
以上程序输出:
I'm xiaoMeng haha I'm qiaoGeLi
结论
类的执行顺序。
- (1)父类静态变量和静态代码块(先声明的先执行);
- (2)子类静态变量和静态代码块(先声明的先执行);
- (3)父类的非静态属性(变量)和非静态代码块(先声明的先执行);
- (4)父类构造函数
- (5)子类的非静态属性(变量)和非静态代码块(先声明的先执行);
- (6) 子类构造函数
小萌:乔哥辛苦了,给你按摩!
这篇文章和小编写的一篇原创文章很类似,比这篇文章多了一些内容
让你清清楚楚理解Java中成员变量,代码块,构造函数的加载顺序
作者:乔戈里qgl 原文:转载自公众号,程序员乔戈里,已获作者授权