为什么通过子类引用父类静态方法不会导致子类初始化?

2014.9.2

看下边这个程序:

class SuperClass

{

static{

System.out.println("superClass init");

}

public static int value=123;

public static void superMethod()

{

System.out.println("我是supermethod.");

}

}

class SubClass extends SuperClass

{

static{

System.out.println("subclass init;");

}

}

public class NotInitial

{

public static void main(String[] a)

{

System.out.println(SubClass.value);

SubClass.superMethod();

}

}

首先,jvm加载NotInitial类,

加载,

验证

准备

解析 ,对于SubClass.superMethod();这条语句,用的字节码指令是invokestatic,

所以要解析,先解析 类SubClass.

加载Subclass,

在SubClass中找这个方法,没有

加载SubClass的父类,SupperClass

在SuperClass中找,找到。

初始化,

调用main方法,

执行invokestatic,后边的是直接引用。

时间: 2024-11-05 16:58:46

为什么通过子类引用父类静态方法不会导致子类初始化?的相关文章

java继承-子类调用父类的方法中包含子类重写的方法

# 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了... # 先看代码: public class Common { public static void main(String[] args) { Sub sub = new Sub(); sub.testSub(); } } class Parent { protected boolean test() { throw new RuntimeException(); } protected void testParent() { if

java子类与父类的关系

摘自翁恺老师的mooc 对理解继承来说,最重要的事情是,知道哪些东西被继承了,或者说,子类从父类那里得到了什么.答案是:所有的东西,所有的父类的成员,包括变量和方法,都成为了子类的成员,除了构造方法.构造方法是父类所独有的,因为它们的名字就是类的名字,所以父类的构造方法在子类中不存在.除此之外,子类继承得到了父类所有的成员. 但是得到不等于可以随便使用.每个成员有不同的访问属性,子类继承得到了父类所有的成员,但是不同的访问属性使得子类在使用这些成员时有所不同:有些父类的成员直接成为子类的对外的界

python子类调用父类的方法

python子类调用父类的方法 python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问,但是该方法或属性在子类中并不存在,那么就会自动的去其父类中进行查找. 继承父类后,就能调用父类方法和访问父类属性,而要完成整个集成过程,子类是需要调用的构造函数的. 子类不显式调用父类的构造方法,而父类构造函数初始化了一些属性,就会出现问题 如果子类和父类都有构造函数,子类其实是重写了父类的构造函数

Python_子类调用父类的方法

1.方式一子类调用父类的方法,包含2中形式的调用.一种形式是在类内部通过继承的方式调用父类的方法,另外一种形式是子类实例化后之后通过继承的方式来调用父类的方法.如下图所示:注意一点,在子类内部通过继承的方式调用父类的属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来的含义就是指向实例自己)):而实例在通过继承调用父类的属性或方法时,则不用传self参数,因为实例已经实例化了呀!!!该部分的代码块如下:注意一点,在子类内部通过继承的方式调用父类的属

继承1.继承,2.属性查找顺序3.子类访问父类内容4.补充,经典类与新式类 --------- # 21

继承: 1.继承 1.1继承 1 '''''' 2 """ 3 1.什么是继承? 4 继承是描述两个对象之间,什么是什么的关系 5 6 案例:麦兜,佩奇,猪刚鬓 -- 都是猪 7 8 在程序中,继承描述的是类和类之间的关系 9 10 例如:a 继承 b,a就能直接使用b已经存在的方法或属性 11 此时,a称之为子类,b被称之为父类,也称为基类 12 13 2.为什么要使用继承? 14 继承的一方制剂使用另一方已经有的东西 15 其目的是:提高重用性(重用已有的代码) 16 1

向上转型,与子类会不会继承父类静态方法

================子类会不会继承父类的静态方法?不会================ 静态方法只属于类本身 子类不可以重写父类的静态方法,但是可以通过子类对象访问父类静态方法 public class Parent { public static void staticMethod(){ System.out.println("staticparent"); } public void method(){ System.out.println("parent&q

PHP 父类静态方法中调用子类静态方法

get_called_class() 获取调用该方法的类,如果是在子类中调用父类方法,则返回子类的类名. 或者用static关键字: static::class 如果有多个子类,要在父类中调用子类方法,下面代码可实现: class parent{     abstract protected static function getFunc($action);    public static function call($action){      //调用子类静态方法,唯一的方式       

为什么父类引用可以指向子类对象 子类引用不能指向父类对象 泛型

假设有父类Fu ,其子类为Zi ,从对象的内存角度,假设Fu类里面的变量占内存2M, Zi 类里的变量占内存1M: Fu f = new Fu ();//系统将分配2M内存 Zi z = new Zi ();//系统将分配3M内存(2+1) 因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.所以z可以调用父类的方法. Zi z1= z; //z1指向那3M的内存. Fu f1 = (Fu)z;//这时f1会指向那3M内存中

子类重写父类的方法应注意的问题

若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! 重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别. (但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限.) 比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们 的机会.出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的. 重写规则之二: 参