Java接口和实现期末复习题

1. (单选题)

将下列(A、B、C、D)哪个代码替换下列程序中的【代码】不会导致编译错误?

interface Com {

  int M = 200;

  int f();

}

class ImpCom implements Com {

  【代码】

}

  • A. public int f(){return 100+M;}
  • B.  int f(){return 100;}
  • C. public double f(){return 2.6;}
  • D. public abstract int f();

正确答案:A   因为接口中定义的方法默认是 public abstract 类型的,而实现类中需要使用 public 访问修饰符来覆盖(实现)接口中的方法。选项 A 中的方法签名与接口中定义的方法 f() 一致,包括返回类型和参数列表,因此可以正确重写。

2. (单选题)

挑错题(ABCD注释标注的哪行代码有错误?)

 public interface Com {     

     abstract void cry();       //A    

      public int x = 0;          //B      

      static int y = 0;          //C } 

    abstract class Cat implements Com {    

         abstract void cry();       //D 

   } 

}

  • A. A
  • B. B
  • C. C
  • D. D

正确答案:D  因为抽象类继承一个接口,至少重写接口中的一个抽象方法,非抽象类继承一个接口,需要重写接口中的全部方法。

3. (单选题)

挑错题(ABCD注释标注的哪行代码有错误?)

interface Com {

   int MAX = 100;  //A

   void f();

}

abstract class Animal implements Com {

   int MIN ;      //B

}

class Dog extends Animal{

   public void f() {

        MIN = 10;     //C

      MAX = 200;    //D

   }  

}

  • A. A
  • B. B
  • C. C
  • D. D

正确答案:D  接口中的字段默认是 public static final,即常量,一旦赋值就不能再改变。因此,接口中的字段 MAX 赋值为 100 后不能再修改。

4. (多选题)

下列接口中标注的(1、2、3、4)中,哪两个是错误的? 

 interface Takecare {    

       protected void speakHello();       //1    

       public abstract static void cry();  //2   

       int f();                            //3    

       abstract float g();                //4 

}

  • A. 1
  • B. 2
  • C. 3
  • D. 4

正确答案: AB   在接口中的方法默认是 public abstract,因此不可以使用 protected 和 static 修饰符。此外,abstract和static不可以同时修饰一个方法,因此,接口中的方法应该是:

  1. protected void speakHello();
  2. public abstract void cry();

5. (判断题)
接口中也能声明变量。

  • A. 对
  • B. 错

正确答案:错   

  1. 声明变量:声明变量是指告诉编译器变量的名称和类型,但并不分配内存空间。在声明变量时,编译器只是知道这个变量的存在,但并不会为其分配内存空间。例如:

    int x;
    String name;
    
  2. 定义变量:定义变量是指在声明变量的基础上,为变量分配具体的内存空间,并可能为变量赋初值。定义变量意味着变量的创建过程,编译器为变量分配了内存空间,从而可以在程序中使用这个变量。例如:

    int x = 10;
    String name = "Alice";

 注意在接口中可以定义变量,不能声明变量,并且变量的类型为public static final

6. (判断题)

Java8之后,接口中也能定义非抽象的不加default修饰的方法。

  • A. 对
  • B. 错

正确答案:错 

8. (判断题)
Java9之后,接口中可以定义private方法。

  • A. 对
  • B. 错

正确答案:对

9. (判断题)
接口中的常量可以不指定初值。

  • A. 对
  • B. 错

正确答案: 错

10. (判断题)

可以在接口中只声明常量,不定义任何方法。

  • A. 对
  • B. 错

正确答案:对

11. (填空题)

请说出下面程序中【代码1】和【代码2】的输出结果。

interface A { 
  double f(double x,double y);  
}

class B implements A { 
 public double f(double x,double y) { 
     return x*y;  
    }  
int g(int a,int b) {    return a+b; 
 } 
} 
public class Main { 
public static void main(String args[]) {  
  A a = new B();   
  System.out.println(a.f(3,5)); //【代码1】   
  B b = (B)a;    
  System.out.println(b.g(3,5)); //【代码2】 
 } 
}

正确答案: 15.0,8     

在给定的程序中,首先创建了一个接口 A,其中包含一个抽象方法 f,然后创建了一个类 B,该类实现了接口 A,并且还定义了一个额外的方法 g

在 Main 类的 main 方法中,首先创建了一个 B 类的实例 a,并通过接口 A 的引用进行引用。然后分别调用了 a.f(3, 5) 和 (B)a.g(3, 5)

  1. 在【代码1】中,调用 a.f(3, 5),实际调用的是类 B 中实现的 f 方法,即 return x*y;,将参数 x 和 y 相乘得到结果 15.0

  2. 在【代码2】中,将 a 强制转换为类 B 的实例 b,然后调用 b.g(3, 5),由于 g 方法不是接口 A 中定义的方法,所以无法通过接口引用调用,需要先将对象转换为 B 类型后再调用。调用 g 方法返回值为 a+b,即 3+5,结果为 8

将类 B 的实例赋值给接口 A 的引用是利用接口的多态性的一种表现。这种做法实际上是将一个子类的实例赋值给它的父接口的引用,从而实现对该子类实例的统一管理和操作。

通过将类 B 的实例赋值给接口 A 的引用,我们可以使用接口 A 中定义的方法来操作类 B 的实例,这种做法使得程序具备更大的灵活性和扩展性。同时,这样的设计也符合面向接口编程的思想,降低了代码的耦合度,使得程序更容易维护和扩展。

12. (填空题)

请说出下面程序中【代码1】和【代码2】的输出结果。

interface Com {
  int add(int a,int b);
}
abstract class A {
  abstract int add(int a,int b);
}
class B extends A implements Com{
  public int add(int a,int b) {
   return a+b;
  }
}
public class Main{
public static void main(String args[]) {
   B b = new B();
   Com com = b;
   System.out.println(com.add(12,6)); //【代码1】
   A a = b;
   System.out.println(a.add(10,5));  //【代码2】
 }
}

正确答案:18,15

  • 接口引用 Com com = b;

    • com 是接口 Com 的引用,指向了对象 b,即 B 类的一个实例。
    • 调用 com.add(12, 6) 实际上调用的是 B 类中实现的 add 方法,计算结果为 12 + 6 = 18
  • 抽象类引用 A a = b;

    • a 是抽象类 A 的引用,同样指向了对象 b
    • 调用 a.add(10, 5) 也是调用 B 类中的 add 方法,计算结果为 10 + 5 = 15

 在Java中,当一个类实现了一个接口或者继承了一个抽象类时,可以通过接口或抽象类的引用来引用该类的对象,并调用相应的方法。这种机制允许我们在不需要知道具体对象类型的情况下,通过统一的接口或抽象类引用来操作对象。

接口引用和抽象类引用的作用

  1. 接口引用

    • 当一个类实现了某个接口,可以使用该接口的引用来引用这个类的对象。
    • 接口引用只能调用接口中定义的方法或者静态方法,并且默认方法可以通过对象实现。
  2. 抽象类引用

    • 当一个类继承了某个抽象类,可以使用抽象类的引用来引用这个类的对象。
    • 抽象类引用可以调用抽象类中定义的方法,包括抽象方法和非抽象方法。

13. (填空题)

请说出下面中【代码】的输出结果

interface Com {
  int add(int a,int b);
  public static int get(int n){  
    return n;
  }
  public default int see(int n){
    return n;
  }
  public default int look(int n){
    return n;
  }
}
class A implements Com{  
  public int add(int a,int b) {
    return a+b;
  }
  public int see(int n){ 
    return n+1;
  }
}
public class Main {
  public static void main(String args[]) {
     A a = new A();
     int m = a.add(12,6);
     int n =Com.get(12);
     int t = a.see(6);
     int q = a.look(6);
     System.out.printf("%d:%d:%d:%d",m,n,t,q);  //【代码】
  }
}

正确答案:18:12:7:6  复习完基础知识相信这题目不是问题

基础知识复习:

1、default关键字

在Java中,default关键字用于定义接口的默认方法。默认方法是在接口中提供了方法的默认实现,这样在实现该接口的类中,如果没有重写该默认方法,就会直接继承接口中的默认实现。默认方法允许接口的演化,可以向现有接口添加新的方法,而不会影响现有的实现类。这对于接口的演化非常重要。假设你有一个接口,并且已经有多个类实现了这个接口。现在你需要在接口中添加一个新方法,但你又不想修改所有已有的实现类。使用默认方法,你可以在接口中添加新方法而不破坏现有的代码,因为已有的实现类可以选择是否实现新的默认方法,而不会强制性地要求它们这样做

在给定的例子中,接口 Com 中的 see 和 look 方法就是默认方法。这意味着,实现 Com 接口的任何类如果没有提供这些方法的具体实现,就会直接继承接口中定义的默认实现。

2、接口中的静态方法

Java 8及以后的版本允许接口中定义静态方法。静态方法在接口中的作用类似于普通类中的静态方法,可以通过接口名直接调用,而不需要实例化接口的实现类。静态方法在接口中提供了一种公共的、可共享的行为,与默认方法一样,它们也可以在接口的演化过程中添加而不会影响现有的实现类。

  • 37
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cristiano永远是goat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值