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

一.子类和父类方法之间的关系

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()
        {
            Console.WriteLine("执行A的Show方法");
        }

    }

    public class B : A
    {
        public void Show()
        {
            Console.WriteLine("执行B的Show方法");
        }
    }
}

这里先给出运行的结果:

由此可以得出结论:

①当子类和父类的方法完全相同时,调用的时候取决于声明的类型(“=”左边),而不是实例化的类型。

②这样情况应该尽量避免,编译器会警告,但是不会妨碍程序的执行。

③当有同名的字段时,同样使用new来消除警告

 可以使用new关键字消除警告,但是运行结果一样。

2.virtural方法和override方法调用

修改代码如下:

View Code

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 virtual void Show()
        {
            Console.WriteLine("执行A的Show方法");
        }

    }

    public class B : A
    {
        public override void Show()
        {
            Console.WriteLine("执行B的Show方法");

        }

    }
}

执行结果:

由此可以知道:重写以后,调用哪个类的方法取决于实例化的类型(“=”右边)或者是转换后最终的类型

 

时间: 2024-10-31 01:26:32

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

转型-关于如何通过子类调用父类的父类中的方法

问题描述 关于如何通过子类调用父类的父类中的方法 package access; class A{ public A(){System.out.println("A created!");} public int f(){ System.out.println("call A.f()"); return 1; } } class B extends A{ public int f(){ System.out.println("call B.f()"

Java override方法重写学习笔记

重载Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同).那么如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载?结果是不行的.,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove 方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返

iOS重写父类中的方法时要先调用父类中的方法的原因

现有两个类: 1.Object001继承自NSObject #import <Foundation/Foundation.h>   @interface Object001 : NSObject   //Object001的头文件,我只是在这里面声明了个方法 -(void)printfString;   @end   #import "Object001.h"   @implementation Object001   //Object001的实现文件,我实现了声明的pri

子类方法返回类型必须和父类相同,抛出的异常声明可以小于或等于父类

Overload译为重载:Override译为重写或者覆盖:  Overload讨论: Java中同一个类不可以有两个相同的方法(方法名.参数类型.参数个数和参数位置都  相同).但可以有方法名相同,参数不同(参数类型.参数个数和参数位置不相同)的方法.这  种相同的方法名,参数不同的方法称为重载. public class Test { public void fn(String name) {} public void fn(int age) {} public void fn(String

Java 25天基础-DAY 07-面向对象-继承子父类中变量的特点-函数的另一个特性重写(覆盖)

继承: 1.提高了代码的复用性 2.让类与类之间产生了关系,有了这个关系,才有了多态的特性. 注意: 千万不要为了获取其他类的功能,简化代码而继承. 必须是类与类之间有所属关系才可以继承,所属关系is a(谁是谁的一种); java语言中,Java只支持单继承,不支持多继承. 因为多继承容易带来安全隐患:当多个父类中定义了相同的功能,当功能内容不同时,子类对象不确定要运行那一个. 但是Java保留了这种机制,并用另一种体现形式来完成表示,"多实现" Java支持的多层继承: 也就是一个

java中子类与父类中隐含的this引用的分析

/* 看一下下面的程序,看是否你的答案和运行的答案是否一致! */ class Parent{ public int x; public Parent p; public Parent(){} public Parent(int x){ this.x=x; p=this; } public void f(){ System.out.println("Parent::f()"); } public void g(){ System.out.println("Parent::g(

对象-java的equals方法重写中的小问题

问题描述 java的equals方法重写中的小问题 public boolean equals(Object otherObject) { // a quick test to see if the objects are identical if (this == otherObject) return true; // must return false if the explicit parameter is null if (otherObject == null) return fal

JavaScript子类用Object.getPrototypeOf去调用父类方法解析_javascript技巧

每个function有个prototype属性,称为原型.每个对象也有个原型,Firefox/Safari/Chrome/Opera 中可以通过__proto__来访问,IE6/7/8中没有提供相关接口. 复制代码 代码如下: function Person(){     this.method1 = function(){} } Person.prototype.method2 = function(){} function Man(){} Man.prototype = new Person

java如何调用父类的父类中被覆盖的方法

问题描述 在类A中调用A的父类B中被覆盖的方法method用的是super.method():那当B的父类C中也有一个和A.B同名的方法method时,在类A中应该如何调用C的该方法呢?请各位指教. 解决方案 解决方案二:在类B写方法method2调用类C的method,使用类Asuper.method2调用.解决方案三:正常手段不行,可以在B类写super,楼上有人说过.反射肯定可以做到,还可以这样写,参考下,只是个思路.publicclassAextendsB{publicvoidtest(