一日十题
Ⅰ.“hello” instanceof Object 的返回值是(B)。
A.”abcd"
B.true
C.false
D.String
解析:
instanceof是Java语言种的一个二元运算符,它的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例,即它左边的对象是否是它右边的类的实例,返回boolean类型的数据。
常见的用法如下:result=object instanceof class,如果object是class的一个实例,那么instanceof运算符返回true;如果Object不是指定类的一个实例,或者object是null,那么此时返回false。
在Java语言种,所有类都是Object的子类,由于”hello“是字符串类型(String),String是Object的子类,由于”hello"instanceof Object的返回值为true。
Ⅱ.下面有关方法覆盖的描述正确的是(B)。
A.覆盖的方法一定不能是private的
B.要求覆盖和被覆盖的方法必须具有相同的访问权限
C.覆盖的方法不能比被覆盖的方法抛出更多的异常
D.要求覆盖和被覆盖的方法有相同的名字、参数列以及返回值
解析:
覆盖(Override)是指派生类方法覆盖基类方法,覆盖一个方法并对其重写,以起到不同的作用。在使用覆盖时需要注意以下几点:
1)派生类中的覆盖方法必须要和基类中被覆盖方法有相同的函数名和参数。
2)派生类中的覆盖方法的返回值必须和基类中被覆盖的方法的返回值相同。
3)基类中被覆盖的方法不能为private,否则其子类只是定义了另外一个方法,并没有对其进行覆盖。
4)子类方法不能缩小父类方法的访问权限。
5)子类方法不能抛出比父类更多的异常。
Ⅲ.下面说法正确的是(A)。
A.如果源代码中有package语句,则该语句必须被放在代码的第一行。
B.如果源代码中有main()方法,则该方法必须被放在代码的第一行。
C.如果源代码中有import语句,则该方法必须被放在代码的第一行。
D.如果某文件中的源代码中定义了一个public的接口,则接口名和文件名可以不同。
解析:
package是Java语言所特有的内容,它的作用就是把若干类按包结构进行分类管理,最重要的用途是为了解决同名但作用不同的类同时存在的问题。
improt语句允许开发人员在编译时将其他类的源代码包含到源文件中,具体而言,import语句包括import关键字、以点(.)分隔的包路径、类名或星号(*)。需要注意的是,每条import语句只可以对应一个包。
在Java语言中,package语句必须作为Java源文件的第一条语句,指名该文件中定义的类所在的包。所以,如果代码中有package语句,则必须放在最前面,即该语句必须放在代码的第一行。
被public修饰的类名或者接口名必须与文件名相同。
Ⅳ.接口能否继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?
解析:
接口可以继承接口,抽象类可以实现接口,而抽象类可以继承实体类。
Ⅴ.Java语言提供了两种实现多态的机制,它们分别是(重载)和(覆盖)
解析:
多态是面向对象程序设计中代码重用的一个重要机制,它表示当同一操作作用在不同的对象时,会有不同的语义,从而会产生不同的结构。在Java语言中,多态主要有以下两种表现方式:
(1) 重载(Overload)
重载是指同一个类中有多个同名的方法,但这些方法却有着不同的参数,因此,在编译的时候就可以确定到底调用的哪个方法,它是一种编译时多态。重载可以被看作一个类中的方法多态性。
(2)覆盖(Override)
子类可以覆盖父类的方法,因此,同样的方法会在子类和父类中有着不同的表现形式。在Java语言中,基类的引用变量不仅可以指向其子类的实例对象。同样,接口的引用变量也可以指向其实现类的实例对象,也可以指向其子类的实例对象。同样,接口的引用变量也可以指向其实现类的实例对象。而程序调用的方法在运行期才动态绑定(绑定指的是将一个方法调用和一个方法主题连接到一起),就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量类型中定义的方法。通过这种动态绑定的方法实现了多态。由于只有在运行时才能确定调用的是哪个方法,因此,通过方法覆盖实现的多态也可以被称为运行时多态。
Ⅵ.面向对象的特征都有哪些?
解析:
面向对象的主要特征有抽象、继承、封装和多态。以下将分别对这几种特性进行介绍:
1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关地方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用关注细节。抽象包括两个方面的内容,一是过程抽象,而是数据抽象。
2)继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从他的基类那里及继承方法和实例变量,并且子类可以修改或增加新的方法使之更适合特殊的需求。
3)封装:封装是指将客观事物抽象成类,每个类对自身的数据和方法实行保护。类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
4)多态:多态是指允许不同类的对象对同一消息做出响应。多态包括参数化多态和包含多态。多态性语言具有灵活,抽象,行为共享和代码共享的优势,很好地解决了应用程序方法同名的问题。
Ⅶ.final,finally,finalize的区别是什么?
解析:
final,finally,finalize的区别如下:
1)final用于声明属性,方法和类,分别表示属性不可变、方法不可覆盖、类不可被继承。
final属性:被final修饰的变量不可变,由于不可变有两重含义,一是引用不可变,二是对象不可变。final指的引用的不可变性,即它只能指向初始化时指向的那个对象,从而不关心指向对象内容的变化。所以,被final修饰的变量必须被初始化。一般可以通过以下几种方式对其进行初始化:
①在定义的时候初始化。
②final成员变量可以在初始化块中初始化,但不可在静态初始块中初始化
③静态final成员变量可以在静态初始化模块中初始化
④在类的构造器中初始化,但静态final成员变量不可以在构造方法中初始化
final方法:当一个方法声明为final时,该方法不允许任何子类重写这个方法,但子类仍然可以使用这个方法。另外还有一种被称为 inline(内联)的机制,当调用一个被声明为final的方法时,直接将方法主体插入到调用处,而不是进行方法调用,这样做能够直接提高程序的效率。
final参数:用来表示这个参数在这个方法内部不允许被修改。
final类:当一个类被声明为final时,此类不能被继承,所有方法都不能被重写。但这并不表示final类的成员变量也是不可改变的,要想做到final类的成员变量不可改变,必须给成员变量增加final修饰。值得注意的是,一个类不能既被声明为abstract,又被声明为final。
2)finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带着一个语句块,表示这段语句最终一定被执行,经常是被用在需要释放资源的情况下。
3)finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的finalize()方法,可以覆盖此类方法来实现对其他资源的回收,例如关闭文件等。需要注意的是,一旦垃圾回收器准备好释放对象占用的空间,将首先调用器finalize()方法,并且在下一次垃圾回收动作发生的时候,才会真正回收对象占用的内存。
Ⅷ.ArrayList、Vector、LinkedList有什么特点?HashMap和HashTable有什么区别?
解析:
Java为数据结构中的映射定义了一个接口 java.util.Map,它有三个实现类:HashMap、Hashtable和TreeMap。Map是用来存储键值对的数据结构,在数组中通过下标来对其内容进行索引,而在Map中,则是通过对象进行索引,用来索引的对象叫做key,其对应的对象叫做value。
HashMap是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。由于HashMap与Hashtable都采用了Hash方法进行索引,因此,二者具有许多相似之处,它们主要有如下的一些区别。
1)HashMap是Hashtable的轻量级实现(非线程安全的实现),它们都实现了Map接口,主要区别在于HashMap允许空(null)键值(key)(但是需要注意,HashMap最多只允许一条记录的键为null,不允许多条记录的值为null),而Hashtable不允许(null)键值(key)。
2)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法很容易引起误解。Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
3)Hashtable的方法是线程安全的,而HashMap由于不支持线程的同步,所以,他不是线程安全的。在多个线程访问Hashtable时,不需要开发人员对它进行同步,而对于HashMap,开发人员必须提供额外的同步机制。所以,效率上HashMap可能高于Hashtable.
4)Hashtable使用Enumeration进行遍历,HashMap使用Iterator进行遍历。
5)Hashtable和HashMap采用的hash/rehash算法都几乎一样,所以,性能不会有很大的差异。
6)Hashtable中数组默认大小为11,增加的方式是 old*2+1。在HashMap中,Hash数组的默认大小是16,而且一定是2的指数。
7)Hash值的使用不同,Hashtable直接使用对象的HashCode。
以上三种类型中,使用最多的是HashMap。HashMap里面存入的键值对在取出的时候没有固定的顺序,是随机的。一般而言,在Map中插入、删除和定位元素,HashMap是最好的选择。由于TreeMap实现了SortMap接口,能够把它保存的记录根据键排序,所以,取出来的是排序后的键值对,如果需要按照自然顺序或者自定义顺序遍历键,那么TreeMap会是更好的选择。LinkedHashMap是HashMap的一个子类,如果需要输出的顺序和输入的顺序相同,那么可以用LinkedHashMap实现,它还可以按读取顺序来排列。
Ⅹ.排序有几种排法,请实现其中的一种排序方法。
解析:
常见的排序方法有选择排序,插入排序,冒泡排序,归并排序、快速排序、希尔排序和堆排序等。
下面重点实现一下插入排序。对于给定的一组记录。初始时假设第一个记录自成一个有序序列,其余的记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直至最后一个记录插入到有序序列中为止。以数组{38,65,97,76,13,27,49}为例,直接插入排序具体步骤如下所示:
第一步插入38以后,序列为:[38] 65 97 76 13 27 49
第二步插入65以后,序列为:[38 65] 97 76 13 27 49
第三步插入97以后,序列为:[38 65 97] 76 13 27 49
第四步插入76以后,序列为:[38 65 97 76 ] 13 27 49
第五步插入13以后,序列为: [38 65 97 76 13 ] 27 49
第六步插入27以后,序列为:[38 65 97 76 13 27 ]49
第七步插入49以后,序列为:[38 65 97 76 13 27 49]
程序实例如下:
程序的运行结果为: