`
renyanwei
  • 浏览: 70003 次
  • 性别: 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中的方法和变量在继承时的覆盖问题

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

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

    最近有个同学问了我一个小问题,觉得很有意思,之前一直没有想到过。他说“java中存在方法覆盖,是否存在变量的覆盖呢?”。

    java继承与多态教学及练习

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

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

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

    Java开发技术大全(500个源代码).

    invokeMethod.java 同一个类中调用方法示例 invokeOther.java 类的外部调用方法示例 invokeStaticMethod.java 调用静态方法示例 localVariable.java 演示局部变量 localVSmember.java 局部变量与成员变量同名...

    Thinking in Java简体中文(全)

    2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入...

    java联想(中文)

    2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入...

    Java入门教程(微学苑)-part1

    4.5 继承中的方法的覆盖和重载 65 4.6 多态和动态绑定 66 4.7 动态绑定 69 4.8 instanceof 运算符 70 4.9 多态对象的类型转换 71 4.10 Java static关键字以及Java静态变量和静态方法 72 4.11 static 的内存分配 73 ...

    10个java主题

    10个JAVA主题,Item 1: 什么时候被覆盖的方法并非真的被覆盖了 Item 2: String.equals()方法与== 运算符的用法比较 Item 3: Java 是强类型语言本 Item 4: 那是构造函数吗 Item 5: ...

    Thinking in Java 中文第四版+习题答案

    2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入...

    java 编程入门思考

    2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入...

    疯狂JAVA讲义

    5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和import 135 5.4.4 Java的常用包 140 5.5 深入...

    Java初学者入门教学

    2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入...

    Thinking in java(中文)

    多形性 7.1 上溯造型 7.1.1 为什么要上溯造型 7.2 深入理解 7.2.1 方法调用的绑定 7.2.2 产生正确的行为 7.2.3 扩展性 7.3 覆盖与过载 7.4 抽象类和方法 7.5 接口 7.5.1 Java的“多重...

    java初学者必看

    2.5.2 在UltraEdit上开发Java 2.6 集成开发环境Eclipse介绍 2.6.1 Eclipse下载与安装 2.6.2 Eclipse的透视图 2.6.3 Eclipse的视图(View) 2.6.4 Eclipse的编辑器 2.6.5 Eclipse的工具栏和菜单栏 2.6.6 使用...

    java jdk实列宝典 光盘源代码

    方法和变量在继承时的覆盖和隐藏;排序类; 3数字 数字类;格式化数字;转换数字进制;生成随机数; 4数组和集合 使用Arrays类;动态调整数组长度;java为数据结构中的列表定义了一个接口类java.util.list同时提供了...

    JAVA_Thinking in Java

    2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入...

    corejava培训文档

    6.8. 数据和方法的隐藏―――封装 6.9. 方法的重载 7. 六 高级语言特性 7.1. 封装 (encapsulation) 7.2. 继承 (inherit) 7.2.1. JAVA继承特点 7.2.2. 父类(SuperClass)和 子类(SubClass)的关系 7.2.3. ...

    Java语言基础下载

    构造方法在继承中的使用 96 super关键字 97 包装类 97 toString( )方法 100 内容总结 101 独立实践 102 第七章:类的高级特征 103 学习目标 103 static关键字 104 final关键字 106 内部类 106 实例分析 110 抽象类,...

Global site tag (gtag.js) - Google Analytics