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不可以同时修饰一个方法,因此,接口中的方法应该是:
protected void speakHello();
public abstract void cry();
5. (判断题)
接口中也能声明变量。
- A. 对
- B. 错
正确答案:错
- 声明变量:声明变量是指告诉编译器变量的名称和类型,但并不分配内存空间。在声明变量时,编译器只是知道这个变量的存在,但并不会为其分配内存空间。例如:
int x;
String name;
- 定义变量:定义变量是指在声明变量的基础上,为变量分配具体的内存空间,并可能为变量赋初值。定义变量意味着变量的创建过程,编译器为变量分配了内存空间,从而可以在程序中使用这个变量。例如:
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】中,调用
a.f(3, 5)
,实际调用的是类B
中实现的f
方法,即return x*y;
,将参数x
和y
相乘得到结果15.0
。 - 在【代码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中,当一个类实现了一个接口或者继承了一个抽象类时,可以通过接口或抽象类的引用来引用该类的对象,并调用相应的方法。这种机制允许我们在不需要知道具体对象类型的情况下,通过统一的接口或抽象类引用来操作对象。
接口引用和抽象类引用的作用
- 接口引用:
- 当一个类实现了某个接口,可以使用该接口的引用来引用这个类的对象。
- 接口引用只能调用接口中定义的方法或者静态方法,并且默认方法可以通过对象实现。
- 抽象类引用:
- 当一个类继承了某个抽象类,可以使用抽象类的引用来引用这个类的对象。
- 抽象类引用可以调用抽象类中定义的方法,包括抽象方法和非抽象方法。
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及以后的版本允许接口中定义静态方法。静态方法在接口中的作用类似于普通类中的静态方法,可以通过接口名直接调用,而不需要实例化接口的实现类。静态方法在接口中提供了一种公共的、可共享的行为,与默认方法一样,它们也可以在接口的演化过程中添加而不会影响现有的实现类。