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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 姬仁贵 中级黑马   /  2012-9-3 14:22  /  3981 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Demo
{
        public static void main(String[] args)
        {
                System.out.println("Hello World!");
        }
}
interface A
{
        public abstract void show()
        {
       
        }
}
interface B
{
        public abstract int show()
        {

        }
}
class C implements A,B
{
        public void show()
        {
       
        }

        public abstract int show()
        {

        }
}


一个类可以实现多个接口,在类中必须需要复写所有接口中的抽象方法。现在遇到的一个问题是两个接口中有两个方法,方法名一样参数也一样,有一个有返回值一个没有,在C类实现A,B接口后要复写所有的抽象方法。这两个方法在C类中构不成重载,这个问题怎么解决呢????秋(求)香(详)姐(解)~~~





评分

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

查看全部评分

12 个回复

倒序浏览

若是重载问题?

你要明确函数重载只于函数参数个数或类型有关,于返回值无关:

1)参数个数不同;

2)或者参数类型不同;

3)或者参数顺序不同;
回复 使用道具 举报
本帖最后由 孙沛 于 2012-9-3 14:49 编辑

不能同时调用两个接口的相同名称的方法,因为这样会造成编译的歧义,而且这样做是没有意义的。Java的语义规范里明确了,方法签名包含函数名和参数列表。参数列表的位置及个数+函数名 共同决定了该函数是否是复写。函数的返回值不是方法签名的一部分。 不能用返回值来判定函数是否复写.但是同方法名,不同返回的方法是不能出现在同一个类中的,无法在同一个类中出现多个
回复 使用道具 举报
如果两个接口中存在了同名同参但是返回值不同的方法,这两个接口是不可以被同时继承的,编译直接就通不过,从原则上来说在写代码的的时候一个体系中的接口是不允许定义同名同参但是返回值不同的方法的
回复 使用道具 举报
夏天 来自手机 初级黑马 2012-9-3 14:47:35
报纸
楼主,别纠结了。不可能的事
回复 使用道具 举报
楼上说的对,不能同时调用两个接口的相同名称的方法,因为这样会造成编译的歧义,但如果两个接口中的方法完全相同,那就没有问题,编译器会认为那是同一个方法,编译通过,不过还是没有意义,一般不会这么干的。
回复 使用道具 举报
楼主,首先你的接口定义的有问题,因为接口的方法都是抽象的,不能够有方法主体,
而你定义的接口则有方法主体,如果这样的话你可以改成抽象类A和B,或者把方法主体
去掉。而在A和B中有相同的方法,但是返回值类型不一样,这样就不能被复写,而且
这种形式也不是重载形式,所以这在一个类中不可能同时存在。编译是通不过的,因为
虚拟机不知道要返回什么类型的值!
回复 使用道具 举报
本帖最后由 马镱洵 于 2012-9-3 16:21 编辑

1 接口中的方法不要有实现,要改成这样:
  1. interface A
  2. {
  3.         public abstract void show(int num);
  4. }
  5. interface B
  6. {
  7.         public abstract int show();
  8. }
复制代码
2 C类实现A和B两个接口时,要将两个接口的同名方法同时实现,但是两个接口的同名方法中必须要构成重载.另外,C类实现接口的方法,就不能有abstract关键字了:
  1. class C implements A,B
  2. {
  3.         public void show(int num)
  4.         {
  5.         
  6.         }

  7.         public int show()
  8.         {
  9.            // 必须要有返回值
  10.             return 0;
  11.         }
  12. }
复制代码

评分

参与人数 1黑马币 +4 收起 理由
张飞年 + 4 很给力!

查看全部评分

回复 使用道具 举报
王程 发表于 2012-9-3 15:00
楼上说的对,不能同时调用两个接口的相同名称的方法,因为这样会造成编译的歧义,但如果两个接口中的方法完 ...

"楼上说的对,不能同时调用两个接口的相同名称的方法,因为这样会造成编译的歧义"

不对的,是可以同时调用两个接口的同名方法的,只要两个不同接口的同名方法要构造重载就可以.
回复 使用道具 举报
马镱洵 发表于 2012-9-3 15:54
1 接口中的方法不要有实现,要改成这样:2 C类实现A和B两个接口时,要将两个接口的同名方法同时实现,但是两个 ...

说的好。
回复 使用道具 举报
张飞年 发表于 2012-9-3 16:10
说的好。

:handshake
回复 使用道具 举报
本帖最后由 victoryai 于 2012-9-3 20:29 编辑

首先:接口是属于抽象类的,其内部方法不能有方法体。
其次,lz在写C类时,不应该有abstract关键字,否则c类也就成了抽象类。
再者,这样重载两个同名同参但返回值不同的函数时,编译本身就没法通过!

构造函数里有讲到:对于构造函数的重载,要通过参数类型来完成重载,而不是返回值类型,对于接口中方法的重载应该一样。

如下,编译,运行都是没问题的。希望有所帮助!

class Demo
{
        public static void main(String[] args)
        {
                System.out.println("Hello World!");
        }
}
interface B
{
        public abstract int show(int a);   //返回int类型
}
interface A
{
        public abstract void show();
        public abstract double show(double d);     //返回double类型
}

class C implements A,B
{
        public void show()
        {
        
        }
        public int show(int b)
        {
                return  3;
        }
        public double show(double c){
                return 3.00;
        }
}
回复 使用道具 举报
舒远 黑马帝 2012-9-3 21:36:15
13#
根本无法通过编译的。从逻辑上来讲,这就不符合java的语义,编译器根本就不认这种情况的,所以会编译错误的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马