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");
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飓风部落格

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值