Java 跟C# 方法重写,覆盖,重载对比

开发人员痛苦,就是世界上编程语言太多。而且各有各自的语法,优点。造成我们的认知混乱

 

 C#Java区别
重写

用关键字 virtual 修饰的方法,叫虚方法。可以在子类中用override 声明同名的方法,这叫“重写”。

相应的没有用virtual修饰的方法,我们叫它实方法。
重写会改变父类方法的功能。

方法覆盖是说子类重新定义了父类的方法。

方法覆盖必须有相同的方法名,参数列表和返回类型。

相同
覆盖在子类中用 new 关键字修饰 定义的与父类中同名的方法,叫覆盖。
覆盖不会改变父类方法的功能
与重写一样不相同
重载重载指的是同一个类中有两个或多个名字相同但是参数不同的方法,Java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况。相同

知识补充:
(1)方法的重写、重载与动态连接构成多态性。Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关系(即“猫”is a “动物”)。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。
(2)那什么是动态链接呢?当父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; 对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

 

C# 重写 必须有关键字
 

    class Program
    {
        static void Main(string[] args)
        {
            Student st = new Student();
            st.Print(); //输出Student Print

            Person pt = new Person();
            pt.Print();//输出Person  Print

            Person ps = new Student();
            ps.Print(); //输出Student Print 重写会改变父类方法的功能

            Console.Read();
        }
    }

    class Person
    {
        public virtual  void Print()
        {
            Console.WriteLine(" Person Print");
        }
    }

    class Student :Person
    {
        public override  void Print()
        {
            Console.WriteLine(" Student Print");
        }
    }

C# 覆盖 new 关键字可以省略
 

    class Program
    {
        static void Main(string[] args)
        {
            Student st = new Student();
            st.Print(); //输出Student Print

            Person pt = new Person();
            pt.Print();//输出Person  Print

            Person ps = new Student();
            ps.Print(); //输出Person Print 覆盖不会改变父类方法的功能。

            Console.Read();
        }
    }

    class Person
    {
        public   void Print()
        {
            Console.WriteLine(" Person Print");
        }
    }

    class Student :Person
    {
        public new  void Print()
        {
            Console.WriteLine(" Student Print");
        }
    }

JAVA 重载(重写)   @Override 关键字 可以省略

    public static void main(String[] args) {
        Teacher tt  = new Teacher();
        tt.print(); //Teacher print

        Person pt = new Person();
        pt.print();//Person print

        Person ptt = new Teacher();
        ptt.print();//Teacher print
    }

public class Person {
    public  void print()
    {
        System.out.println("Person print");
    }
}

public class Teacher extends Person{
    @Override //可以省略
    public void print()
    {
        System.out.println("Teacher print");
    }
}

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页