2021年09月01日 java
考点1:try-catch-finally执行流程
分析以下代码,说法正确的是()
1 | public static void main(String[] args) { |
- A 运行时报错
- B 程序正常运行,输出值为5
- C 程序正常运行,输出值为10
- D 程序正常运行,输出值为15
解析
显示答案/隐藏答案
正确答案: D第7行出现除零异常,然后执行catch块,最后执行finally块。
考点2:数据类型
若所用变量都已正确定义,以下选项中,非法的表达式是()
- A
a!= 4||b==1
- B
'a' % 3
- C
'a' = 1/3
- D
'A' + 32
解析
显示答案/隐藏答案
正确答案: C‘a’是个常数,不能赋值
考点3:自动类型提升
若有定义语句: int a=10 ; double b=3.14 ; 则表达式 ‘A’+a+b 值的类型是()
- A
char
- B
int
- C
double
- D
float
解析
显示答案/隐藏答案
正确答案: C类型自动提升
char < short < int < float < double
不同类型运算结果类型向右边靠齐。
类型大的与类型小的进行运算,强制转换为大类型
自动转换,精度小的自动转换为精度大的 因此统一转换为double类型。如果是要精度大的转化为精度小的 则需要进行强制类型转换
考点4:检查异常和非检查异常
下列哪种异常是检查型异常,需要在编写程序时声明?
- A
NullPointerException
- B
ClassCastException
- C
FileNotFoundException
- D
IndexOutOfBoundsException
解析
显示答案/隐藏答案
正确答案: Cjava中的异常通常分为编译时异常和运行异常。编译时异常需要我们手动的进行捕捉处理,也就是我们用try….catch块进行捕捉处理。
对于运行时异常只有在编译器在编译运行时才会出现,这些不需要我们手动进行处理。对于A、
B、 D来说都是运行时异常,因此答案为C
Java异常族谱
- 粉红色的是受检查的异常(checked exceptions),其必须被try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被捕捉处理,命名为 Checked Exception 是因为Java编译器要进行检查,Java虚拟机也要进行检查,以确保这个规则得到遵守.
- 绿色的异常是运行时异常(runtime exceptions),需要程序员自己分析代码决定是否捕获和处理,比如空指针,被0除…
- 而声明为Error的,则属于严重错误,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或者不可能捕捉,将导致应用程序中断,Error不需要捕捉。
Java异常
- 检查型异常(编译时异常 checked exceptions)
- 需要在编写程序时声明
- 需要我们手动的进行捕捉处理,也就是我们用try….catch块进行捕捉处理。或者在方法签名里通过throws子句声明
- Throwable、Exception、IOException、ClassNotFoundException、CloneNotSupportedException、EOFException、FileNotFoundException、MalformedURLException、UnknownHostException
- 运行异常(runtime exceptions)
- 只有在编译器在编译运行时才会出现,这些不需要我们手动进行处理
- 需要程序员自己分析代码决定是否捕获和处理,比如 空指针,被0除…
- RuntimeException、ArithmeticException、ClassCastException、IllegalArgumentException、IllegalStateException、IndexOutOfBoundsException、NoSuchElementException、NullPointerException
- Error
- 属于严重错误,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或者不可能捕捉,将导致应用程序中断,Error不需要捕捉。
1、Java 基本上除了 File、SQL 相关的异常外,都是运行时异常
考点5:Object方法
以下 _____ 不是 Object 类的方法
- A
clone()
- B
finalize()
- C
toString()
- D
hasNext()
解析
显示答案/隐藏答案
正确答案: D这种类型的题一般考察点有两个:
1.Object中没有hasNext() 方式,这个方法是迭代器中的
2.Object没有copy方法,但是有clone()方法, 用于创建并返回该对象的一个副本
hasNext一般为迭代器方法
hasNext() 一般是迭代器(Iterater)的方法,表示是否存在下一个元素,用next()方法取到下一个元素。
Object方法
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html
java.lang.Object方法 | 描述 |
---|---|
protected Object clone() |
Creates and returns a copy of this object. |
boolean equals(Object obj) |
Indicates whether some other object is “equal to” this one. |
protected void finalize() |
Deprecated. The finalization mechanism is inherently problematic. |
Class<?> getClass() |
Returns the runtime class of this Object. |
int hashCode() |
Returns a hash code value for the object. |
void notify() |
Wakes up a single thread that is waiting on this object’s monitor. |
void notifyAll() |
Wakes up all threads that are waiting on this object’s monitor. |
String toString() |
Returns a string representation of the object. |
void wait() |
Causes the current thread to wait until it is awakened, typically by being notified or interrupted. |
void wait(long timeoutMillis) |
Causes the current thread to wait until it is awakened, typically by being notified or interrupted, or until a certain amount of real time has elapsed. |
void wait(long timeoutMillis, int nanos) |
Causes the current thread to wait until it is awakened, typically by being notified or interrupted, or until a certain amount of real time has elapsed. |
考点6:值传递引用传递问题
指出下来程序运行的结果是
- A
good and abc
- B
good and gbc
- C
tst ok and abc
- D
tst ok and gbc
解析
显示答案/隐藏答案
正确答案: B值传递和引用传递
- 基本数据类型都是值传递
- 类,数组,接口是引用传递。 由于String对象本身的特殊性,导致它值传递的特征
考点7:abstract和final
关于抽象类与最终类,下列说法错误的是?
- A 抽象类能被继承,最终类只能被实例化。
- B 抽象类和最终类都可以被声明使用
- C 抽象类中可以没有抽象方法,最终类中可以没有最终方法
- D 抽象类和最终类被继承时,方法可以被子类覆盖
解析
显示答案/隐藏答案
正确答案: D最终类就是被final修饰的类,最终方法就是被final修饰的方法。最终类不能被继承,最终方法不能被重写。
1,抽象类中可以有抽象方法,也可以没有抽象方法。
2,抽象类当然可以被继承,因为它就是用来继承的,
3,继承抽象类,若有抽象方法,则子类必须将其抽象方法实现,
4,抽象类中的非抽象方法可以被重写。
最终类和抽象类正好相反
5,加上final的类就叫最终类,加上final的方法就叫最终方法,
6,最终类中可以有最终方法也可以没有
7,最终类不能有子类,最终方法不能被重写
抽象类和最终类的区别
1.抽象类可以被继承,并且触创建抽象类就是为了被继承,但是最终类只能实例化;
2.抽象类和最终类都可以被声明使用。
3.抽象类可以没有抽象方法,最终类中可以没有最终方法。
4.最终类不能被继承,子类继承非最终类时,子类可以继承该类的最终方法,但不能重写父类的最终方法。
5.抽象类是不能实例化的,实例化必将加载类,然后根本不知道抽象方法的方法体大小,所以不能实例化。
然后是抽象类和接口的区别
类中只要含有一个抽象方法,该类就是抽象类;抽象类中可以包含一个或多个抽象方法,也可以不含有抽象方法,直接在类声明时候加上abstract
,该类就是抽象类,但是这种情况没有意义。
Java7之前接口中的方法只有声明,没有实现,类似抽象方法,
接口方法默认public abstract修饰;
接口中的变量默认是public static final修饰的;
接口定义时候,如果不声明为public的接口,那么该接口只有包访问权限。
一个子类只能继承一个抽象类(虚类),但能实现多个接口;
一个抽象类可以有构造方法,接口没有构造方法;
一个抽象类中的方法不一定是抽象方法,即其中的方法可以有实现(有方法体),
接口中的方法都是抽象方法,不能有方法体,只有声明;
一个抽象类可以是public、private、protected、default,
接口只有public;
一个抽象类中的方法可以是public、private、protected、default
接口中的方法只能是public和default。
考点8:异常处理
对于Java中异常的描述正确的是( )
- A 用
throws
定义了方法可能抛出的异常,那么调用此方法时一定会抛出此异常。 - B 如果
try
块中没有抛出异常,finally
块中的语句将不会被执行。 - C 抛出异常意味着程序发生运行时错误,需要调试修改
- D
Java
中的可不检测(unchecked
)异常可能来自RuntimeException
类或其子类。
解析
显示答案/隐藏答案
正确答案: DA错 在调用此方法的时候 也可以再次申明以将异常交由更高一级处理。
B错 finally块中的语句一定会被执行。除非catch块中有System.exit(0)
。
C错 抛出异常不一定是运行时异常,也有可能是编译时异常。
D对 运行时异常的特点是Java编译器不会检查它。
Exception(异常)
是程序本身可以处理的异常。主要包含RuntimeException等运行时异常和IOException,SQLException等非运行时异常。
运行时异常
包括:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
编译器不会检查运行时异常
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
非运行时异常(编译异常)
包括:RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常
考点9:线程安全的集合
下面哪些具体实现类可以用于存储键,值对,并且方法调用提供了基本的多线程安全支持:()
- A
java.util.ConcurrentHashMap
- B
java.util.Map
- C
java.util.TreeMap
- D
java.util.SortMap
- E
java.util.Hashtable
- F
java.util.HashMap
解析
显示答案/隐藏答案
正确答案: AEHashtable线程安全
Hashtable的方法都是synchrnized修饰的,所以线程安全.
1 | ...... |
ConcurrentXxx线程安全
ConcurrentHashMap并发容器,JDK7采用分段锁,JDK8采用CAS算法,线程安全,建议使用,
https://blog.csdn.net/xuefeng0707/article/details/40834595
https://www.jianshu.com/p/863542dcbd5b
Connections.synchrnizedMap(map)非线程安全的Map包装成线程安全的Map
Connections工具类提供了一个方法synchrnizedMap可以把Map同步,本质就是给每一个方法加上synchrnized关键字进行同步
考点10:Servlet族谱
下面有关servlet的层级结构和常用的类,说法正确的有?
- A
GenericServlet
类:抽象类,定义一个通用的、独立于底层协议的Servlet
。 - B 大多数
Servlet
通过从GenericServlet
或HttpServlet
类进行扩展来实现 - C
ServletConfig
接口定义了在Servlet
初始化的过程中由Servlet
容器传递给Servlet
得配置信息对象 - D
HttpServletRequest
接口扩展ServletRequest
接口,为HTTP Servlet
提供HTTP
请求信息
解析
显示答案/隐藏答案
正确答案: ABCDGenericServlet抽象类
GenericServlet是个抽象类,必须给出子类才能实例化。它给出了设计servlet的一些骨架,定义了servlet生命周期,还有一些得到名字、配置、初始化参数的方法,其设计的是和应用层协议无关的,也就是说 你有可能用非http协议实现它。
HttpServlet
HttpServlet是GenericServlet的子类,当然就具有GenericServlet的一切特性,还添加了doGet, doPost, doDelete,doPut, doTrace等方法对应处理http协议里的命令的请求响应过程。
一般没有特殊需要,自己写的Servlet都扩展HttpServlet 。