跳转至

4 继承与接口

4.1 继承概念

下列关于继承的哪项叙述是正确的?

A. 在java中允许多重继承

B. 在java中一个类只能实现一个接口

C. 在java中一个类不能同时继承一个类和实现一个接口

D. java的单一继承使代码更可靠

解决方案

D


给出下面代码:

     1)  class  Parent  {  
     2)     private  String  name;  
     3)     public  Parent(){}  
     4)  }  
     5)  public  class  Child  extends  Parent  {  
     6)     private  String  department;  
     7)     public  Child()  {}  
     8)     public  String  getValue() {  return  name;  }  
     9)     public  static  void  main (String  arg[])  {  
    10)         Parent  p  =  new  Parent();  
    11)     }  
    12)  }  

哪些代码行将引起错误?

A. 第3行

B. 第6行

C. 第7行

D. 第8行

解决方案

D


设有下面两个类的定义:

class Person  {                
    class Student extends Person  
    {
        long id;          // 身份证号  
        int score;        // 入学总分
        String name;      // 姓名                                
        int getScore(){  return    score; }
    }
}       

类Person和类Student的关系是:

A. 包含关系

B. 继承关系(内部类继承了外部类)

C. 关联关系

D. 无关系,上述类定义有语法错误

解决方案

B


构造方法不能被继承。

A. 正确

B. 错误

解决方案

A


一个子类可以重新定义从父类那里继承来的同名方法,而且允许它们有不同的返回值类型。

A. 正确

B. 错误

解决方案

B


4.2 成员变量/方法

看下面一段程序:

class  Aclass{  
    void  go(){  
        System.out.println("Aclass");
    }  
}

public  class  Bclass  extends  Aclass{
    void go(){  
        System.out.println("Bclass");
    }  
    public  static  void  main(String  args[]){  
        Aclass  a=new  Aclass();  
        Aclass  a1=new  Bclass();  
        a.go();  
        a1.go();  
    }
}

以上程序运行结果是:

A.
Aclass 
Aclass

B.
Bclass 
Bclass

C.
Aclass 
Bclass

D.
Bclass 
Aclass

解决方案

C


在Java中,以下关于方法重载和方法重定义描述正确的是?

A. 方法重载和方法的重定义实现的功能相同

B. 方法重载出现在父子关系中,方法重定义是在同一类中

C. 方法重载的返回值类型必须一致,参数项必须不同

D. 方法重定义的返回值类型必须相同或相容。

解决方案

D


方法的覆盖是在子类中再次实现父类中已经实现过的方法。

A. 正确

B. 错误

解决方案

A


可以用final说明变量为一个常量。

A. 正确

B. 错误

解决方案

A


被final修饰符修饰的类,不能被继承。

A. 正确

B. 错误

解决方案

A


最终类不能派生子类,但最终方法可以被覆盖。

A. 正确

B. 错误

解决方案

B


4.3 super关键字

如果子类要初始化父类的类变量,调用super语句必须:

A. 放在子类构造方法第一条语句

B. 放在子类构造方法任何位置

C. 可以采用初始化列表方式执行

D. 可以调用this关键字

解决方案

A


this和super都可以在main()方法中使用

A. 正确

B. 错误

解决方案

B


4.4 上转型对象

考虑以下两个类:

public  class  UpByOne  {
    private  int  num  =  0;
    public  int  getNum  ()  {
        return  num;
    }
    public  void  setNum  (int  x)  {
        num  =  x;
    }
    public  void  up  () {
        num  =  num  +  1;
    }
}

class  UpByTwo  extends  UpByOne  {
    public  void  up  ()  {
        //  missing  code  goes  here
    }
}

在类UpByTwo中,重定义方法方法up(),使得num加2,以下哪段代码最合适填补省掉的代码?

A. num = num + 2;

B. super.up(); super.up();

C. setNum(getNum()) + 2;

D. super.up() + 1;

解决方案

B


假设类BaseWidget是类TypeAWidget的父类,并且在类TypeAWidget中重写了方法speak(),那么下列哪个程序片段能正确编译执行?

A. Object A=new BaseWidget(); A.speak();

B. BaseWidget B=new TypeAWidget(); B.speak();

C. TypeAWidget C=new BaseWidget();

D. speak();

解决方案

B


上转型对象可以调用子类中基类被覆盖的方法。

A. 正确

B. 错误

解决方案

A


上转型对象可以调用子类中新的方法。

A. 正确

B. 错误

解决方案

B


Java语言里的上转型对象也即是所谓的父类给子类对象赋值而已

A. 正确

B. 错误

解决方案

B


Java不允许上转型对象再重新给子类对象赋值。

A. 正确

B. 错误

解决方案

B


4.5 抽象类

编译及运行以下代码,下列选项哪个是正确的?

abstract  class  MineBase  {
    abstract  void  amethod();
    static  int  i;
}
public  class  Mine  extends  MineBase  {
    public  static  void  main(String  argv[]){
        int[]  ar=new  int[5];
        for(i=0;i  <  ar.length;i++)
        System.out.println(ar[i]);
    }
}

A. 程序正确,没有报错,并且输出包含5个0的序列

B. Error: ar is used before it is initialized

C. Error Mine must be declared abstract

D. IndexOutOfBoundes Error

解决方案

C


含有抽象方法的类必须声明为抽象类。

A. 正确

B. 错误

解决方案

A


抽象类可以用来定义对象,也可以被继承。

A. 正确

B. 错误

解决方案

B


一个抽象类中的所有方法都必须是抽象的。

A. 正确

B. 错误

解决方案

B


4.6 接口

interface可以被以下哪个修饰符修饰?

A. private

B. class

C. public

D. static

解决方案

C


关于接口的定义和实现,以下描述正确的是:

A. 接口定义的方法只有实现

B. 接口中的变量默认是public、final和static的

C. 如果一个接口由多个类来实现,则这些类在实现该接口中的方法时采用统一的代码

D. 如果一个类实现了接口,则必须实现该接口中的所有方法,但方法可不为public

解决方案

B


关于接口下面不正确的说法是:

A. 接口不支持多重继承

B. 接口所有方法是抽象的

C. 接口里的方法访问属性均为public

D. 实现接口的关键字是implements

解决方案

A


一个类只能继承单个父类,一个类只能实现一个接口。

A. 正确

B. 错误

解决方案

B


接口不能声明构造函数。

A. 正确

B. 错误

解决方案

A


4.7 接口回调

给定以下程序片段,结果为?

interface InterfaceA{
    String s="Hello";
    void f();
}
class ClassA implements InterfaceA{
    public void f(){
        System.out.print(s);
    }
}
class ClassB{
    void g(InterfaceA a){
        a.f();
    }
}
public class E {
    public static void main(String[] args) {
        ClassB b=new ClassB();
        b.g(new ClassA());
    }
}

A. Hello

B. 编译正确,但无运行结果

C. 编译错误:b.g(new ClassA())

D. 以上都不对

解决方案

A


给定如下程序,运行结果为:

interface B{
    void f();
}
class A implements B{
     public void f(){
         System.out.println("I love java!");
     }
     public static void main(String[] args) {
         B b=new A();
         b.f();
     }
}

A. 执行错误

B. I love java!

C. 编译错误

D. 以上都不对

解决方案

B


给出如下程序:

interface InterfaceA{
    String s="good ";
    void f();
}
abstract class ClassA{
    abstract void g();
}
class ClassB extends ClassA implements InterfaceA{
    void g(){
        System.out.print(s);
    }
    public void f(){
        System.out.print(" "+s);
    }
}
public class E {
    public static void main(String[] args) {
        ClassA a=new ClassB();
        InterfaceA b=new ClassB();
        a.g();
        b.f();
    }
}

其运行结果是?

A. 编译正确,但无运行结果

B. 编译错误:InterfaceA b=new ClassB();

C. good good

D. 以上都不对

解决方案

C

评论