首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

接口在实际语言,如Delphi、Java、C++等中,都有广义和狭义之分,这很重要,以前就是因为没明白接口的广义和狭义之分,始终没能真正理解接口的真正意义。

广义接口从一般意义上说,凡是一个类提供给外部使用的部分都可以被称为接口。但是在引入继承和抽象类之前,这个广义接口并没有太大意义。广义接口的真正意义是在类的继承中体现多态的功能,这种接口又被称为抽象类接口。

狭义接口是指特定的函数集合,一般是用interface(Delphi)声明的,它表示一个方法集合,这个集合被称为一个命名接口。一个命名接口中的方法必须在一个类中实现后才能被使用,一个类继承实现一个接口,称为这个类实现了该接口,一个接口可以被多个类实现,一个类也可以继承多个接口,这样就形成了一种灵活的接口调用方式,从而实现更加灵活和节省资源的多态。

从上述认识来看,接口实际上是结合着多态而来的,它的最大的任务就是实现多态。而多态又是面向对象最精华的理论,掌握了多态,也就掌握了面向对象的精髓。但掌握多态必须先理解和掌握接口,只有充分理解接口的意义,才能更好地应用多态。

在面试过程中,各大企业会考量你对虚函数、纯虚函数、私有继承、多重继承等知识点的掌握程度。因此,这是本书比较难掌握的一章。

12.1  基础知识

面试例题1:下面哪一项说法是正确的?

A.在一个子类中一个方法不是public的就不能被重载

B.覆盖一个方法只需要满足相同的方法名和参数类型就可以了

C.覆盖一个方法必须需要相同的方法名参数和返回类型

D.一个覆盖的方法必须有相同的方法名、参数名和参数类型

解析:

对于在同一可访问区内被声明的几个具有不同参数列(参数的类型、个数、顺序不同)的同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制叫重载,重载不关心函数的返回值类型。覆盖是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖函数版本,这种机制就叫做覆盖。

成员函数被重载的特征如下。

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual关键字可有可无。

覆盖的特征如下。

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual关键字。

答案:C

面试例题2:下面的说法中哪项是正确的?

A.静态方法不能被覆盖成非静态的方法

B.静态方法不能被声明成私有的

C.私有的方法不能被重载

D.一个重载的方法在基类中不通过检查不能抛异常

解析:JDK 1.1版本会发布这样一个提示信息:静态的方法不能被覆盖。选项 B和C的说法并不合理,没有合理的理由来说静态的方法不能被声明成私有的,或私有的方法不能被重载。选项D是对于一个覆盖方法异常限制的混杂版本来说的。

答案:A

面试例题3:给定下面的代码。

class Base {}

class Agg extends Base{

        public String getFields(){

         String name =  "Agg";

        return name;

        }

}

public class Avf{

public static void main(String argv[]){

        Base a = new Agg();

        //Here

        }

}

What code placed after the comment //Here will result in calling the getFields method resulting in the output of the string "Agg"?(下面哪个选项的代码替换到//Here,会调用getFields方法使输出结果输出字符串“Agg”?)

A.System.out.println(a.getFields());

B.System.out.println(a.name);

C.System.out.println((Base) a.getFields());

D.System.out.println( ((Agg) a).getFields());

解析:Base类型要引用Agg类的实例需要把Base类显示转换为Agg类,然后调用Agg类中的getFields()方法。如果a是Base类的一个实例的话,它要调用getFields()方法,那此方法在Base类中是不存在的,必须把a转换为Agg类的一个实例,这样才可以调用它里面的方法。

答案:D

面试例题4:如果在下列代码中的Here处添加一段代码,问哪一个选项不能通过编译[Trend公司2005年10月面试题]

public class Upton{

public static void main(String argv[]){    

        }

        public void amethod(int i){}

        //Here

       

}

A.public int amethod(int z){}

B.public int amethod(int i,int j){return 99;}

C.protected void amethod(long l){}

D.private void anothermethod(){}

解析:选项A不能通过编译。一个方法是显式地返回一个int值的方法,另一个是在同一个类中上述方法的一个重定义。方法中参数从i换做z对一个方法并没有任何影响。一个方法不能在同一个类中被覆盖。

答案:A

面试例题5:下面代码的输出结果是多少?[Trend公司2005年10月面试题]

class A {

    public static void prt() {

        System.out.println("1");

    }

    public A() {

        System.out.println("A");

    }

}

public class B extends A {

    public static void prt() {

        System.out.println("2");

    }

    public B() {

        System.out.println("B");

    }

    public static void main(String[] args) {

        A a = new B();

        a = new A();

    }

}

解析:每新建一个对象,都会产生一个构造函数,因为产生构造函数的顺序是A,B,A,所以结果是A,B,A。

答案:A,B,A

面试例题6:下面代码的输出结果是多少?[Trend公司2005年10月面试题]

class Parent {

protected String value = "123";

public String getValue() {

      return value;

}

}

public class Child extends Parent {

protected String value = "456";

}

解析:父类里的东西也可以理解成你自己的东西。也就是说在程序里面有两个value,一个是123,另一个是456。而现在要输出的是父类里面的那个value,所以就是123。原因是在输出语句中使用的是getValue()方法,而这个方法就是父类里面的方法。它的返回值是父类里面定义的value,从父类继承来的没有被子类覆盖的方法操作的是继承于父类的被隐藏的变量,也就是123。

答案:123

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论