类继承时方法覆盖问题。(static方法不能被”覆盖“)

        在看TIJ4的144页说: “覆盖”只有在某方法是基类的接口的一部分时才会出现。 即,必须能将一个对象向上转型为他的基本类型并调用相同的方法。 如果某方法是private(所有private方法都隐式地指定为final),他就不是基类接口的一部分。 自然就没有“覆盖”一说。   

       对于private方法,除了把它看成是因为他所归属的类的组织结构的原因而存在外,其他任何事物都不需要考虑到他。


====================================================================================================


在子类继承父类时,形构相同(返回值,方法名,参数都相同)的方法会被覆盖。  但这是有前提的,他针对的是实例方法,像static这样的方法就不能被”覆盖“。

     根据Java   Language   Specification  的描述,子类在继承父类时,对于方法而言,存在两种关系: 
     1.override即覆盖,这是对实例方法(instance   method)而言的;子类与父类中形构相同的方法会override父类中的那个方法。 

    2. hide  即隐藏,这是对类方法(class   method)即static方法而言的。如果子类中定义了静态方法,则它会隐藏父类中形构相同的所有方法,但如果隐藏了父类中的实例方法,则会编译报错。   

     根据上面的规定,“override覆盖”的前提是   实例方法,只有实例方法在继承时才会出现override情况。 如果是static方法,在继承时出现的现象根本就不能用“override”这个词描述,如果static方法在父类和子类中形构一致,则被成为 hide(隐藏)

那什么是隐藏呢?隐藏 :child隐藏了parent的变量和方法,那么,child实例就不能访问parent中被隐藏的变量或者方法,但是,将child实例向上提升转换成parent,可以访问parent中被隐藏的变量或者方法了。 我的理解是被隐藏的东西就是只和类绑定的东西。当子类继承父类,在子类对象中是访问不到父类中的被隐藏的东西的。因为这些东西只和父类绑定了。

      在从动态绑定的角度来看看这个覆盖问题,因为static方法是类方法,实现时是静态绑定的(引用“JAVA   核心技术   卷1   第六版”中149页内容“private、static、final”修饰的方法是静态绑定的,所以他们修饰的方法不能实现多态,当然不需要被子类覆盖了(子类覆盖父类方法是为了实现多态)。而其他的方法在运行时动态绑定。 同时,所有的变量也都是静态绑定的。

   看个简单的例子:

package com.Test;

public class StaticTest {
	public static void main(String[] args) {
		A a = new B();
		a.f1();
		a.f2();
	}
}

class A {

	public static void f1() {
		System.out.println("hello! A");
	}

	public void f2() {
		System.out.println("hello ! A");
	}
	
}

class B extends A {

	public static void f1() {
		System.out.println("hello! B");
	}

	public void f2() {
		System.out.println("hello! B");
	}
	
}

output: hello!A

         hello!B

补充一句:在类继承中,方法分为覆盖和隐藏,而类中的变量则都是隐藏的,即变量(不管是静态变量还是普通变量)都是跟类绑定的。


   

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值