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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangxinyu 初级黑马   /  2012-6-13 02:51  /  2431 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在群里讨论:SuperClass中的method(int x,double y)和SubClass2中的method(int x)是不是重载关系呢?
class SuperClass {
        public void method(int x, double y) {
                System.out.println("我是父类SuperClass");
        }

//        public void method(int x) {
//                System.out.println("我肯定是重载了");
//        }
}

class SubClass1 extends SuperClass {
        public void method(int x, double y) {
                System.out.println("我重定义了父类SuperClass,即覆盖了父类方法");
        }
}

class SubClass2 extends SuperClass {
        public static void main(String[] args) {
                new SubClass2().method(2, 3.2);
                new SubClass2().method(2);
        }

        public void method(int x) {
                System.out.println("如果我不是重载,我算什么东西?");
        }
}

SuperClass中的method(int x,double y)和SubClass2中的method(int x)是不是重载关系
如果把注释的部分去掉,那SubClass2中的method(int x)跟SuperClass中的两个method分别什么关系
把我头搞得好乱

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
可以这样来理解,在同一个类里面的叫重载,在不同类里面的叫覆盖
例:重载,//重载一般是同一种方法,但是他们的参数或则类型不一样,
   class Chi{
        public void method(int x, double y) {
                System.out.println("我是父类SuperClass");
        }

       public void method(int x) {
              System.out.println("我肯定是重载了");
       }
      }

覆盖://覆盖一般是子类覆盖父类的方法,
class SuperClass {
        public void method(int x, double y) {
                System.out.println("我是父类SuperClass");
        }

class SubClass1 extends SuperClass {
        public void method(int x, double y) {
                System.out.println("我重定义了父类SuperClass,即覆盖了

父类方法");
        }
}

点评

本来还想解释一下的,看来是献丑了  发表于 2012-6-13 03:02
解释的很清楚!  发表于 2012-6-13 03:02

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 给了分但是我不赞同,子父类中相同函数名,.

查看全部评分

回复 使用道具 举报
江南 发表于 2012-6-13 02:59
可以这样来理解,在同一个类里面的叫重载,在不同类里面的叫覆盖
例:重载,//重载一般是同一种方法,但是 ...

睡觉:sleepy:
回复 使用道具 举报
江南 发表于 2012-6-13 02:59
可以这样来理解,在同一个类里面的叫重载,在不同类里面的叫覆盖
例:重载,//重载一般是同一种方法,但是 ...

嘿嘿,我也学习一下:)
回复 使用道具 举报
覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int, float), 但是不能为fun(int, int));
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果

总结:重载一般在同一个类中发生,方法名字相同但参数类型与个数不同,返回类型与修饰符也可以不同。方法重写发生在父类与子类之间,两个类存在继承关系,方法重写时方法的定义(修饰符,返回类型,参数列表)必须相同,只是方法体(方法实现)不同。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
额,都说的很详细了
回复 使用道具 举报
我不怎么赞同江南的观点,子父类中如果子类方法和父类方法函数名相同,参数一样才叫重写,但是如果方法函数名相同,参数不一样还是可以叫做重载的,因为子类虽然继承了父类的方法,能用,但是方法的定义毕竟还是显式的在父类内定义,这样两个方法用起来都不冲突,传不同参数的时候也会自动匹配,这不就是重载的现象么?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马