清醒时做事,迷茫时读书,独处时思考,烦躁时运动,得意时淡然,失意时坦然,忙碌时专注,闲暇时蓄力。 |
---|
题目:
① 关键字( )表明一个对象或变量的引用在初始化后不能被修改。
A、private
B、final
C、static
D、没有这种关键字
② 关于抽象类叙述正确的是? ( )
A、抽象类不能实现接口
B、抽象类必须有“abstract class”修饰
C、抽象类必须包含抽象方法
D、抽象类也有类的特性,可以被实例化
③ 执行完以下代码 int [ ] x = new int[10] ;后,以下哪项说明是正确的( )
A、x[9]为0
B、x[9]未定义
C、x[10]为0
D、x[0]为空
④ 如果一个接口Cow有个public方法drink(),有个类Calf实现接口Cow,则在类Calf中正确的是? ( )
A、void drink() { …}
B、protected void drink() { …}
C、public void drink() { …}
D、以上语句都可以用在类Calf中
⑤ 有一个源代码,只包含import java.util.* ; 这一个import语句,下面叙述正确的是? ( )
A、只能写在源代码的第一句
B、可以访问java/util目录下及其子目录下的所有类
C、能访问java/util目录下的所有类,不能访问java/util子目录下的所有类
D、编译错误
⑥ 当我们需要所有线程都执行到某一处,才进行后面的的代码执行我们可以使用?
A、CountDownLatch
B、CyclicBarrier
C、Semaphore
D、Future
⑦ 关于java编译和运行命令叙述不正确的是? ( )
A、运行“java Scut.class”
B、运行“java Scut”
C、编译 Scut.java文件,使用“javac Scut.java”命令的输出文件是Scut.class
D、java这个命令的运行对象是Scut.class
⑧ String s = new String(“xyz”);创建了几个StringObject?
A、两个或一个都有可能
B、两个
C、一个
D、三个
⑨ 在Java中,关于HashMap类的描述,以下正确的是 ()
A、HashMap使用键/值得形式保存数据
B、HashMap 能够保证其中元素的顺序
C、HashMap允许将null用作键
D、HashMap允许将null用作值
⑩ Java 7 特性中,abstract class和interface有什么区别。
A、抽象类可以有构造方法,接口中不能有构造方法
B、抽象类中可以有普通成员变量,接口中没有普通成员变量
C、抽象类中不可以包含静态方法,接口中可以包含静态方法
D、一个类可以实现多个接口,但只能继承一个抽象类。
解析:
① B
使用final修饰的变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改。如果是引用类型的变量,则在对其初始化之后不能指向一个另一个对象。即 引用变量不可变,引用变量指向的对象的内容可变。
② B
*jdk1.8之前*
*接口*
1.多实现
2.变量类型默认且只能为 public static final
3.函数(方法) 类型默认且只能为public,只能有public类型的静态成员函数
4.非静态成员函数没有方法体,静态成员函数有方法体
5.子类必须实现所有接口函数
6.可以有main方法;可以new一个接口,需要在方法体中实现所有接口函数
7.没有构造器
*抽象类*
1.单继承
2.变量类型不限(静态变量+非静态变量)
3.函数类型不限(静态函数+非静态函数)
4.非静态函数包含没有方法体的抽象函数. 有方法体的普通函数
5.子类可以不覆写父类的抽象方法,但子类也要申明为抽象类;子类可以选择覆写父类的非抽象方法
6.可以有main方法;不可以new一个抽象类
7.可以有构造器
*Jdk1.8*
*接口中可以有default类型的方法,实现类可以选择实现该方法*
****意义:****默认方法的主要优势是提供一种拓展接口的方法,而不破坏现有代码。另一个优势为该方法是可选的,子类可以根据不同的需求Override或默认实现。
③ A
基本类型数组:
byte[]、short[]、int[]、long[] 默认值为0;
char[] 默认值为 \u0000;
boolean[]默认值为 false;
float[] 、double[] 默认值为 0.0;
对象类型数组:
默认值为 null
④ C
子类重写父类方法时,子类方法的访问权限不能小于父类方法的访问权限。在接口中,方法的默认权限就是 public,所以子类重写后只能是 public
⑤ C
导入java.util.*不能读取其子目录的类,因为如果java.util里面有个a类,java.util.regex里面也有个a类,我们若是要调用a类的方法或属性时,应该使用哪个a类呢。
⑥ B
链接:https://www.nowcoder.com/questionTerminal/c39e3eb52191404789349ec5b21476cf
来源:牛客网在csdn看到的countDownLatch和cyclicBarrier的形象比喻,就是在百米赛跑的比赛中若使用 countDownLatch的话冲过终点线一个人就给评委发送一个人的成绩,10个人比赛发送10次,如果用CyclicBarrier,则只在最后一个人冲过终点线的时候发送所有人的数据,仅仅发送一次,这就是区别。
⑦ A
Java程序运行机制步骤
首先利用IDE集成开发工具编写Java源代码,源文件的后缀为.java;
再利用编译器(javac命令)将源代码编译成字节码文件,字节码文件的后缀名 为.class;运行字节码的工作是由解释器(java命令)来完成的。
javac xx.java 编译
java xx 运行
⑧ A
用new关键字创建字符串对象时,JVM会先检查字符串常量池中时候有存在的对应字符串,如果已经存在,则不会在字符串常量池中创建,如果没有存在,那么就会在字符串常量池中创建一个字符串对象,然后还会去堆内存中创建一份字符串对象,把常量池中的对象内容拷贝到内存中的字符串对象,然后返回堆内存中的字符串对象内存地址。综上所述,选项A正确。
⑨ ACD
Map集合类 key value HashMap 允许为null 允许为null TreeMap 不允许为null 允许为null ConcurrentMap 不允许为null 不允许为null HashTable 不允许为null 不允许为null
⑩ ABD
含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
\4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
\5. 抽象类中可以包含静态方法,接口中不能包含静态方法
\6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
\7. 一个类可以实现多个接口,但只能继承一个抽象类。
下面接着再说说两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:
package com.lei; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public abstract class BaseServlet extends HttpServlet { /** * serialVersionUID属性概述 * */ private static final long serialVersionUID = 1L; public final void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // 记录访问日志 // 进行权限判断 if (true)// if条件里写的是“具有权限” { try { doService(request, response); } catch (IOException e) { // 记录异常信息 } } } protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException; }
实现类如下:
package com.lei; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends BaseServlet{ /** * serialVersionUID属性概述 * */ private static final long serialVersionUID = 1L; @Override protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // TODO Auto-generated method stub } }
父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。
备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。
比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。