CoreJava基础.docx
《CoreJava基础.docx》由会员分享,可在线阅读,更多相关《CoreJava基础.docx(28页珍藏版)》请在冰豆网上搜索。
![CoreJava基础.docx](https://file1.bdocx.com/fileroot1/2022-11/23/27996ef7-015e-448d-8e48-8bf3c6b2b780/27996ef7-015e-448d-8e48-8bf3c6b2b7801.gif)
CoreJava基础
1.访问修饰符“public/protected/缺省的/private修饰符”的使用类?
public:
公共,均可访问
private:
私有的,同一个java类中可以访问.子类不能访问.
protected:
同一个包中的类都可访问.子类可以访问.
缺省,friendly:
当前类,同一个包,都可以访问.
作用域当前类同一package子孙类其他package
public√√√√
protected√√√×
friendly√√××
private√×××
2.AnonymousInnerClass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
匿名内部类是没有名字的内部类,不能继承其它类,但一个内部类可以作为一个接口,由另一个内部类实现.
一、由于匿名内部类没有名字,所以它没有构造函数。
因为没有构造函数,所以它必须完全借用父类的构造函数来实例化,换言之:
匿名内部类完全把创建对象的任务交给了父类去完成。
二、在匿名内部类里创建新的方法没有太大意义,但它可以通过覆盖父类的方法达到神奇效果,如上例所示。
这是多态性的体现。
三、因为匿名内部类没有名字,所以无法进行向下的强制类型转换,持有对一个匿名内部类对象引用的变量类型一定是它的直接或间接父类类型。
new<类或接口><类的主体>
匿名类
匿名类是不能有名称的类,所以没办法引用它们。
必须在创建时,作为new语句的一部分来声明它们。
这就要采用另一种形式的new语句,如下所示:
new<类或接口><类的主体>
这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。
它还创建那个类的一个新实例,并把它作为语句的结果而返回。
要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。
如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。
如果匿名类实现了一个接口,它的主体必须实现接口的方法。
注意匿名类的声明是在编译时进行的,实例化在运行时进行。
这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。
从技术上说,匿名类可被视为非静态的内部类,所以它们具有和方法内部声明的非静态内部类一样的权限和限制。
如果要执行的任务需要一个对象,但却不值得创建全新的对象(原因可能是所需的类过于简单,或者是由于它只在一个方法内部使用),匿名类就显得非常有用。
匿名类尤其适合在Swing应用程序中快速创建事件处理程序。
3.shorts1=1;s1=s1+1;是否有错误?
shorts1=1;s1+=1;是否有错误?
前者s1+1返回一个int型,需要强制类型转换.
后者正确
4.Overload和Override的区别。
Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。
重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。
子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
Overloaded的方法是可以改变返回值的类型
5.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
是用==还是equals()?
它们有何区别
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。
equals()是判读两个Set是否相等equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值
6.举出你常见的运行时异常
ArithmeticException(异常的运算条件),
ArrayStoreException(向一个对象数组存放一错误类型的对象时)BufferOverflowException,BufferUnderflowException,CannotRedoException,CannotUndoException,ClassCastException,CMMException,ConcurrentModificationException,DOMException,EmptyStackException,IllegalArgumentException,IllegalMonitorStateException,IllegalPathStateException,IllegalStateException,ImagingOpException,IndexOutOfBoundsException,MissingResourceException,NegativeArraySizeException,NoSuchElementException,NullPointerException,ProfileDataException,ProviderException,RasterFormatException,SecurityException,SystemException,UndeclaredThrowableException,UnmodifiableSetException,UnsupportedOperationException..
7.error和exception有什么区别?
error表示恢复不是不可能但很困难的情况下的一种严重问题。
比如说内存溢出。
不可能指望程序能处理这样的情况
exception表示一种设计或实现问题。
也就是说,它表示如果程序运行正常,从不会发生的情况
8.Java中的异常处理机制
Java通过面向对象的方法来处理异常。
在一个方法的运行过程中,如果发生了异常,则这个方法生成代表该异常的一个对象,并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。
我们把生成异常对象并把它提交给运行时系统的过程称为抛弃(throw)一个异常。
运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回朔,直到找到包含相应异常处理的方法为止,这一个过程称为捕获(catch)一个异常。
9.abstractclass和interface的区别
抽象:
忽略一个主题与当前目标无关的那些方面,以便充分的注意与当前目标有关的那些方面,抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节实现,抽象包括两个方面,过程抽象和数据抽象
声明方法的存在而不去实现它的类叫虚拟类(abstractclass)
它用于创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况.不能创建abstractclass的实例.但是可以声明一个abstractclass变量,将其指向其具体子类的一个实例.不能有抽象构造函数或抽象静态方法.Abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。
取而代之,在子类中实现该方法。
知道其行为的其它类可以在类中实现这些方法.
接口(interface)是抽象类的变体。
在接口中,所有方法都是抽象的。
多继承性可通过实现这样的接口而获得。
接口中的所有方法都是抽象的,没有一个有程序体。
接口只可以定义staticfinal成员变量。
接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。
当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。
然后,它可以在实现了该接口的类的任何对象上调用接口的方法。
由于有抽象类,它允许使用接口名作为引用变量的类型。
通常的动态联编将生效。
引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口.
接口是一个更纯的抽象类.
10.构造方法构Constructor是否可被重写
答:
构造方法Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading
1).构造方法不能是native,final,static,synchronized的,可以是public,private,或什么都没有。
2).构造方法函数里可以写return呢,但后面什么都不许有(包括null)
3).构造方法不能返回值.
但如果有个"构造方法"返值了,它就不是构造方法喽,只是个普通方法
4).super();this();这两个方法只能在构造方法里调用.
5).成员变量声明时候赋值,比构造函数还早.
11.Trycatchfinally的执行顺序
首先执行try语句模块中的代码,如果出现异常则执行catch语句块,如果遇见return语语句则必须在执行finally模块中的代码以后才能执行return语句,也就是说,在正常退出的情况下,finally语句中的内容是必须被执行的。
12.ArrayList和Vector的区别,HashMap和Hashtable的区别
就ArrayList与Vector主要从二方面来说.
一.同步性:
Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:
当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
就HashMap与HashTable主要从三方面来说。
一.历史原因:
Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现
二.同步性:
Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:
只有HashMap可以让你将空值作为一个表的条目的key或value
13.GC是什么?
为什么要有GC?
GC是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
14.STRING与STRINGBUFFER的区别。
STRING的长度是不可变的,STRINGBUFFER的长度是可变的。
如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
15.谈谈final,finally,finalize的区别
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。
因此一个类不能既被声明为abstract的,又被声明为final的。
将变量或方法声明为final,可以保证它们在使用中不被改变。
被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。
被声明为final的方法也同样只能使用,不能重载
finally—再异常处理时提供finally块来执行任何清除操作。
如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如有的话)
finalize—方法名。
Java技术允许使用finalize()方法在圾收集器将对象从内存中清除出去之前做必要的清理工作。
这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。
它是在Object类中定义的,因此所有的类都继承了它。
子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。
finalize()方法是在垃圾收集器删除对象之前对这个对象调用的
16.说出ArrayList,Vector,LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快
17.JAVA语言如何进行异常处理,关键字:
throws,throw,try,catch,finally分别代表什么意义?
在try块中可以抛出异常吗?
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。
在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。
当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。
Java的异常处理是通过5个关键词来实现的:
try、catch、throw、throws和finally。
一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。
用try来指定一块预防所有"异常"的程序。
紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的"异常"的类型。
throw语句用来明确地抛出一个"异常"。
throws用来标明一个成员函数可能抛出的各种"异常"。
Finally为确保一段代码不管发生什么"异常"都被执行一段代码。
可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。
每当遇到一个try语句,"异常"的框架就放到堆栈上面,直到所有的try语句都完成。
如果下一级的try语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这种"异常"的try语句。
18.java中有几种类型的流?
JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。
字节流继承于InputStreamOutputStream,字符流继承于InputStreamReaderOutputStreamWriter。
在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
19.什么是java序列化,如何实现java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。
可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:
将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implementsSerializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:
FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Objectobj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
20.java中有几种方法可以实现一个线程?
用什么关键字修饰同步方法?
stop()和suspend()方法为何不推荐使用?
有两种实现方法,分别是继承Thread类与实现Runnable接口
用synchronized关键字修饰同步方法
反对使用stop(),是因为它不安全。
它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。
结果很难检查出真正的问题所在。
suspend()方法容易发生死锁。
调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。
此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。
对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。
所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。
若标志指出线程应该挂起,便用wait()命其进入等待状态。
若标志指出线程应当恢复,则用一个notify()重新启动线程。
21.sleep()和wait()有什么区别?
答:
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。
调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
22.请说出你所知道的线程同步的方法。
wait():
使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():
使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():
唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():
唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争
23.简述synchronized和java.util.concurrent.locks.Lock的异同?
主要相同点:
Lock能完成synchronized所实现的所有功能
主要不同点:
Lock有比synchronized更精确的线程语义和更好的性能。
synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
1.对JDK描述错误的是C
A.运行java程序只要有JRE环境就可以,不一定需要全部JDK的功能
//运行java程序的时候没有使用到jdk类库的时候不需要加载的
B.JDK包括JVM、核心类库、Java开发工具库,java开发工具(java、javac)等
C.JDK本身也是平台无关的,不同的操作系统安装的JDK是一样的
Jdk中包括JVM等信息,JVM是由C语言实现,所以跟平台有关系
D.JDK的全称是JavaDevelopmentKit//java开发工具
2.对CLASSPATH描述正确的是BD
A.设置CLASSPATH用于指示操作系统找到JDK命令,如java或javac
//path才是用于指示操作系统找到jdk命令
B.CLASSPATH设置不对,可能导致java命令失败,但不会导致javac失败
CLASSPATH环境变量。
作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPATH来寻找类的。
我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。
CLASSPATH环境变量。
C.CLASSPATH的设置中可以包括目录路径但不可以包含文件路径
D.java命令可以通过-cp参数指定类路径
3.下面不属于Java语言特点的是C
A.平台无关
B.面向对象
C.支持指针类型
D.垃圾回收机制
4.指出下边语句没有编译错误的是C
A.longn=999999999999;
B.intn=999999999999L;
C.longn=999999999999L;
D.doublen=999999999999;
默认情况下都是以int类型来进行赋值,当超出范围时需要特别指明是什么数据类型
5.语句System.out.println(1+2+"java"+3+4);的输出结果是A
A.3java34
B.12java34
C.3java7
D.12java7
6.java语言中的int类型标示整数的最大范围是B
A.-2147483647~2147483647
B.-2147483648~21474836472的31次方-1,-2的31次方
C.-32767~32767
D.-32768~32767
7.java语言中字符串"学java"所占的内存空间是C
A.6个字节//java中一个汉字也是一个字符,一个字符占2个字节
B.7个字节
C.10个字节
D.11个字节
8.下面代码的输出结果是B
publicclassMain{
publicstaticvoidmain(String[]args){
intn1=1;
intn2=2;
n1=n1+n2;
n2=n1-n2;
n1=n1-n2;
System.out.println(n1+","+n2);
}
}
A.1,2
B.2,1
C.1,3
D.3,2
9.完成代码计算10的阶乘并输出,应该填入的代码是A
......
longresult=1;
for(inti=2;i<=10;i++){
}
System.out.println(“result=”+result);
......
A.result*=i;
B.result=i*i;
C.result=i*(i+1);
D.result=i*(i-1);
10.数列:
1,1,2,3,5,8,……(从第三项开始每一项是前两项之和)
下面的代码用于求出第100项的值,则应填入的代码是D
intn=100;
longn1=1,n2=1;
for(inti=3;i<=n;i++){
}
System.out.println(n2);
A.n2=n1+n2;
B.n2=n1+n2;n1=n2;
C.n2=n1–n2;n1=n2–n1;
D.n2=n1+n2;n1=n2–n1;
11.下面的程序能通过编译的是D
A.publicclassMain{
publicstaticvoidmain(String[]args){
byteb1=1;
byteb2=2;
byteb=b1+b2;
}
}
B.publicclassMain{
publicstaticvoidmain(String[]args){
intn;
for(inti=0;i<10;i++){
n+=i;
}
}