黑马程序员技术交流社区

标题: 接口多继承,接口的常量和方法调用问题 [打印本页]

作者: 小黑马    时间: 2012-9-5 15:35
标题: 接口多继承,接口的常量和方法调用问题
本帖最后由 马小龙 于 2012-9-5 20:53 编辑
  1. package com.itheima;

  2. public class Test3 implements C{
  3.         public static void main(String[] args){
  4.                 Test3 test3 = new Test3();
  5.                <font color="Red"> System.out.println(test3.x);//为什么这个编译报错,如果没有这句话,编译能通过</font>
  6.                 System.out.println(test3.say());//而方法可以编译通过并且执行
  7.         }
  8.         @Override
  9.         public int say() {
  10.                 System.out.println(this.getClass());
  11.                 return 0;
  12.         }
  13. }
  14. interface A{
  15.         int x = 5;
  16.         int say();
  17. }
  18. interface B{
  19.         int x = 4;
  20.         int say();
  21. }
  22. interface C extends A,B{

  23. }
复制代码
问题: 1.接口A和B中定义了相同的方法, Test3类实现的时候,具体是实现哪个接口中的方法?
         2.接口A和B中定义了相同常量X, 如果没有System.out.println(test3.x);编译能通过?
         3.在执行Test3 test3 = new Test3();这句话后,内存中是怎么调用接口分配空间的?

作者: 武庆东    时间: 2012-9-5 16:13
public class Test3 implements C{
        public static void main(String[] args){
                Test3 test3 = new Test3();
            System.out.println(test3.x);//因为实现的两个类中都有x静态变量,编译去不知道应该调用哪一个所以编译出错
                System.out.println(test3.say());//而方法可以编译通过并且执行
        }
        @Override
        public int say() {
                System.out.println(this.getClass());
                return 0;
        }
}
interface A{
        int x = 5;
        int say();
}
interface B{
        int x = 4;
        int say();
}
interface C extends A,B{

}
1.接口A和B中定义了相同的方法, Test3类实现的时候,具体是实现哪个接口中的方法?
接口为实现类提供的一些列规则,只要实现接口的方法即可
2.接口A和B中定义了相同常量X, 如果没有System.out.println(test3.x);编译能通过?
两个接口任意去掉一个x即可
3.在执行Test3 test3 = new Test3();这句话后,内存中是怎么调用接口分配空间的?
   
作者: 孙岳    时间: 2012-9-5 16:38
1.接口A和B中定义了相同的方法, Test3类实现的时候,具体是实现哪个接口中的方法?

      接口定义的是抽象方法,没有方法体,要使用的话需要实现该方法,也就是在类中把方法体补全,所以实现的是哪个接口中的方法并不重要,因为都是一样的。

2.接口A和B中定义了相同常量X, 如果没有System.out.println(test3.x);编译能通过?

      A和B中都定义了x,重复,所以编译不能通过。如果没有这一句,编译可以通过。

3.在执行Test3 test3 = new Test3();这句话后,内存中是怎么调用接口分配空间的?

      栈内存分配空间,给test3,堆内存分配空间给对象Test3(),test3中存的是该对象的地址,方法区分配空间,
给接口A,B,C,存放x和say()。

作者: 贾昆    时间: 2012-9-5 17:41
1.两个接口只是声明了say()方法,并未实现,而say()方法是由Test3实现的,追究say()实现自哪,没有意义。
2.编译后的常量池中存在两个int型常量5(这是A的x),4(这是B的x),所以只要你指明调用哪个常量就没问题,例 System.out.println(A.x);
你没指明是哪个,肯定报错喽。




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