1、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
abstract的method 不可以是static的 ,因为抽象的方法是要被子类实现的,而static与子类扯不上关系!
abstract的method 不可以是native的, native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用。例如,FileOutputSteam类要硬件打交道,底层的实现用的是操作系统相关的api实现,例如,在windows用c语言实现的,所以,查看jdk 的源代码,可以发现FileOutputStream的open方法的定义如下:
private native void open(String name) throws FileNotFoundException;
如果我们要用java调用别人写的c语言函数,我们是无法直接调用的,我们需要按照java的要求写一个c语言的函数,又我们的这个c语言函数去调用别人的c语言函数。由于我们的c语言函数是按java的要求来写的,我们这个c语言函数就可以与java对接上,java那边的对接方式就是定义出与我们这个c函数相对应的方法,java中对应的方法不需要写具体的代码,但需要在前面声明native。
abstract的method 不可以是synchronized的, 在我几年的学习和开发中,从来没见到过这种情况,并且我觉得synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchronized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么。
2、super.getClass()方法调用
下面程序的输出结果是多少?
- import java.util.Date;
- public class Test extends Date{
- public static void main(String[] args) {
- new Test().test();
- }
- public void test(){
- System.out.println(super.getClass().getName());
- }
- }
在test方法中,直接调用getClass().getName()方法,返回的是Test类名
由于getClass()在Object类中定义成了final,子类不能覆盖该方法, 所以,在
test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是Test。
如果想得到父类的名称,应该用如下代码:getClass().getSuperClass().getName();
3、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果:
- public class Test {
- public static void main(String[] args) {
- System.out.println(new Test().test());;
- }
- static int test()
- {
- int x = 1;
- try{
- return x;
- }
- finally{
- ++x;
- }
- }
- }
运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。
4、error和exception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。 比如说内存溢出。不可能指望程序能处理这样的情况。也就 说当发生error的时候,运行程序会被终止,虚拟机退出。我们没有任何办法(try-catch)使得程序重新回到正常轨道上。 比如下面的代码:
- public class Outer{
- public static void main(String[] args){
- try{
- int[] i=new int[1000000000];
- }catch(Exception e){
- System.out.println("aaa");
- }
- }
- }
运行结果:
Exception in thread "main" java.lang.OutOfMemoryError : Java heap space
at hr.test.Outer.main(Outer.java:7)
exception 表示一种设计或实现问题 。也就是说,它表示如果程序运行正常,从不会发生的情况。 不过是运行时异常(如ArrayIndexOutOfBoundsException)还是需检查异常(如FileNoFindException),都可以通过try-catch使得程序可以继续运行下去。
注意,运行时异常和需检查异常的唯一区别就是:前者无需再方法签名后声明异常类型,而后者必须声明。error和exception都继承了Throwable,因此都可以抛出。
异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。
Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。
java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try..catch处理或用throws声明,所以系统异常也称为unchecked异常。
运行时异常与一般异常有何区别??
Java提供了两类主要的异常:runtime exception和checked exception。
checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。
但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。
java运行时异常是可能在java虚拟机正常工作时抛出的异常。
出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。
抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。
运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。
常见的运行期异常:
IllegalStateException
IllegalArgumentException
ClassCastException(类转换异常)
IndexOutOfBoundsException(数组越界)
NullPointerException(空指针)
ArrayStoreException(数据存储异常,操作数组时类型不一致)
还有IO操作的BufferOverflowException异常
相关推荐
这份“Java基础笔试题加答案”资料,显然是为了帮助学习者检验或巩固他们在Java编程语言中的基本功。下面,我们将深入探讨Java的一些核心概念和知识点。 1. **Java简介**:Java是由Sun Microsystems(后被Oracle...
总结来说,Java基础笔试题涵盖了从基本语法到高级特性的广泛内容,包括类和对象、多线程、Web开发、数据库操作、XML解析、企业级开发、设计模式以及系统层面的知识。理解并熟练掌握这些知识点对于Java程序员来说至关...
这份“Java基础笔试题.doc.zip”压缩包文件包含了一份针对Java初学者或求职者的笔试题目集,旨在检验和提升他们的Java基础知识。让我们深入探讨一下这些题目可能涵盖的知识点。 1. **Java语法基础**:这包括变量...
Java基础笔试题Java基础笔试题
德州仪器(TI)2013校园招聘模拟基础笔试题,内容是笔试原题的拍照,仅供参考,对TI的笔试有很大的帮助。 --------------------------------------------------------------- ·2.资源使用方法说明 无 ---------...
Android基础笔试题,摘要必须大于100个字节!摘要必须大于100个字节!摘要必须大于100个字节!摘要必须大于100个字节!摘要必须大于100个字节!摘要必须大于100个字节!
"Java基础笔试题" 本文将对 Java 基础笔试题中的多个知识点进行详细的解释和分析。 1. Java 语言的特点:Java 是跨平台的编程语言,支持分布式计算和多线程,但不是面向过程的编程语言。 2. Java 语言的特点:...
java基础笔试题(答案已整理).pdf
网络工程招聘笔试题;题目是基础级别,但容易做错;参加笔试之前可以下载来看看;有几道题目答案错误,已在一篇博客中重新写出;
在网络工程领域中,网络工程师招聘基础笔试题通常会涉及到一系列技术和理论知识点,目的是为了考察应聘者在网络技术领域的基础知识水平。以下是一些根据给定文件内容提取的知识点: 1. IEEE标准 IEEE 802.3u是快速...
Java基础笔试题 本资源是一个Java基础笔试题集合,涵盖了Java语言的多个方面,包括运算符、变量、函数、数组、面向对象编程、继承、封装、多态等。以下是对每个问题的详细解释: 1. Java提供哪几种运算符? Java...
Java 基础知识笔试题及答案 Java 是一种广泛使用的编程语言,它具有强大的功能和灵活性。本资源汇总了 Java 基础知识笔试题及答案,涵盖了 Java 的基本概念、数据类型、运算符、控制结构、函数、数组、集合框架、...
java基础 java基础笔试题--基础很全有答案.zip
java基础 java基础笔试题--基础很全有答案.docx
java基础笔试题,适用于两年内工作经验者
JAVA基础笔试题用于考试样题,提高技术非常有用 妈妈再也不用担心我的考试成绩了
2023年WordecelPPT计算机基础笔试题汇总.pdf
2023年WordexcelPPT计算机基础笔试题汇总.pdf
2020年计算机文化基础笔试题含答案.pdf
2022年11新版Android编程基础笔试题及答案.docx