java - Subclass final static initialization prior to superclass class intialization? -
i couldn't find specific post referring specific case, i'd ask think yes/no question.
here's jls §12.4.2 (java se 8), listing 6-7:
- [...] then, initialize static fields of c constant variables (§4.12.4, §8.3.2, §9.3.1).
- next, if c class rather interface, , superclass has not yet been initialized, let sc superclass [...] each s in list [ sc, si1, ..., sin ], recursively perform entire procedure s. if necessary, verify , prepare s first. [...]
my question: mean final static variable of subclass initialized before static initialization of superclass (assuming final static initialized part of declaration)?
the answer might so. key part constant word meaning.
consider code
class foo { public static final int foo_value = 1000; static { system.err.println("foo bar.bar_value=" + bar.bar_value); } } class bar extends foo { public static final int bar_value = 2000; static { system.err.println("bar foo.foo_value=" + foo.foo_value); } } the output of program be
foo bar.bar_value=2000 bar foo.foo_value=1000 in case bar static final variables initialized before foo static initialization. both foo_value , bar_value constants javac may inline fields.
but can trick compiler pretending final variable not constant in way
class foo { public static final int foo_value = integer.valueof(1000).intvalue(); static { system.err.println("foo " + bar.bar_value); } } class bar extends foo { public static final int bar_value = integer.valueof(2000).intvalue(); static { system.err.println("bar " + foo.foo_value); } } and output be
foo bar.bar_value=0 bar foo.foo_value=1000 so foo static initializer finished before static final bar.bar_value initialized.
Comments
Post a Comment