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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大梅 黑马帝   /  2011-12-21 09:21  /  3728 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 大梅 于 2011-12-21 09:49 编辑

class Father{
       public void Print(){... ...}      
}
class Son extends Father
{
        public void Print(String name){... ...}
}
这两个Print方法是重载吗?为什么?
Son s1 = new Son();s1.Print("abc");//这个时候是吗?
Father s2 = new Father();s2.Print();////这个时候不存在重载?
Father s3 = new Son();s3.Print("abc");////这个估计编译都过不去。
从对象的层面判断是否存是重载,思考方式是否正确?

19 个回复

倒序浏览
是重载,父类是无参方法,子类的参数类型是字符串,参数不一样。上面三句话都可以编译通过。是否重载只要看同名函数的参数列表,参数列表不一样则重载。
回复 使用道具 举报
是重載,但不是多態
重載:
參數列表不同(必須),返回值類型可以相同也可以不同
回复 使用道具 举报
class Father{
       public void Print(){... ...}      
}
class Son extends Father
{
        public void Print(String name){... ...}
}
这样写,只是子类中有重载:子类继承了父类的Print(),又实现了Print(String name)新方法
另外:
  1. class Father{
  2.        public void Print(){}      
  3. }
  4. class Son extends Father
  5. {
  6.         public void Print(String name){}
  7. }

  8. class Test
  9. {
  10. public static void main(String[] args)
  11.         {
  12.                 Father s3 = new Son();//这个正常的,编译通过
  13.   }
  14. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 f64412300 于 2011-12-21 09:52 编辑

是的。你写的son s1=new Son()等 那是实例化对象。

你看完就有答案了;多读几次 多理解下

重载:

(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载是一个类中多态性的一种表现。
  (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
  (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。



重写:
(1)父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
  (2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
  (3)子类函数的访问修饰权限不能少于父类的;

点评

概念说的很好  发表于 2011-12-21 09:44

评分

参与人数 1技术分 +2 收起 理由
admin + 2 赞一个!

查看全部评分

回复 使用道具 举报
大梅 黑马帝 2011-12-21 09:46:45
地板
yunqiangshan 发表于 2011-12-21 09:34
是重载,父类是无参方法,子类的参数类型是字符串,参数不一样。上面三句话都可以编译通过。是否重载只要看 ...

恩  这三句话没问题  漏写了   Father s2 = new Son(); s2.Print("abc");这个应该编译不通过的。
回复 使用道具 举报
大梅 黑马帝 2011-12-21 09:47:22
7#
林铁柱 发表于 2011-12-21 09:38
是重載,但不是多態
重載:
參數列表不同(必須),返回值類型可以相同也可以不同 ...

恩  言之有理  这个解释 我能接受
回复 使用道具 举报
大梅 黑马帝 2011-12-21 09:48:04
8#
monghuan 发表于 2011-12-21 09:40
class Father{
       public void Print(){... ...}      
}

这个 能过  我漏写了 我改一下哈
回复 使用道具 举报
刘基军 黑马帝 2011-12-21 09:51:51
9#
本帖最后由 monghuan 于 2011-12-21 13:05 编辑
大梅 发表于 2011-12-21 09:46
恩  这三句话没问题  漏写了   Father s2 = new Son(); s2.Print("abc");这个应该编译不通过的。 ...


恩,编译不通过
回复 使用道具 举报
王胜利 黑马帝 2011-12-21 10:03:44
10#

(1)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
(2)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

public class Dog {
     Dog()
     {
            this.bark();
     }
     void bark()//bark()方法是重载方法
     {
            System.out.println("no barking!");
            this.bark("female", 3.4);
     }
     void bark(String m,double l)//注意:重载的方法的返回值都是一样的,
     {
            System.out.println("a barking dog!");
            this.bark(5, "China");
     }
     void bark(int a,String n)//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分
     {
            System.out.println("a howling dog");
     }
      
     public static void main(String[] args)
     {
            Dog dog = new Dog();
            //dog.bark();
//dog.bark("male", "yellow");
            //dog.bark(5, "China");
                     
然后谈谈 重写(Overriding)       
(1)    父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
(2)    若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
(3)    子类函数的访问修饰权限不能少于父类的;下面是重写的例子:
public class Base
{
    void test(int i)
    {
        System.out.print(i);
    }
    void test(byte b)
    {
        System.out.print(b);
    }
}
public class TestOverriding extends Base
{
    void test(int i)
    {
        i++;
        System.out.println(i);
    }
      public static void main(String[]agrs)
    {
        Base b=new TestOverriding();
        b.test(0)
        b.test((byte)0)
    }
}
       这时的输出结果是1     0,这是运行时动态绑定的结果

评分

参与人数 1技术分 +2 收起 理由
admin + 2 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 周敏2011nc 于 2011-12-22 10:26 编辑

不是重载:
为了让方法名相同而形式参数不同的构造器同时存在,我们必须用到方法重载。
每一个重载的方法都必须有一个独一无二的参数类型列表。
回复 使用道具 举报
我改了,第二个才是正解。
回复 使用道具 举报
大梅 黑马帝 2011-12-21 11:19:44
13#
monghuan 发表于 2011-12-21 09:51
还是可以通过的,原因:多态,在调用Print方法时,是根据对象的实际类型决定的 ...

刚才一直忙着,没时间敲,确实通不过,编译的时候非静态要看父类的。
回复 使用道具 举报
刘基军 黑马帝 2011-12-21 11:53:25
14#
大梅 发表于 2011-12-21 11:19
刚才一直忙着,没时间敲,确实通不过,编译的时候非静态要看父类的。

呵呵,搞错了,之前还是重载的,后来当成重写了,恩,不应该通过
回复 使用道具 举报
方书堂 黑马帝 2011-12-21 12:06:22
15#
是重载,第三句话是涉及了多态,
Farther s3 = new Son();
这个就是一个向上的转型,是把父类的引用指向了自己子类的对象,
它只能使用父类中存在的方法,即: s3.print();是可以的
要是你想调用子类中的方法,就需要强制把父类的引用转换成子类类型
即:Son s4 = (Son)s3;
     s4.print("abc")
这样就可以编译通过了
回复 使用道具 举报
大梅 黑马帝 2011-12-21 12:19:53
16#
方书堂 发表于 2011-12-21 12:06
是重载,第三句话是涉及了多态,
Farther s3 = new Son();
这个就是一个向上的转型,是把父类的引用指向了 ...

恩  是这样的
回复 使用道具 举报

你这样的方式不属于重载(overload),重载表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数
个数或类型不同)。在使用重载要注意以下的几点:
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不
同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),
但是不能为fun(int,int));2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能
在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重
载的效果。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
大梅 黑马帝 2011-12-21 19:38:37
18#
周敏2011nc 发表于 2011-12-21 18:07
你这样的方式不属于重载(overload),重载表示同一个类中可以有多个名称相同的方法,但这些方法的参数列 ...

有不同的答案了哈,这怎么办才好,站在类的角度上我跟你想的一样,站在对象的角度上,我认为是重载的,所以才会问了这个问题。呵呵,现在又回到起点了
回复 使用道具 举报
曾运 黑马帝 2011-12-22 10:10:37
19#
本帖最后由 曾运 于 2011-12-22 10:11 编辑
  1. class Father{
  2.        public void Print(){System.out.print("无参print方法");}      
  3. }
  4. class Son extends Father
  5. {      
  6.             //public void Print(){System.out.print("无参print方法");}  子类从父类继承的的方法
  7.         public void Print(String name){System.out.print("带参数print方法");}//子类中重载print方法,方法名称相同,参数个数不同,是重载
  8. }
  9.    这两个print方法是重载吗?为什么?
  10. 在子类Son中 发生了print方法的重载,子类继承了父类的print方法(不带参数的)
  11. 子类又新增了print方法,该方法是带一个参数的
  12. 你可以测试下: Son son=new Son();
  13.                 son.print();
  14.                                 son.print("java");
复制代码
回复 使用道具 举报
代臣 黑马帝 2011-12-23 09:58:56
20#
本帖最后由 代臣 于 2011-12-23 10:14 编辑

首先你写的这两个方法是重载。
关于重载的理解:
1、重载前提条件是两个方法(函数)同名;
2、重载与返回值类型(void、double、int、......等)无关;
3、重载的关键在于所定义的两个同名方法(函数)的参数列表的不同:
  2.1、两个同名方法如果参数个数不同,肯定是重载,即使参数类型相同;
  2.2、两个同名方法可以含有相同个数的参数,但只要两个方法中所有对应参数的参数类型(int、double、byte、......)不完全相同就是重载。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马