`
剑锋凛冽
  • 浏览: 73437 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

子类一定覆盖父类的同名方法吗?

 
阅读更多

子类对父类方法的覆盖是Java实现多态的重要手段,但是如果运行下面一段代码,结果很奇异

package staticTest;
import anotherPackage.*;
//
//父子类方法同名一定覆盖吗
public class Father {
	
	public void say() {
		System.out.println("I'm father say");
	}

	private void hello() {
		System.out.println("I'm father hello");
	}

	void sayToAnotherPackage() {
		System.out.println("I'm father another say");
	}

	public static void hellostatic() {
		System.out.println("I'm father static hello");
	}
	
	public static void main(String[] args){
		Father samePackage=new SonSamePackage();
		samePackage.say();//这个方法是正常的多态,没有什么问题
		samePackage.hello();//这个方法实际是子类访问不到的private限制,因此无法覆盖
		samePackage.hellostatic();//静态方法属于类,因此最终执行的是samePackage的编译时类型,而不是运行时类型来执行
		//因此执行的仍然是父类的
		Father anotherPackage=new SonAnotherPackage();
		anotherPackage.sayToAnotherPackage();//默认访问权限,导致另一包中的子类无法访问要覆盖的sayToAnotherPackage方法,因此无法覆盖,
		//故,执行该操作的依然是父类的sayToAnotherPackage方法
	}
}



class SonSamePackage extends Father {
	public void say() {
		System.out.println("I'm SonSamePackage say");
	}

	private void hello() {
		System.out.println("I'm SonSamePackage hello");
	}

	void sayToAnotherPackage() {
		System.out.println("I'm SonSamePackage another say");
	}

	public static void hellostatic() {
		System.out.println("I'm SonSamePackage static hello");
	}
}

package anotherPackage;
//一定要放在另外一个包中,否则运行结果与文章说明不一致。
import staticTest.*;
public class SonAnotherPackage extends Father{
	public void say(){
		System.out.println("I'm SonAnotherPackage say");
	}
	public void hello(){
		System.out.println("I'm SonAnotherPackage hello");
	}
	void sayToAnotherPackage(){
		System.out.println("I'm SonAnotherPackage another say");
	}
	
	public static void hellostatic(){
		System.out.println("I'm SonAnotherPackage static hello");
	}
}

 运行Father类的main方法,可以看到如下结果

I'm SonSamePackage say
I'm father hello
I'm father static hello
I'm father another say

 而不是预想中的执行子类方法。

通过查看注释,可以有以下结论

1,Java中父类的方法能不能被子类覆盖,取决于子类能不能访问到父类的对应方法:如private、    默认访问权限的约束

2,静态方法是属于类的,因此即使是子类对象拥有同名方法,也不是覆盖,调用静态方法是通过类实现,而不是通过对象实现的,因此通过对象实现的覆盖产生的多态对静态方法不适用。

分享到:
评论
1 楼 zhulin902 2012-09-20  
不错

相关推荐

    PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解

    在PHP中,会遇到这样的情况,子类继承父类,但是又需要对父类的属性和方法进行一定的扩展,这时子类可以对属性和方法进行重写,覆盖与父类同名的属性和方法,但是如果父类的方法中的内容比较多,比如上百成千行代码...

    俄罗斯用到的知识点.pdf

    函数的重写(OverRide):子类可以覆盖父类的同名方法。 如果父类有虚方法,默认是调用子类的方法 this.show。如果要调用父类的show方法应该写成base.show 如果父类没有虚方法,则重写失败还是调用父类的show方法 ...

    Java中的方法和变量在继承时的覆盖问题

    另外静态方法不能覆盖父类的实例方法,而静态变量却可以隐藏父类的一个同名实例变量,同样,实例方法不能覆盖父类的同名静态方法,而变量却可以隐藏父类的同名变量成员,不论父类的这个变量成员是类变量或者是实例...

    Python程序基础:继承.pptx

    继 承;在程序中,继承描述的是事物之间的从属关系。在继承关系中,已有的、设计好的类称为父类或基类,新设计的类称为子类或派生类。...即子类中的方法会覆盖父类中同名的方法,这也称为重载。;2.调用父类方法

    java简答题

    方法的覆盖:在子类中对父类定义方法的重新定义,在子类中将隐藏来自父类的同形态方法。 4-3 Java类的继承有何特点?如何理解接口的作用? 继承是存在于面向对象程序中两个类之间的一种关系。使用继承的主要优点是使...

    python super()函数的基本使用

    也就是说,子类会继承父类的所有的属性和方法,子类也可以覆盖父类同名的属性和方法。 class Parent(object): Value = "Hi, Parent value" def fun(self): print("This is from Parent") # 定义子类,继承父类 ...

    C++虚函数与多态性

    C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。而重载则是允许有多个同名的函数,而这些函数的参数列表不同,允许参数个数不同,...

    java试卷(含答案)

    子类可以定义与父类同名的方法,称为方法的覆盖,方法覆盖要求子类的方法与父类的方法名字和参数都相同,但返回值类型可以不同。 子类要调用父类的方法,必须使用super关键字。 4.最终类不能派生子类,最终方法不...

    重载与覆写/重写的区别

     而当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法, 即在子类中重写该方法——相同参数,不同实现(动态多态性) 复制代码 public class Base { void test...

    C#重写重载与多态

    重写:是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在...多态:c#的多态性主要体现在类的继承上:子类继承父类的时候,可能出现同名但方法定义不同的情况, 所以在子类中会将原方法覆盖,实现自身的要求

    Python实现通过继承覆盖方法示例

    主要介绍了Python实现通过继承覆盖方法,结合实例形式分析了Python面向对象程序设计中采用子类覆盖父类同名方法相关操作技巧,需要的朋友可以参考下

    Java面试宝典(基础篇).docx

    与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。 重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型...

    java基础课程重点笔记.rar

    重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊...

    javakejian

    1)覆盖( override )——在子类中对从父类继承的方法进行重新定义,即重写。 2)重载( overload )——在同一个类中定义多个同名的定义内容不同但最终功能相同的方法。 比如,程序中定义多个名为 print方法,...

    PHP面向对象程序设计(OOP)之方法重写(override)操作示例

    虽然说在PHP里面不能定义同名的方法, 但是在父子关系的两个类中,我们可以在子类中定义和父类同名的方法,这样就把父类中继承过来的方法覆盖掉了(重写父类方法)。 <?php class Person { //下面是人的成员属性...

    北邮高级语言程序设计(基于Java)第三次阶段作业.docx

    子类只能覆盖父类的方法,而不能重载 北邮高级语言程序设计(基于Java)第三次阶段作业全文共14页,当前为第2页。 子类只能重载父类的方法,而不能覆盖 子类不能定义和父类名同名同形参的方法,否则,系统将不知道使用...

    java面试题

    2:继承:子类继承父类,子类可以拥有父类中已定义的方法,并且子类可以修改父类中的方法使其更适合特殊需求。 3:多台:不同对象对统一消息作出不同响应称之为多态 4:抽象:忽略与当前主题无关的那些方面,将...

    .net_笔试题目

    覆盖是指子类重新定义父类的虚函数的做法。 重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。 其实,重载的概念并不属于“面向对象编程”, 重载...

    Java复习题及答案

    答:父类的构造方法不可以被子类覆盖,因为父类和子类的类名是不可能一样的。 3、请讲述String 和StringBuffer的区别。 答:String 类所定义的对象是用于存放“长度固定”的字符串。 StringBuffer类所定义的对象是...

Global site tag (gtag.js) - Google Analytics