静态代码块,非静态代码块和构造方法执行顺序

2016-05-27 00:59 阅读 2,814 次 评论 0 条
版权声明:本文著作权归TeachCourse所有,未经许可禁止转载,谢谢支持!
转载请注明出处:http://teachcourse.cn/1770.html

一.摘要

子类继承父类,在子类和父类中都声明了静态代码块,非静态代码块和构造方法,在入口中初始化子类对象,执行的顺序如下图:

001-static-method-construct-execute

第一步:执行父类的静态代码块,执行子类的静态代码块

第二步:执行父类的非静态代码块,执行父类的构造方法

第三步:执行子类的非静态代码块,执行子类的构造方法

  1. package cn.teachcourse.temp;  
  2.   
  3. import android.util.Log;  
  4.   
  5. /** 
  6.  * Created by TeachCourse.cn on 2016/5/22 14:04. 
  7.  */  
  8. public class DemoA {  
  9.     private static final String TAG=DemoA.class.getName();  
  10.     /** 
  11.      * 静态代码块写法 
  12.      */  
  13.     static {  
  14.         Log.d(TAG,"父类的静态代码块。。。");  
  15.     }  
  16.   
  17.     /** 
  18.      * 构造方法的写法 
  19.      */  
  20.     public DemoA(){  
  21.        Log.d(TAG,"父类的构造方法。。。");  
  22.    }  
  23.     /** 
  24.      * 父类的非静态代码块 
  25.      */  
  26.     {  
  27.        Log.d(TAG,"父类的非静态代码块。。。");  
  28.     }  
  29.     /** 
  30.      * 父类的静态方法 
  31.      */  
  32.     public static void start(){  
  33.         Log.d(TAG,"父类的静态方法。。。");  
  34.     }  
  35.     /** 
  36.      * 父类的非静态方法 
  37.      */  
  38.     public void start(String msg){  
  39.         Log.d(TAG,"父类的非静态方法。。。");  
  40.     }  
  41. }  

DemoB继承DemoA重写父类的方法,需要注意如何不覆盖父类的方法,使用关键字super

  1. package cn.teachcourse.temp;  
  2.   
  3. import android.util.Log;  
  4.   
  5. /** 
  6.  * Created by TeachCourse.cn on 2016/5/22 14:08. 
  7.  */  
  8. public class DemoB extends DemoA {  
  9.     private static final String TAG=DemoB.class.getName();  
  10.     /** 
  11.      * 静态代码块写法 
  12.      */  
  13.     static {  
  14.         Log.d(TAG,"子类的静态代码块。。。");  
  15.     }  
  16.   
  17.     /** 
  18.      * 构造方法的写法 
  19.      */  
  20.     public DemoB(){  
  21.         Log.d(TAG,"子类的构造方法。。。");  
  22.     }  
  23.     /** 
  24.      * 父类的非静态代码块 
  25.      */  
  26.     {  
  27.         Log.d(TAG,"子类的非静态代码块。。。");  
  28.     }  
  29.     /** 
  30.      * 父类的静态方法 
  31.      */  
  32.     public static void start(){  
  33.         Log.d(TAG,"子类的静态方法。。。");  
  34.     }  
  35.     /** 
  36.      * 父类的非静态方法 
  37.      */  
  38.     @Override  
  39.     public void start(String msg){  
  40.         super.start(msg);  
  41.         Log.d(TAG,"子类的非静态方法。。。");  
  42.     }  
  43. }  

二.super关键字

super关键字表示“超级的”意思,在子类重写的方法中使用,表示不隐藏父类同方法名的方法,程序在调用子类的方法时,优先执行父类同方法名的方法,同时在子类的方法体中使用super关键字,可以在方法体代码前面或方法体代码后,效果都是优先执行父类方法体,再执行子类方法体,比如下面的代码:

  1. /** 
  2.      * 父类的非静态方法 
  3.      */  
  4. public void start(String msg){  
  5.         Log.d(TAG,"父类的非静态方法。。。");  
  6.     }  
  1. /** 
  2.      * 子类的非静态方法 
  3.      */  
  4.     @Override  
  5. public void start(String msg){  
  6.         super.start(msg);  
  7.         Log.d(TAG,"子类的非静态方法。。。");  
  8.     }  

Log输出的结果是:父类的非静态方法,子类的非静态方法,然后将super.start(msg)放在Log.d()后,打印的结果一样。事实证明,在子类方法体添加super关键字,优先执行父类的同名方法体。

如果在子类的同名方法中,不使用super关键字,程序执行子类同名的方法体,不执行父类同名方法,重写父类或接口方法时,这一步可以根据实际的需要进行方法的重写。

三.单一继承原则

什么是单一继承原则?单一继承原则表示一个子类只允许有一个父类,即只可以继承一个父类的属性和方法,但是可以有多重继承。多重继承的含义,就像儿子可以继承父亲的财产,同时也可以继承爷爷的财产,还可以继承曾爷爷的财产,甚至还可以再往上继承......程序在执行的时候,优先执行最顶层的类静态方法到每一级的静态方法,然后最顶层的非静态方法到每一层的非静态方法,最后执行最顶层的构造方法到每一层的构造方法。一个原则:静态方法——>非静态方法——>构造方法

关注公众号 扫一扫二维码,加我QQ

如果文章对你有帮助,欢迎点击上方按钮关注作者

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ1589359239或公众号TeachCourse)
转载请注明出处:http://teachcourse.cn/1770.html
分类:Java基础 标签:
TreeMap方法解析 TreeMap方法解析
三步帮你快速集成友盟消息推送功能 三步帮你快速集成友盟消息推送功
生活杂谈之台式电脑如何实现无线上网-无线网卡 生活杂谈之台式电脑如何实现无线
Android单元测试 Android单元测试

发表评论

呲牙 憨笑 坏笑 偷笑 色 微笑 抓狂 睡觉 酷 流汗 鼓掌 大哭 可怜 疑问 晕 惊讶 得意 尴尬 发怒 奋斗 衰 骷髅 啤酒 吃饭 礼物 强 弱 握手 OK NO 勾引 拳头 差劲 爱你

表情