`
renyanwei
  • 浏览: 70879 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

JAVA中方法和变量在继承中的覆盖和隐藏

阅读更多

我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试或者是SCJP认证题中围绕这些是会经常碰到的,所以这里来讨论下

 

首先我们来看几个概念

隐藏 :child隐藏了parent的变量和方法,那么,child不能访问parent被隐藏的变量或者方法,但是,讲B转换成A中,可以访问A被隐藏的变量或者方法

覆盖 :child覆盖了parent的变量或者方法,那么,child不能访问parent被覆盖的变量或者方法,将child转换成parent后同样不能访问parent被覆盖的变量或者方法

 

首先看一下JAVA中方法和变量在继承时的覆盖和隐藏规则

1.父类的实例变量和静态变量能被子类的同名变量隐藏

2.父类的静态方法被子类的同名静态方法隐藏

3.父类的实例方法被子类的同名实例变量覆盖

 

还有几点需要注意的是

1.不能用子类的静态方法隐藏 父类中同样标示(也就是返回值 名字 参数都一样)的实例方法

2.不能用子类的实例方法覆盖 父类中同样标示的静态方法

3.这点儿请注意,就是变量只会被隐藏 不会被覆盖 ,无论他是实例变量还是静态变量,而且,子类的静态变量可以隐藏 父类的实例变量,子类的实例变量可以隐藏 父类的静态变量

 

O(∩_∩)O哈哈~ 是不是有点儿绕口,没关系 我们看一个实例

创建两个父子类关系的类

//父类
class Parent
{
	public static String kind="javastudy.extendsstudy.parent";
	public static int age=50;
	public String name="Parent";

	//静态方法,返回包名
	public static String getKind()
	{
		System.out.println("parent的getKind()方法被调用了");
		return kind;
	}

	//静态方法,返回年龄
	public static int getAge()
	{
		System.out.println("Parent的getAge()方法被调用了");
		return age;
	}

	//实例方法,返回姓名
	public String getName()
	{
		System.out.println("Parent的getName()方法被调用了");
		return this.name;
	}

}


//子类
class Child extends Parent
{
	public static String kind="javastudy.extendsstudy.child";
	public int age=25;
	public String name="child";

	//隐藏父类静态方法
	public static String getKind()
	{
		System.out.println("child的getkind()方法被调用了");
		return kind;
	}
	
	//获取父类包名
	public static String getParentKind()
	{
		return Parent.kind;
	}
	
	//覆盖父类实例方法
	public String getName()
	{
		System.out.println("child的getName()被调用了");
		return this.name;
	}
	
	//获取父类名称
	public String getParentName()
	{
		return super.name;
	}
	/*
	 *错误,实例方法不能覆盖父类的静态方法
	public int getAge()
	{
		return this.age;
	}
	*/
}

 然后测试下

class Test 
{
	public static void main(String[] args) 
	{
		Child child=new Child();
		System.out.printf("子类名称:%s,年龄:%d,包名:%s%n",child.name,child.age,child.kind);
		//输出:子类名称:child,年龄:25,包:javastudy.extendsstudy.child

		//把child转换成parent对象
		Parent parent=child;

		System.out.printf("转换后的名称:%s,年龄:%d,包名:%s%n",parent.name,parent.age,parent.kind);
		//输出:转换后的名称:Parent,年龄:50,包:javastudy.extendsstudy.parent

		System.out.printf("子类访问父类被隐藏的实例变量name:%s%n",child.getParentName());
		//输出:子类访问父类被隐藏的实例变量name:Parent
		
		System.out.printf("子类访问父类被隐藏的静态变量kind:%s",child.getParentKind());
		//输出:子类访问父类被隐藏的静态变量kind:javastudy.extendsstudy.parent

		child.getName();
		//输出:child的getName()被调用了

		//**************注意看这个方法,返回的还是子类的getName
		parent.getName();
		//输出:child的getName()被调用了

		child.getKind();
		//输出:child的getkind()方法被调用了

		parent.getKind();
		//输出:parent的getKind()方法被调用了
	}
}

 好了,看了结果后总结下吧

1.同名的实例方法被覆盖 ,同名的静态方法被隐藏 ,child类的getName实例方法覆盖 了parent的getName实例方法,chind的getKind方法隐藏 了parent类的getKind方法

2.隐藏覆盖 的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏 的变量和方法,而不能访问父类被覆盖 的方法

3.如果需要访问父类被隐藏 的实例变量,加上super就好了,比如访问父类的name,写上super.name就好了

 

本文不是教会大家重写父类变量的,而是重点说明方法和变量的隐藏和覆盖,这些个小知识点虽然在做项目的时候不怎么会用到,但是一定要记住,不然的话很多错误会感到莫名其妙,还有就是SCJP的题库里这类题大大存在,所以本人觉得这些细小的知识还是记住为好

6
0
分享到:
评论
3 楼 taotaole2210 2013-08-14  
谢谢,虽然有点绕口,但是解释的很清楚
2 楼 song1990919 2012-03-22  
隐藏和覆盖不明白的值得一看
1 楼 computerlibin 2011-11-28  
好文章,很基础

相关推荐

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

    变量和方法覆盖和隐藏的不同:一个类的实例无法通过使用全局名或者强制自己转换为父类型,以访问父类中被隐藏的方法,然而强制转换子类为父类型之后,可以访问父类中被隐藏的变量。另外静态方法不能覆盖父类的实例...

    方法和变量在继承时的覆盖和隐藏问题

    然而,在继承过程中,可能会出现方法和变量的覆盖(Override)和隐藏(Hide)问题。这个问题对于理解Java类的继承机制和代码的运行行为非常重要。 首先,需要明确几个概念:覆盖与隐藏。方法覆盖发生时,子类提供一...

    Java方法继承、方法重载、方法覆盖总结

    在Java编程语言中,方法继承、方法重载、方法覆盖是三个非常重要的概念。它们之间既有关联又有区别,掌握这些概念对于深入理解面向对象编程有着至关重要的作用。 #### 一、Java方法继承 **方法继承**是指在一个类...

    Java 接口与继承

    `this`和`super`常常用于解决成员变量的隐藏和方法的覆盖问题,尤其是在构造方法中调用其他构造方法或父类的构造方法时。 总的来说,继承和接口是Java中实现代码复用、模块化和扩展性的核心工具。通过合理利用这些...

    论JAVA继承机制中父类与子类的关系

    文章围绕子类继承父类成员的过程、成员变量及方法的赋值、重写、覆盖等问题展开讨论,旨在帮助读者更好地理解Java继承中的重点与难点。 #### 关键词 - 继承机制 - 父类 - 子类 #### 一、超类的属性或方法在继承...

    区分Java的方法覆盖与变量覆盖

    在Java编程语言中,方法覆盖(Method Overriding)和变量覆盖(Variable Overriding)是面向对象编程中的两个重要概念,尤其对于初学者来说,正确理解它们的区别至关重要。 **方法覆盖**指的是子类重写父类中具有...

    《java面向对象程序设计-继承和多态》教案.doc

    封装是面向对象编程的基础,它涉及到将数据(属性)和操作这些数据的方法(行为)组合在一个类中,以隐藏内部实现细节。在Java中,类(class)用于定义对象的结构,通过圆点符号(.)来访问对象的成员。封装有助于...

    Java中super变量.pdf

    总结来说,`super`关键字在Java中扮演着至关重要的角色,它帮助我们处理继承关系,访问父类的成员变量和方法,以及调用父类的构造方法。理解并熟练使用`super`是掌握面向对象编程的关键部分,特别是在进行复杂的类...

    JAVA面向对象基础测试题-继承-封装-多态等测试题.docx

    子类可以继承父类的属性和方法,并且可以添加新的属性和方法或者覆盖父类中的方法,从而实现代码复用和功能的增强。 3. **多态**:多态是指允许不同类的对象对同一消息作出响应,即同一操作作用于不同的对象,可以...

    Java 类和继承相关代码集

    在Java中,类定义了对象的状态(数据成员或字段)和行为(方法)。 - 使用关键字`class`来声明一个类,例如:`public class Student { ... }`。 - 类可以包含字段(变量),表示对象的状态;方法(函数),表示...

    java类的继承详解说明

    继承是指一个类继承另一个类的成员变量和方法,使得子类可以获得父类的所有成员变量和方法,并在此基础上增加自己的成员变量和方法。继承的关键字是 extends,它表示子类继承自父类。 继承的实现 Java 中的继承是...

    完整版精品java课件 Java基础入门教程 Java程序设计 第5章 继承和接口(共47页).ppt

    在Java编程中,继承和接口是面向对象编程的重要概念,它们使得代码的复用和扩展变得更加高效。本篇内容将深入讲解这两个核心概念。 首先,我们来看一下类的继承。继承是Java中实现代码复用的一种方式,它允许一个类...

    java继承代码

    在Java编程语言中,继承是面向对象编程的一个核心特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。这个过程可以理解为子类从父类那里“继承”了特征和行为,从而实现了代码的重用和扩展。在“java继承...

    java学习资料-Java继承和多态

    Java 继承和多态是面向对象编程中的核心概念,它们是Java中实现代码复用和灵活设计的关键机制。在Java中,继承允许一个类(子类)从另一个类(父类)继承特性,而多态则使得不同类型的对象能够共享相同的操作。 ###...

    实验四:Java继承与接口

    在Java中,类继承的声明方法是通过extends关键字来实现的,例如:`public class ChinaPeople extends People`,这意味着ChinaPeople类继承了People类的所有成员变量和方法。 三、成员变量的隐藏及方法的重写 在...

    Java方法的覆盖与隐藏的区别分析

    Java中的方法覆盖(Override)和隐藏(Hiding)是面向对象编程中的两个重要概念,它们涉及到多态性和运行时类型识别(RTTI)。在Java中,这两种情况在处理继承关系时会产生不同的行为。 1. **方法覆盖(Override)*...

    Java的继承机制详解

    Java的继承机制是面向对象编程中的核心特性,它允许一个类(子类)从另一个类(父类)继承属性和方法,从而实现代码的复用和扩展。在Java中,继承具有以下特点: 1. 单继承:不同于C++等语言,Java仅支持单继承,即...

    java继承与多态教学及练习

    1继承的概念 2继承的实现 3变量隐藏与方法覆盖 4super关键字 5 子类的构造顺序 6Object类 7 final关键字

    Java编程语言入门 Java语言基础教程 第06课 oop2 Java的面向对象编程-继承、接口、包 共37页.pdf

    在Java中,方法覆盖必须满足以下条件: - 方法名、参数列表和返回类型都必须相同。 - 访问级别不能低于父类中的方法。 - 子类中的方法可以使用`@Override`注解来明确表示这是一个覆盖方法。 #### 五、示例 下面是...

    Java源码小合集:继承和多态相关的例子.rar

    继承和多态的相关Java源码下载,比较散,像覆盖和重载、对象类Object和它的toString()方法、多态性、动态绑定和一般程序设计、数组线性表ArrayList类、final类、方法和变量、数据域和静态方法的隐藏、调用父类的方法...

Global site tag (gtag.js) - Google Analytics