多态、重写与隐藏

1.字段与静态方法

子类的字段与静态方法可以与父类同名,但上面不能够有@Override注解,也就是说它们不能被重写。

在同名的情况下,起到了“隐藏”的效果。

例如: Employee man = new Manager(); man.test();
实例化的这个对象中,声明的man变量是Employee类的,变量名存在栈中,而内存堆中为对象申请的空间却是按照Manager类来的,就是Employee类型的man变量的指针指向了一个Manager类的对象。如果对这个man调用方法,调用的是谁的?如果是非静态方法,编译时编译器以为是要调用Employee类的,可是实际运行时,解释器就从堆上开工了,实际上是从Manager类的那个对象上走的,所以调用的方法实际上是Manager类的方法。有这种结果关键在于man实际上指向了Manager类对象。现在用man来调用静态方法,实际上此时是Employee类在调用静态方法,Employee类本身肯定不会指向Manager类的对象,那么最终调用的是Employee类的方法。
由此,只能说形式上静态方法的却可以被重写,实际上达不到重写的效果。

2.代码示例

cpp中,拥有virtual关键字是多态的必要条件,而java中多态是主动的行为。

对成员变量的访问不是多态的!
对静态方法的访问不是多态的!

只有非private方法才能被重写,也即被覆盖。

重写时,返回值类型可以变吗?

可以,返回类型只要为原返回值类型的子类即可。

时间: 2024-10-31 10:51:54

多态、重写与隐藏的相关文章

C#继承类重写与隐藏基类方法的区别

继承|区别 using System; using System.Collections; public class Nevermore60Customer:Customer { public override string GetFunnyString() { return "Nevermore60.Nevenmore!"; }   ----------------------------------------------------------------------------

关于C#中,继承类重写与隐藏基类方法的区别!

继承|区别 using System;using System.Collections; public class Nevermore60Customer:Customer{ public override string GetFunnyString() { return "Nevermore60.Nevenmore!"; } --------------------------------------------------------------------------------

方法重写,隐藏在子类父类中的各种调用实践

一.子类和父类方法之间的关系 1.当子类和父类有方法完全相同的方法 namespace ConsoleApplication2 { class Program { static void Main(string[] args) { B b = new B(); A a = new A(); A c = new B(); b.Show(); a.Show(); c.Show(); Console.Read(); } } public class A { public void Show() { C

重写、隐藏基类(new, override)的方法_C#教程

复制代码 代码如下: public class Father    {        public void Write() {            Console.WriteLine("父");        }    }     public class Mother    {        public virtual void Write()        {            Console.WriteLine("母");        }    }

Java中继承、多态、重载和重写介绍_java

什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承.多态.重载和重写. 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型.继承是面向对象的三个基本特征--封装.继承.多态的其中之一,我们在使用JAVA时编写的每一个类都是在继承,因为在JAVA语言中,java.lang.Object类是所有类最根本的基类(或者叫父类.超类),如果

C++中重载、重写(覆盖)和隐藏的区别实例分析_C 语言

本文实例讲述了C++中重载.重写(覆盖)和隐藏的区别,对于C++面向对象程序设计来说是非常重要的概念.具体分析如下: 1.重载:重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. 示例代码如下: class A{ public: void test(int i); void test(double i); void test(int i, double j); void te

C#方法重载(overload)、重写(覆盖)(override)、隐藏(new)

  重载.重写.隐藏这三个概念对于很多人都不是很清晰,我也是差了很多资料又请教师哥才感觉能理解了,有不足之处还请老师同学们批评指正!   定义:   重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同.这样才能通过传递不同的参数来决定到底调用哪一个.而返回值类型不同是不能构成重载的.   重写:继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的.例如:基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.

Objective-C中的重载和重写详解_IOS

Objective-C 重载和重写 首先,Objective-C中不完全支持重载,网上很多人要么将重载和重写搞混,要么说OC不支持重载(当然按照重载严格定义说OC不支持重载也没错),事实上OC支持参数个数不同的函数重载. 问题: Objective-C和Swift中有重载吗? Swift中有重载,但Objective-C中基本不支持重载. 展开: 重载.重写和隐藏三者在编程语言中的定义 重载(overload):函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同.重

C++中的重载、覆盖、隐藏介绍_C 语言

前几天面试时被问及C++中的覆盖.隐藏,概念基本答不上来,只答了怎么用指针实现多态,也还有遗漏.最终不欢而散.回来后在网上查找学习了一番,做了这个总结.其中部分文字借用了别人的博客,望不要见怪. •概念 一.重载(overload)指函数名相同,但是它的参数表列个数或顺序,类型不同.但是不能靠返回类型来判断. (1)相同的范围(在同一个作用域中) : (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. (5)返回值可以不同: 二.重写(也称为覆盖 override)是