我们知道,在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的题库里这类题大大存在,所以本人觉得这些细小的知识还是记住为好
分享到:
相关推荐
变量和方法覆盖和隐藏的不同:一个类的实例无法通过使用全局名或者强制自己转换为父类型,以访问父类中被隐藏的方法,然而强制转换子类为父类型之后,可以访问父类中被隐藏的变量。另外静态方法不能覆盖父类的实例...
然而,在继承过程中,可能会出现方法和变量的覆盖(Override)和隐藏(Hide)问题。这个问题对于理解Java类的继承机制和代码的运行行为非常重要。 首先,需要明确几个概念:覆盖与隐藏。方法覆盖发生时,子类提供一...
在Java编程语言中,方法继承、方法重载、方法覆盖是三个非常重要的概念。它们之间既有关联又有区别,掌握这些概念对于深入理解面向对象编程有着至关重要的作用。 #### 一、Java方法继承 **方法继承**是指在一个类...
`this`和`super`常常用于解决成员变量的隐藏和方法的覆盖问题,尤其是在构造方法中调用其他构造方法或父类的构造方法时。 总的来说,继承和接口是Java中实现代码复用、模块化和扩展性的核心工具。通过合理利用这些...
文章围绕子类继承父类成员的过程、成员变量及方法的赋值、重写、覆盖等问题展开讨论,旨在帮助读者更好地理解Java继承中的重点与难点。 #### 关键词 - 继承机制 - 父类 - 子类 #### 一、超类的属性或方法在继承...
在Java编程语言中,方法覆盖(Method Overriding)和变量覆盖(Variable Overriding)是面向对象编程中的两个重要概念,尤其对于初学者来说,正确理解它们的区别至关重要。 **方法覆盖**指的是子类重写父类中具有...
封装是面向对象编程的基础,它涉及到将数据(属性)和操作这些数据的方法(行为)组合在一个类中,以隐藏内部实现细节。在Java中,类(class)用于定义对象的结构,通过圆点符号(.)来访问对象的成员。封装有助于...
总结来说,`super`关键字在Java中扮演着至关重要的角色,它帮助我们处理继承关系,访问父类的成员变量和方法,以及调用父类的构造方法。理解并熟练使用`super`是掌握面向对象编程的关键部分,特别是在进行复杂的类...
子类可以继承父类的属性和方法,并且可以添加新的属性和方法或者覆盖父类中的方法,从而实现代码复用和功能的增强。 3. **多态**:多态是指允许不同类的对象对同一消息作出响应,即同一操作作用于不同的对象,可以...
在Java中,类定义了对象的状态(数据成员或字段)和行为(方法)。 - 使用关键字`class`来声明一个类,例如:`public class Student { ... }`。 - 类可以包含字段(变量),表示对象的状态;方法(函数),表示...
继承是指一个类继承另一个类的成员变量和方法,使得子类可以获得父类的所有成员变量和方法,并在此基础上增加自己的成员变量和方法。继承的关键字是 extends,它表示子类继承自父类。 继承的实现 Java 中的继承是...
在Java编程中,继承和接口是面向对象编程的重要概念,它们使得代码的复用和扩展变得更加高效。本篇内容将深入讲解这两个核心概念。 首先,我们来看一下类的继承。继承是Java中实现代码复用的一种方式,它允许一个类...
在Java编程语言中,继承是面向对象编程的一个核心特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。这个过程可以理解为子类从父类那里“继承”了特征和行为,从而实现了代码的重用和扩展。在“java继承...
Java 继承和多态是面向对象编程中的核心概念,它们是Java中实现代码复用和灵活设计的关键机制。在Java中,继承允许一个类(子类)从另一个类(父类)继承特性,而多态则使得不同类型的对象能够共享相同的操作。 ###...
在Java中,类继承的声明方法是通过extends关键字来实现的,例如:`public class ChinaPeople extends People`,这意味着ChinaPeople类继承了People类的所有成员变量和方法。 三、成员变量的隐藏及方法的重写 在...
Java中的方法覆盖(Override)和隐藏(Hiding)是面向对象编程中的两个重要概念,它们涉及到多态性和运行时类型识别(RTTI)。在Java中,这两种情况在处理继承关系时会产生不同的行为。 1. **方法覆盖(Override)*...
Java的继承机制是面向对象编程中的核心特性,它允许一个类(子类)从另一个类(父类)继承属性和方法,从而实现代码的复用和扩展。在Java中,继承具有以下特点: 1. 单继承:不同于C++等语言,Java仅支持单继承,即...
1继承的概念 2继承的实现 3变量隐藏与方法覆盖 4super关键字 5 子类的构造顺序 6Object类 7 final关键字
在Java中,方法覆盖必须满足以下条件: - 方法名、参数列表和返回类型都必须相同。 - 访问级别不能低于父类中的方法。 - 子类中的方法可以使用`@Override`注解来明确表示这是一个覆盖方法。 #### 五、示例 下面是...
继承和多态的相关Java源码下载,比较散,像覆盖和重载、对象类Object和它的toString()方法、多态性、动态绑定和一般程序设计、数组线性表ArrayList类、final类、方法和变量、数据域和静态方法的隐藏、调用父类的方法...