类和接口在初始化化时,处理继承层级的方法不一样。

类继承的初始化:通过引用 static 字段,触发某个类的初始化,则声明该字段的类,以及该类的父类被初始化。

接口继承的初始化:通过引用 static 字段,触发某个接口的初始化,则声明该字段的接口会被初始化,但该接口的父接口不会被初始化。

想了解其他触发类初始化的方法,可参看另一篇博文 类的初始化步骤 。

注意一点,接口字段全部隐式地被修饰为 public, static, final 。因此,所有的接口字段实际上都是 static 的,无论有没有显示地声明 static 。这点和接口无法被实例化规定是相吻合的。

类继承的初始化例子

Super, 父类。

C, 继承 Super 类。

Sub, 继承 C 类。

InitDemo, 演示类继承的初始化。

package execution.initializationExtends;
public class Super {
static String superName = "superName";
static{
System.out.println(" initializing Super ");
}
}
package execution.initializationExtends;
public class C extends Super{ static String cName = "cName";
static {
System.out.println(" initializing C ");
}
}
package execution.initializationExtends;
public class Sub extends C{ static{
System.out.println(" initializing Sub ");
}
}

InitDemo 演示类继承的初始化,通过引用类的变量,触发类被初始化。需要注意的是,在这里 cName 字段的声明类是 C 类,不是 Sub 类。

package execution.initializationExtends;
public class InitDemo {
public static void main(){
System.out.println(Sub.cName);
}
}

输出

 initializing Super
initializing C
cName

根据初始化可见,只有 static 字段的声明类 C ,以及其父类 Super 被初始化了,输出代码中 Sub 类没有被初始化。

接口继承的初始化例子

Output,用于输出接口初始化的情况。由于接口内不能直接带静态代码块,所有通过 Output 类输出接口的初始化情况。

SuperI, 接口父类;

I, 继承 SuperI 接口;

SubI, 继承 I 接口。

InitIDemo,演示接口继承的初始化。

package execution.initializationExtendsI;
public class Output { public static String printWhenInit(String s){
System.out.println(s);
return s.substring(s.indexOf(" "));
}
}
package execution.initializationExtendsI;
public interface SuperI {
public static String superField = Output.printWhenInit(" initializing SuperI.superField ");
}
package execution.initializationExtendsI;
public interface I extends SuperI{
public static String iField = Output.printWhenInit("initializing I.iField ");
}
package execution.initializationExtendsI;
public interface SubI extends I {
public static String subField = Output.printWhenInit(" initializing SubI.subField ");
}

和前面的类继承初始化例子相似,iField 字段的声明接口不是 SubI, 而是 I 。

package execution.initializationExtendsI;
public class InitIDemo {
public static void main(){
System.out.println(SubI.iField);
}
}

输出

initializing I.iField
I.iField

由输出可见,只有 iField 字段的声明接口 I 被初始化了。输出代码的 SubI 、父接口 SuperI 都没有被初始化。

参考资料

9.3 Field (Constant) Declarations, The Java Language Specification, Java SE 8 Edition

12.4.1 When Initialization Occurs, The Java Language Specification, Java SE 8 Edition

[Java] 类和接口的初始化步骤 - 继承方面的更多相关文章

  1. Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序

    先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...

  2. 第9章 Java类的三大特性之一:继承

    1.什么是继承 子类继承父类就是对父类的扩展,继承时会自动拥有父类所拥有的处private之外的所有成员作用:增加代码复用语法格式: class 子类名 extends 父类名{…………}第9章 Ja ...

  3. 【基础】java类的各种成员初始化顺序

    父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺序 前言: 普通代码块:在方法或语句中出现的{}就称为普通代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出 ...

  4. 要创建一个EJB,必须要至少编写哪些Java类和接口?

    要创建一个EJB,必须要至少编写哪些Java类和接口? A. 定义远程(或业务)接口 B. 定义本地接口 C. 定义Bean接口 D. 编写Bean的实现 解答:ABC

  5. AJPFX总结Java 类与对象的初始化

    面试的时候,经常会遇到这样的笔试题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和静态块,它们只包含一些简单的输出字符串到控制台的代码,然后让我们写出正确的输出结果.这实际上是在考察 ...

  6. Java类的连接与初始化 (及2013阿里初始化笔试题解析)

    Java虚拟机通过装载.连接.初始化来使得一个Java类型可以被Java程序所使用,如下图所示,其中连接过程又分为验证.准备.解析三个部分.其中部分类的解析过程可以推迟到程序真正使用其某个符号引用时再 ...

  7. 解析Java类和对象的初始化过程

    类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...

  8. java类,接口浅谈

    一般类,抽象类,接口的使用场景: 类;共同的特征和行为的抽取和封装 接口:标准,规范(功能的扩展)         需要对某个类进行功能的扩展,就让某个类实现这个接口,抽取出来称为接口   内部类: ...

  9. [转载]解析 Java 类和对象的初始化过程

    原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html 由一个单态模式引出的问题谈起 类的初始化和对象初始化 ...

随机推荐

  1. Day11 - Mysql and ORM

    python 之路,Day11 - python mysql and ORM   本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...

  2. AJAX入门学习(转)

    一.基础概念 1.全称:Asynchronous.JavaScript.And.XML(异步的 JavaScript 和 XML). 2.定义: Ajax不是一个技术,它实际上是几种技术,每种技术都有 ...

  3. 如何成为一名优秀的web前端工程师(转给自己,共勉)

    来源:王子墨的博客 程序设计之道无远弗届,御晨风而返.———— 杰佛瑞 · 詹姆士 我所遇到的前端程序员分两种: 第一种一直在问:如何学习前端? 第二种总说:前端很简单,就那么一点东西. 我从没有听到 ...

  4. CSS基本知识介绍

    CSS (Cascading Style Sheet)叠层样式表.用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言. 样式的几种控制方法: 1.行内样式         <div ...

  5. 编写利用Fragment创建新闻列表

    编写利用Fragment创建新闻列表 1.创建新闻实体类News,代码如下:   public class News { private String title; private String co ...

  6. 控制器View的加载过程

    1.控制器内部的view是延迟加载 1> 用到时再加载2> 加载完毕后会调用控制器的viewDidLoad方法 2.创建控制器的方式 1> 直接通过代码创建OneViewContro ...

  7. 关于Core Data的一些整理(一)

    关于Core Data的一些整理(一) 在Xcode7.2中只有Mast-Debug和Single View中可以勾选Use Core Data 如果勾选了Use Core Data,Xcode会自动 ...

  8. iOS面试题整理(一)

    代码规范 这是一个重点考察项,曾经在微博上发过一个风格纠错题: 也曾在面试时让人当场改过,槽点不少,能够有 10 处以上修改的就基本达到标准了(处女座的人在这方面表现都很优秀 一个区分度很大的面试题 ...

  9. C#使用Expand、Shell32解压Cab、XSN文件

    前言: 需要解压InfoPath表单的xsn文件,在项目中以前使用的是Expand命令行解压,都没有出过问题,近段时间项目中突然报错解压失败,通过分析解压操作得出结论: 1.正常正常情况下,expan ...

  10. dbm数据库

    所有版本的linux以及大多数的UNIX版本都随系统带有一个基本的.但却非常搞笑的数据存储历程集,他被称为dbm数据库.适用于存储比较静态的索引化数据库,即使用索引来存储可变长的数据结构,然后通过索引 ...