子类主动使用却没有被初始化

问题描述

class NewParent { static int hoursOfSleep = (int) (Math.random() * 3.0); static { System.out.println("NewParent was initialized."); }}class NewbornBaby extends NewParent { static int hoursOfCrying = 6 + (int) (Math.random() * 2.0); static { System.out.println("NewbornBaby was initialized."); }}class Example2 { public static void main(String[] args) { int hours = NewbornBaby.hoursOfSleep; System.out.println(hours); static { System.out.println("Example2 was initialized."); }}NewbornBaby调用从NewParent继承来的hoursOfSleep,说明NewbornBaby类已经主动使用,但是为什么NewbornBaby类没有被初始化

解决方案

请把《深入java虚拟机》第二版翻到162页:代码上面的那段,有这样说:使用一个非常量的静态字段只有当类或者接口的却声明了这个字段时才是主动使用
解决方案二:
首先,因为 hoursOfSleep 是父类的,子类从父类中继承了该字段(这个你是明白的),而之所以NewbornBaby.hoursOfSleep; 它没有让子类初始化,是因为它相当于NewParent.hoursOfSleep; 所以,父类被初始化了,而子类并没有被初始化
解决方案三:
hoursOfSleep是非常量静态字段,它继承自NewParent,并不是NewbornBaby类声明的,所以不符合主动使用的要求
解决方案四:
hoursOfSleep是非常量静态字段,它继承自hoursOfSleep,并不是NewbornBaby类声明的,所以不符合主动使用的要求
解决方案五:
只有六种活动被认为是主动使用:1、创建类的新实例2、调用类中声明的静态方法3、操作类或者接口中声明的非常量静态字段4、调用JAVA API中特定的反射方法5、初始化一个类的子类6、指定一个类作为虚拟机启动时初始化的类
解决方案六:
static声明的变量是类变量,与对象的加载初始化没太大关系,你可以直接这么调用,而这个类变量其实是父类的,不是自己的。
解决方案七:
引用NewbornBaby调用从NewParent继承来的hoursOfSleep,说明NewbornBaby类已经主动使用,但是为什么NewbornBaby类没有被初始化 类变量是不能继承的,实际上是访问父类的类变量,只会导致父类初始化。

时间: 2024-07-30 15:02:53

子类主动使用却没有被初始化的相关文章

java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题

/* 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中, 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行 */ import static java.lang.System.out; public class PersonDemo { public static void main(String[] args) { //*********测试父类与子类之间的循环调用的问题 out.println("main1&quo

Python中子类怎样调用父类方法

python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函数,就覆盖了父类的这个函数,既然继承父类,就要在这个函数里显式调用一下父类的__init__(),这跟C++,jAVA不一样,他们是自动调用父类初始化函数的. 调用父类函数有以下方法: class A: def method(self, arg): pass class B(A): def method(self, arg): # A.me

java中的显示初始化和特定初始化

public class Test{    public static void main(String[] args){        Child child = new Child();    } }   class Parent{     public Parent(){        super();        show();//this.show(); 因为是Child类对象调用了super()来构造其父类的部分;所以父类中的this(随着其构造方法入栈的)是指向Child类对象的

iOS开发中的手势体系——UIGestureRecognizer分析及其子类的使用

iOS开发中的手势体系--UIGestureRecognizer分析及其子类的使用 一.引言         在iOS系统中,手势是进行用户交互的重要方式,通过UIGestureRecognizer类,我们可以轻松的创建出各种手势应用于app中.关于UIGestureRecognizer类,是对iOS中的事件传递机制面向应用的封装,将手势消息的传递抽象为了对象.有关消息传递的一些讨论,在前面的博客中有提到: iOS事件响应控制:http://my.oschina.net/u/2340880/bl

浅谈Java变量的初始化顺序详解_java

规则1(无继承情况下):对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器证明代码: 复制代码 代码如下: public class InitialOrderTest {    // 静态变量    public static String staticField = "静态变量";    // 变量    public String field = "变量";    // 静

Java 重写方法与初始化的隐患

虽然文章标题是Java, 但几乎所有面向对象设计的语言都遵守这个初始化流程, 感谢廖祜秋liaohuqiu_秋百万指出, 之前忘记提这个了. 前言 drakeet写了个和RecyclerView相关的GenerousRecyclerView, 原文提到了写这个的目的. 因为需要知道ViewGroup的clipToPadding属性, 所以调用了ViewGroup.getClipToPadding, 但这个方法是API level 21引入的. 我看了一下代码, ViewGroup是通过调用set

Java重写方法与初始化的隐患(转)

原文出处: Shawon 虽然文章标题是Java, 但几乎所有面向对象设计的语言都遵守这个初始化流程, 感谢廖祜秋liaohuqiu_秋百万指出, 之前忘记提这个了. 前言 drakeet写了个和RecyclerView相关的GenerousRecyclerView, 原文提到了写这个的目的. 因为需要知道ViewGroup的clipToPadding属性, 所以调用了ViewGroup.getClipToPadding, 但这个方法是API level 21引入的. 我看了一下代码, View

《Python面向对象编程指南》——1.6 在每个子类中实现__init()__方法

1.6 在每个子类中实现__init()__方法 正如介绍工厂函数那样,这里我们也先看一些Card类的设计实例.我们可以考虑重构rank数值转换的代码,并把这个功能加在Card类上.这样就可以把初始化的工作分发到每个子类来完成. 这通常需要在基类中完成一些公共的初始化逻辑,子类中完成各自特殊的初始化逻辑.我们需要遵守不要重复自己(Don't Repeat Yourself,DRY)的原则来防止子类中的代码重复. 以下代码演示了如何把初始化职责分发到各自的子类中. class Card: pass

基于OEA框架的客户化设计(一) 总体设计

设计目标 支持实体类的扩展. 支持实体扩展包的动态加载. 支持界面扩展及界面扩展包的动态加载. 各版本间自定义界面元素,可以基于现有的特定版本修改一些内容. 各版本间支持自定义内容文件,如果没有使用,则使用默认版本的内容文件.(内容文件是指:图片.帮助文档等.)     解释一下,基于OEA框架的GIX4项目是以领域实体为中心的架构.主版本中的领域实体,代表了产品功能"7.2.1"中的7和2 .7是所有版本都应该有的领域实体,2是可以进行配置以说明是否具备的领域实体,而1就是在主干之外