`
chongkai
  • 浏览: 1126 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

static 方法的继承和 super

阅读更多
如果一个static方法被子类覆盖(override)了,运行时会调用哪个版本呢?
第二个问题,我们有时候会用super去调用父类的实现。如果这个类又被继承了,那这个super会指向哪个类呢?

下面的程序的运行结果是什么呢?

class High {
	void doIt () {
		System.out.println("doIt in High");
	}
}

class Mid extends High {
	void doIt () {
		System.out.println("doIt in Mid");
	}
	
	void makeIt () {
		super.doIt();
	}
	
	static void mmm () {
		System.out.println("static in Mid");
	}
}

class Low extends Mid {
	void doIt () {
		System.out.println("doIt in Low");
	}
	
	static void mmm () {
		System.out.println("static in Low");
	}
}

public class Test {
	public static void main (String[] args) {
		Low obj1 = new Low();
		Mid obj2 = new Low();
		
		obj1.makeIt();
		obj2.makeIt();
		
		obj1.mmm();
		obj2.mmm();
		
	}
}


结果是这样的:

doIt in High
doIt in High
static in Low
static in Mid



1
0
分享到:
评论
2 楼 chongkai 2009-05-22  
发表的时候太匆忙了,我也来解释一下吧。

关于super,Low 的 makeIt 是从 Mid 继承来的,但 Mid 对于 makeIt 的实现是调用 super 的 doIt。测试代码中的 obj1 和 obj2 的运行时类型都是 Low,那么在执行 makeIt 的时候,都是调用 Low 的版本。虽然 Low 的 super 应该是 Mid,但是确定这个 super 不是基于“在哪个类的对象上调用方法”,而是基于“这个方法是在哪个类中定义的”,因为这个方法是在 Mid 中定义的,所以super 应该指向 Mid 的super,即 High。只有这样才能保证一致性:不管是哪一级的子类调用这个继承来的方法,最终被调用的都是 High 的 doIt 版本。

关于 static 方法,这个问题是在一次面试时遇到的,很不幸,当时答错了。^_^
1 楼 myali88 2009-05-21  
我想静态方法是编译期绑定的,实例方法才是动态绑定,这样的结果很正常。

相关推荐

    static、this、super、final的JAVA用法

    它可以用来访问当前对象的成员变量和方法,例如: public class ThisTest{ int x = 10; public void print(){ System.out.println("ThisTest.print(): x = " + this.x); } } public class ThisTest2{ public ...

    Java中static、this、super、final用法简谈

    `static`关键字用于声明类级别的成员,包括变量和方法。这意味着它们属于类本身,而不是类的实例。在Java程序启动时,静态成员在类加载时被初始化,并且所有的类实例共享这些静态成员。 - 静态方法:不需要创建类...

    Java中static、this、super、final用法.doc

    1. **static**: 静态关键字`static`用于声明类级别的变量和方法,即静态变量和静态方法。静态变量在类加载时被初始化,并且对类的所有实例都共享同一个值。这意味着,无论创建了多少个对象,静态变量只会有一份存储...

    Java中static、this、super、final用法

    super 关键字在 Java 中用于访问父类的成员变量和方法,super 关键字可以用于: 1. 访问父类的成员变量 2. 调用父类的方法 3. 在子类的构造方法中,使用 super 关键字来调用父类的构造方法 例如,在一个子类的构造...

    类继承构造方法super()调用可以吃吗

    在Java编程语言中,类的继承是一个非常重要的概念,它允许我们创建一个新类(子类)来继承现有类(父类)的属性和方法。本文将深入探讨Java中如何通过`super()`关键字来调用父类的构造方法,以及如何在子类中访问...

    JAVA\Java开发中static、this、super和final用法

    - `super`关键字用于访问父类的成员,包括字段和方法。当你在一个子类中重写父类的方法,或想要访问父类的构造器时,就会用到`super`。 - 示例中同样未展示`super`的使用,但常见的使用场景如`super.someMethod()`...

    Java开发中static.this.super.final用法

    它可以用于调用父类的构造函数(`super()`),或者访问父类的字段和方法(`super.field`或`super.method()`)。在子类中,如果重写了父类的方法,可以通过`super`调用父类的原版方法。在示例中没有使用`super`,但它...

    Java中static、this、super、final用途

    它与`this`相对,但用于访问超类(父类)的属性和方法。主要用途如下: - **调用父类构造函数**:在子类构造函数中,`super(args)`用于调用父类的特定构造函数。 - **访问父类被覆盖的方法**:如果子类重写了父类的...

    java---- 封装,接口,继承,覆盖,构造过程,多态,static、this、super、final用法

    在Java中,多态可以通过继承和方法覆盖来实现。 **特点:** - **方法覆盖实现多态:** 子类可以覆盖父类的方法,根据运行时的对象类型动态决定调用哪个方法。 - **接口实现多态:** 实现接口的多个类可以拥有相同的...

    Java中static、this、super、final用途,用法及实例

    - **父类引用**:`super`关键字用于访问父类的成员,包括字段和方法。在子类中,`super`用于明确调用父类的构造函数或者访问父类被覆盖的成员。例如,`super()`调用无参数的父类构造函数。 4. **final**: - **...

    11 继承、super、重写(简化版).docx

    Java中的继承是面向对象编程(OOP)的核心特性之一,它允许一个类(子类)从另一个类(父类)继承特性,包括属性和方法。继承的目的在于提升代码的重用性、优化结构以及为多态提供基础。 ### 1. 继承 #### 1.1 什么...

    Java中static、this、super、final用途用法及实例.docx

    ### Java中static、this、super、...通过上述详细介绍,我们可以看出`static`、`this`、`super`和`final`关键字在Java编程中扮演着重要的角色,正确地理解和使用这些关键字能够帮助开发者编写出更加健壮、高效的代码。

    Java中static、this、super、final用法.docx

    在Java编程语言中,`static`是一个非常重要的关键字,它主要用于定义类成员(包括变量和方法)为静态成员。静态成员的特点是它们不依赖于任何特定对象的存在,即在没有创建该类的实例之前就可以被访问。 ##### 1. ...

    static的使用方法

    在Java编程语言中,`static`关键字扮演着至关重要的角色,它定义了类级别的变量和方法,不受实例化对象的影响。本篇文章将深入探讨`static`的使用方法、原理及其在代码块中的应用。 首先,我们要理解`static`修饰符...

    Java 继承和方法重写

    Java 继承是面向对象编程中的一个核心概念,它允许一个类...通过深入理解并灵活运用 Java 的继承和方法重写,可以编写出更具可维护性和扩展性的代码。在实际开发中,合理地利用这些特性,能有效提升软件的质量和效率。

Global site tag (gtag.js) - Google Analytics