A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐溪永 黑马帝   /  2012-2-17 17:09  /  1812 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

还有跑出来一个overloaded的方法,有点晕了

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

4 个回复

倒序浏览
重载(Overload):
    (1)方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时
    存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
    (2)ava的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具
    有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型
    来决定具体使用哪个方法, 这就是多态性。
    (3)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同
    也可以不相同。无法以返回型别作为重载函数的区分标准
重写(Override):
    (1)父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某
方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,
子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不
动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又
称方法覆盖。
    (2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,
则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键
字引用了当前类的父类。
   (3)子类函数的访问修饰权限不能少于父类的;





评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
overload和override是多态的不同表现
overload是在一个类中方法名字相同,参数的个数、顺序、类型至少有一个不同,其它的不做要求
override是出现在继承关系中,方法名称、参数、返回值类型必须相同,子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 1毫秒的价值 于 2012-2-17 17:28 编辑

概括为:重载是体现在一个类中的,令同一个名字的函数功能更为强大,是同一个类中的多态;
重写是体现在子父类里,是子类去复写父类的行为,是对象的多态性。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现。
重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)
。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了.
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型或有不同
的参数次序,则称为方法的重载(Overloading)。不能通过访问权限、返回类型、抛出的异常
进行重载.
1. Override 特点
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
2.Overload 特点
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int, float), 但是不能为fun(int, int));
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。


1、override

class Program
     {
        public class Employee
         {
            public string name;
            protected decimal basepay;
            public Employee(string name, decimal basepay)
             {
                this.name = name;
                this.basepay = basepay;
             }
            public virtual decimal CalculatePay()
             {
                return basepay;
             }
         }
        public class SalesEmployee : Employee
         {
            private decimal salesbonus;
            public SalesEmployee(string name, decimal basepay, decimal salesbonus):base(name,basepay)//与基类通讯,调用基类的构造函数
             {
                this.salesbonus = salesbonus;
             }
            public override decimal CalculatePay()
             {
                return basepay + salesbonus;
             }
         }
        static void Main(string[] args)
         {Employee employee2 = new Employee("Bob", 1200);
             SalesEmployee employee1 = new SalesEmployee("Alice",1000, 500);
            
             Console.WriteLine("Employee " + employee1.name +" earned: " + employee1.CalculatePay());
             Console.WriteLine("Employee " + employee2.name +" earned: " + employee2.CalculatePay());
         }
     }
运行结果.
Employee Alice earned: 1500
Employee Bob earned: 1200

2、overload

class Class_B
{
       public void a()
        {
            Console.WriteLine("no parameters function");
        }
       public void a(int i, int j)
        {
            Console.WriteLine("{0}+{1}={2}", i, j, i + j);
        }
}
public class test
{
       public static void Main(string[] args)
        {
            Class_B b = new Class_B();
            b.a();
            b.a(2, 6);
        }
}
运行结果.
no parameters function
2+6=8

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马