黑马程序员技术交流社区

标题: 重载必须在一个类中么 [打印本页]

作者: 黑夜里的白猫    时间: 2013-5-23 08:54
标题: 重载必须在一个类中么
本帖最后由 黑夜里的白猫 于 2013-5-24 10:44 编辑

class  Test
{
        public static void main(String[] args)
        {
                Zi z=new Zi();
                z.show();
               
        }
}



public class Fu
{
       public void show()
           {
                   System.out.println("fu lei show");
           }
}

public class Zi extends Fu
{
        public void show(int x)
            {
                        System.out.println("zi lei zhong show(x)"+x);
                }//这一个算是与Fu类中的方法重载么?或者说函数的重载在父子类可以么?必须在一个类中么?
        
}
作者: 刘治广    时间: 2013-5-23 08:58
是的,重载只是复写父类中的方法
作者: SOAR    时间: 2013-5-23 09:09
当子类继承了父类以后,就默认继承了父类的public类型的方法,所以说你现在的子类中就有了这个方法public void show()
           {
                   System.out.println("fu lei show");
           }

而你现在在子类中写了这样一个方法
public void show(int x)
            {
                        System.out.println("zi lei zhong show(x)"+x);
                }


现在就等于是你重载了这个方法。但不是重载了父类的这个方法,而是你重载了从父类继承过来的这个方法。父类还是没有这个带参数的show方法

你可以这样试试

在main函数中
Zi z=new Zi();
                z.show();
z.show(2);
Fu fu = new Fu()
fu.show(2);
看看编译会通过吗?


作者: 史政法    时间: 2013-5-23 09:13
相当于子类继承了父类的方法,又写了一个重载的方法,所以可以理解为子类中的方法重载了,但是父类中没有。
作者: 谢孔营    时间: 2013-5-23 09:16
其实可以这样理解
因为子类继承了父类,那么子类也具有了public void show() 方法
在子类中又写了一个public void show(int x) 的方法,自然是重载。因为参数不同,函数名相同
但是是在子类中重写的,没有覆盖掉父类的show()方法。

作者: 无妄无涯    时间: 2013-5-23 09:35
代码体现的是,子类先从父类继承了不带参数的show方法,然后对这个方法进行了重载,变成了有参show方法。
作者: 黑夜里的白猫    时间: 2013-5-23 09:45
刘治广 发表于 2013-5-23 08:58
是的,重载只是复写父类中的方法

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

class A {
protected int method1(int a, int b) { return 0; }
}
public class B extends A{
public int method1(int a, int b) { return 0; } //正确,重写父类方法,可以扩大访问权限
//private int method1(int a, int b) { return 0; } //错误,重写父类方法,不能降低了访问权限
//private long method1(int a, int b) { return 0; } //错误,重写父类方法,不能改变返回值类型
public short method1(int a, long b) { return 0; }//正确,重载自身的方法,可以有不同的访问权限和返回值类型
private int method1(int a, long b) { return 0; }//正确,重载自身的方法,可以有不同的访问权限和返回值类型
}  
以上这些看过之后相信你会理解,呵呵,楼主没有抓住重载与覆盖的真正内涵
作者: 黑夜里的白猫    时间: 2013-5-23 10:02
SOAR 发表于 2013-5-23 09:09
当子类继承了父类以后,就默认继承了父类的public类型的方法,所以说你现在的子类中就有了这个方法public v ...


这是我自己理解的
Zi z=new Zi();
z.show();//通过,fu lei show;
z.show(2);//通过,zi lei zhong show(x)2;
Fu fu = new Fu()
fu.show(2);//这个失败,父类中没有这个方法


但是编译报错 ,不知道哪里错了!

ddd.jpg (47.6 KB, 下载次数: 0)

ddd.jpg

作者: 无妄无涯    时间: 2013-5-23 12:30
黑夜里的白猫 发表于 2013-5-23 10:02
这是我自己理解的
Zi z=new Zi();
z.show();//通过,fu lei show;

把class Fu 和 class Zi的“public”去掉就没问题了。一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。
作者: Miss小强    时间: 2013-5-23 12:35
他想问的就是重载是否发生在一个类中;
这是肯定的啊。。。
重载就是说在一个类中有函数名相同,但是参数列表不同的函数;
是为重载。。。
希望对你有用;
作者: 黑夜里的白猫    时间: 2013-5-23 21:41
Miss小强 发表于 2013-5-23 12:35
他想问的就是重载是否发生在一个类中;
这是肯定的啊。。。
重载就是说在一个类中有函数名相同,但是参数列 ...

1.发生在一个类中的才叫重载;
2.上述问题不是重载,但可以理解为重载/?
这两句话对么?
作者: 黑夜里的白猫    时间: 2013-5-23 21:45
无妄无涯 发表于 2013-5-23 12:30
把class Fu 和 class Zi的“public”去掉就没问题了。一个Java源文件中最多只能有一个public类,当有一个 ...

嗯 。这样就没问题了。那请问如果要有一个类是public 权限的话,是不是必须是主函数所在的那个类?谢谢。
作者: 骑上最爱    时间: 2013-5-23 21:53
一个.java文件中只能有一个用public修饰的类,并且这个用public修饰的类的名字要和文件名相同。

如果有2个public修饰的类,那么java虚拟机就不知道哪个类名是和文件名相同的了,所以会报错。
作者: 黑夜里的白猫    时间: 2013-5-23 21:55
Miss小强 发表于 2013-5-23 12:35
他想问的就是重载是否发生在一个类中;
这是肯定的啊。。。
重载就是说在一个类中有函数名相同,但是参数列 ...

http://zhidao.baidu.com/question/348815723.html
作者: Miss小强    时间: 2013-5-23 21:57
黑夜里的白猫 发表于 2013-5-23 21:41
1.发生在一个类中的才叫重载;
2.上述问题不是重载,但可以理解为重载/?
这两句话对么? ...

重载肯定是发生在一个类中的;
但是这里说的是重写,
overload:重载;
override:重写,复写,覆盖;发生在子父类中;
作者: 刘胜寒    时间: 2013-5-24 00:43
楼主你好,如果问题以解决,请修改分类,谢谢合作。
作者: 袁梦希    时间: 2013-5-24 00:58
楼主你好,如果问题以解决,请修改分类,谢谢合作。
作者: 无妄无涯    时间: 2013-5-24 08:49
黑夜里的白猫 发表于 2013-5-23 21:45
嗯 。这样就没问题了。那请问如果要有一个类是public 权限的话,是不是必须是主函数所在的那个类?谢谢。 ...

不是必须为main所在的那个类,但是要保证public所修饰的那个类的类名与.java文件名相同。
作者: 黑夜里的白猫    时间: 2013-5-24 10:35
无妄无涯 发表于 2013-5-24 08:49
不是必须为main所在的那个类,但是要保证public所修饰的那个类的类名与.java文件名相同。 ...

恩恩。明白了。谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2