JAVASE常见⾯试题总结
在这⾥插⼊代码⽚# JAVASE复习
1. 是否可以从⼀个static⽅法内部发出对⾮static⽅法的调⽤?
不可以。因为⾮static⽅法是要与对象关联在⼀起的,必须创建⼀个对象后,才可以在该对象上进⾏⽅法的调⽤。⼆static⽅法调⽤时不需要创建对象,就可以直接调⽤。也就是所,当⼀个static⽅法被调⽤时,可能还没有创建任何实例对象。如果从⼀个static⽅法中发出分static的调⽤,⾮静态⽅法应该关联到哪个对象上呢?所以⼀个static⽅法内部不能发出分静态⽅法的调⽤。
Static⽅法是静态⽅法,是属于类的⽅法
⾮静态⽅法是属于对象的⽅法,所以在static⽅法中想要调⽤⾮static⽅法,要先新创建⼀个对象,在由这个对象来调⽤⾮static⽅法
总结:可以调⽤,但是要跟随对象调⽤。
2. break return continue之间的区别
Break :结束选择|循环结构
Return:返回具体类型给⽅法调⽤者;或者提前结束⽅法体;
Continue:跳过当前循环,继续下⼀次循环
3. Overload和Override的区别?Overload的⽅法是否可以改变返回值的类型?
Override:(重写,覆盖)发⽣在⼦类与⽗类中
⽅法名,参数,返回值相同,
⼦类⽅法不能缩⼩⽗类⽅法的访问权限。
⼦类⽅法不能抛出不⽗类更多的异常(⼦类可以不抛出异常)
存在⽗类和⼦类之间
⽅法被定义为final则不能被重写
Oveload(重载)发⽣在⼀个⽅法中
差参数类型,个数,顺序⾄少有⼀个不同才能构成重载
不构成重载的修饰位置有权限修饰符,返回值类型。
存在于⽗类⼦类,同类中。
Overloaded的⽅法是可以改变返回值的类型。
4. 接⼝是否可继承接⼝?抽象类是否可实现(implements)接⼝?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的
main⽅法?
接⼝可以继承接⼝,抽象类不可以继承接⼝,但是可以实现接⼝。
抽象类可以继承实体类。抽象类可以实现implements接⼝。
抽象类是否可以继承是实体类?前提是实体类必须有明确构造函数。
抽象类可以继承实体类,就是因为抽象类的可以继承性和私有⽅法
抽象类中可以包含静态的main⽅法
5. abstractclass和interface语法上有什么区别?
抽象类中可以有构造⽅法,接⼝中不能有构造⽅法
抽象类中可以有普通成员变量,接⼝中没有普通成员变量
抽象类中可以包含⾮抽象的普通⽅法,接⼝中的所有⽅法都必须是抽象的,不能有⾮抽象的普通⽅法
抽象类中的抽象⽅法的访问类型可以是public,protected,但接⼝中的抽象⽅法只能是public类型的,并且默认即为public abstract类型
抽象类和接⼝中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接⼝中定义的变量只能是public static final 类型的,并且默认即为public static final 类型
⼀个类可以实现对个接⼝,但只能继承⼀个抽象类。
6. abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
Abstract和static
不能同时使⽤
⽤static声明的⽅法表名这个⽅法在不在⽣成类的实例时可直接被调⽤,额abstract⽅法不能被调⽤,
两者⽭盾
Abstract 和 native
Native:⽤来声明本地⽅法;
Native可以和所有其他所有的java标识符连⽤,但是abstrac除外
因为native按时这些⽅法是有实体的,只不过这些实体是⾮java的,但是abstract却显然的指明这些⽅法⽆实现体。
Abstract 与 synchronizedjava接口有没有构造方法
Synchronized:⽤于防⽌多个线程同时调⽤⼀个对象的该⽅法,与static连⽤可防⽌多个线程同时调⽤⼀个类的该⽅法
Abstract与synchronized不能同时使⽤
从synchronized的功能也可以看出,⽤synchronized的前提是该⽅法可以直接被调⽤,显然不能和abstract连⽤
7. 简单说说Java中的异常处理机制的简单原理和应⽤。
当JAVA程序违反了JAVA的语义规则是,JAVA虚拟机就会将发⽣的错误表⽰为⼀个异常,违反语义规则包括2种情况。⼀种情况就是JAVA类内置的语义检查,例如数组索引下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另⼀种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建⾃⼰的异常,并⾃由选择在何时使⽤throw关键字引发异常。所有的异常都是java.lang,Thowable的⼦类。
使⽤try…catch捕获异常
先执⾏try 块中的代码,如果正常运⾏没有发⽣异常则执⾏完后执⾏finally 代码块中的代码;如若在try 中发⽣异常且被catch 捕捉到则执⾏catch 中的代码块,然后执⾏finally 块中的代码
8. 说⼀说你对⾯向对象的理解?
⽤我的话说,其实可以这么理解,假如我是上帝,我要造⼈(这是对象)。
⾸先,我要知道⼈类要有哪些最基本的东西?
⼈要有思想,⼈还要有⾁体
这个过程呢就是(抽象)
因为⼈的数量很庞⼤,所以我需要别⼈帮我⼀起造⼈,但是我不想让他知道我造⼈的技术(⼈的脸需要⽤多少克泥巴,需要怎么⽤⼿去捏⿐⼦等等),我可以把我的造⼈的技术封装起来,别⼈只需要知道他要做什么样的⼈类就好了。【封装】
当我⾃⼰造⼈的时候,我可能造着造着就累了,我可能就要⽤我之前造出来的某个泥⼈作为模板“复制”,“粘贴”了
⽤模板创出来的泥⼈具有模板的特征,就像孩⼦⼀样具有⽗母的性状。我们称这个过程为【继承】
但是呢好多泥⼈都是我后来偷懒⽤模板复制出来的,为了让⼈类更丰富多彩⼀些,我对他们⼜进⾏了改变。这个过程可以叫【多态】
9. &和&&的区别?
单&:
逻辑运算符,两个为真才为真,第⼀个为假还会去判断第⼆个表达式是不是为真
位运算符:将两边⼗进制整数转换成⼆进制运算,再进⾏⽐较两个都为1才为1否则为0,再将结果转换成⼗进制返回回去。
双&&:短路与两边为真才为真,把最可能为假的表达式放在前⾯,从⽽达到短路的效果
10. 访问修饰符public,private,protected,以及不写(默认)时的区别?
Public:所有类都可以访问
Private:本类中可以访问
Protected:同包以及有继承关系的⼦类可以访问
默认(default):本类和同包下可以访问
11. 抽象类必须要有抽象⽅法吗?
1.抽象类可以没有抽象⽅法,但是如果你的⼀个类已经声明成了抽象类,即使这个类中没有抽象⽅法,它也不能再实例化,即不能直接构造⼀个该类的对象。
2.如果⼀个类中有了⼀个抽象⽅法,那么这个类必须声明为抽象类,否则编译通不过。
12. 普通类和抽象类有哪些区别?
1.抽象类不能被实例化。
2.抽象类可以有构造函数,被继承时⼦类必须继承⽗类⼀个构造⽅法,抽象⽅法不能被声明为静态。
3.抽象⽅法只需申明,⽽⽆需实现,抽象类中可以允许普通⽅法有主体
4.含有抽象⽅法的类必须申明为抽象类
5.抽象的⼦类必须实现抽象类中所有抽象⽅法,否则这个⼦类也是抽象类
6.抽象类是否可以有构造函数?
答案是可以有。抽象类的构造函数⽤来初始化抽象类的⼀些字段,⽽这⼀切都在抽象类的派⽣类实例化之前发⽣。不仅如此,抽线类的构造函数还有⼀种巧妙应⽤:就是在其内部实现⼦类必须执⾏的代码
13. 列出⼀些你常见的运⾏时异常?
ArithmeticException(算术异常)
ClassCastException (类转换异常)
IllegalArgumentException (⾮法参数异常)
IndexOutOfBoundsException (下标越界异常)
NullPointerException (空指针异常)
SecurityException (安全异常)
14. Integer与int的区别?
nteger是包装类默认值为null;
Int在修饰局部变量时是没有默认值的必须要为其初始化
在修饰成员变量时默认值为0;
15. java 中操作字符串都有哪些类?它们之间有什么区别?
String、StringBuffer、StringBuilder
String : final修饰,String类的⽅法都是返回new String。即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会⽣成新的对象。
StringBuffer : 对字符串的操作的⽅法都加了synchronized,保证线程安全。
StringBuilder : 不保证线程安全,在⽅法体内需要进⾏字符串的修改操作,可以new StringBuilder对象,调⽤StringBuilder对象的append、replace、dele te等⽅法修改字符串。
16. String s = new String(“xyz”);创建了⼏个StringObject?是否可以继承String类?
创建了两个对象:
⼀个在字符串常量池中创建了⼀个“xyz”对象
在堆中通过new String创建了⼀个对象
不可以继承String类,因为String是被static修饰的,被final修饰的类不能被继承
17. String、StringBuffer与StringBuilder的区别?
Sting是不可变字符序列,⽽StringBuffer和StringBulider是可变字符序列
StringBuffer:线程安全,相对效率低
StringBulider:线程不安全,相对效率⾼
StringBulider> StringBuffer>Sting
18. 下⾯这条语句⼀共创建了多少个对象:String s=“a”+“b”+“c”+“d”;
只创建了⼀个对象,在字符串池会有⼀个对象,因为他是⼀⾏定义的对象编译时只会初始化⼀次字符串缓冲池的数据。创建了⼀个长度为4的byte[]数组对象19. 字节流与字符流的区别?
字节流:字节流是直接操作⽂件,字节流是万能流什么类型的数据都可以操作,读和写都是⼀个⼀个字节进⾏操作
字符流:字符流操作的基本单元为Unicode码元,字符流使⽤缓冲区。
字节流通常⽤于处理⼆进制数据,实际上它可以处理任意类型的数据,但它不⽀持直接写⼊或读取Unicode码元;字符流通常处理⽂本数据,它⽀持写⼊及读取Unicode码元。
20. 什么是java序列化,如何实现java序列化?Serializable接⼝的作⽤?
序列化就是⼀种⽤来处理对象流的机制,所谓对象流也就是将对象的内容镜像流化,(将对象转换成⼆进制)。可以对流化后的对象进⾏读写操作,也可以将流化后的对象传输与⽹络之间,序列化是为了解决在对对象流进⾏读写操作时所引发的问题。把对象转换为字节序列的过程成为对象的序列化,把字节序列恢复为兑现过得过程称之为兑现的反序列化。
序列化的实现:将需要被序列化的类实现Serializable接⼝,改接⼝没有需要实现的⽅法,implements Serializable 只是为了标注该兑现格式可被序列化的,然后使⽤⼀个输出流(如:FileOutputStrwam)来构造⼀个ObjectOutputStream对象流对象,接着使⽤ObjectOutputStream的对象的writeObjecr(Object obj)⽅法就可以将参数为obj的对象写出(即保存其状态),要恢复的话使⽤输出流
1. 把对象的字节序列永久地保存到硬盘上,通常存放在⼀个⽂件中;
在很多应⽤中,需要对某些对象进⾏序列化,让它们离开内存空间,⼊住物理硬盘,以便长期保存。⽐如最常见的是Web服务器中的Session对象,当有10万⽤户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把⼀些seesion先序列化到硬盘中,等要⽤了,再把保存在硬盘中的对象还原到内存中。
2. 在⽹络上传送对象的字节序列。
当两个进程在进⾏远程通信时,彼此可以发送各种类型的数据。⽆论是何种类型的数据,都会以⼆进制序列的形式在⽹络上传送。发送⽅需要把这个Java对象转换为字节序列,才能在⽹络上传送;接收⽅则需要把字节序列再恢复为Java对象。
21. 线程的sleep()⽅法和yield()⽅法有什么区别?
Sleep()⽅法给其他线程运⾏机会是不考虑线程的优先级,因此会给优先级低的线程有运⾏的机会;yield()⽅法只会给相同优先级或更⾼优先级的线程运⾏机会
线程执⾏sleeo()⽅法后转⼊TIMED_WAITNG状态,⽽执⾏yield()⽅法后转⼊rady状态
Sellp()⽅法声明抛出去InterruptedException,⽽yield()⽅法没有声明任何异常;
Sellp()⽅法⽐ yield()⽅法(跟操作系统CPU调度相关)具有更好的移植性
22. Lis、Map、Set三个接⼝存取元素时,各有什么特点?
存放时:
1. List以特定的索引(有顺序的存放)来存放元素,可以有重复元素
2. Set存放元素是⽆序的,⽽且不可重复
3. Map保存键值对的映射,映射关系可以是⼀对⼀(键值)或者是多对⼀,
注意:键⽆序且不可重复,值可以重复
取出时:
1. List取出元素for循环,forEach循环,Iterator迭代器迭代
2. Set取出元素forEach循环,Iterator迭代器迭代
3. Map取出元素须转换成Set,然后进⾏Iterator迭代器迭代,或转换成Entry对象进⾏Iterator迭代器迭代
23. Collection 和 Collections 有什么区别?
java.util.Collection是⼀个集合接⼝(集合类的⼀个顶级接⼝)。
它提供了对集合对象进⾏基本操作的通⽤接⼝⽅法。
Collection接⼝在Java 类库中有很多具体的实现。
Collection接⼝的意义是为各种具体的集合提供了最⼤化的统⼀操作⽅式
其直接继承接⼝有List与Set。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
java.util.Collections 是⼀个包装类(⼯具类/帮助类)。
它包含有各种有关集合操作的静态多态⽅法。
此类不能实例化,就像⼀个⼯具类,⽤于对集合中元素进⾏排序、
搜索以及线程安全等各种操作,服务于Java的Collection框架。
24. HashMap 和 Hashtable 有什么区别?
Hashtable、HashMap、TreeMap都是最常见的Map接⼝的实现,是以键值对的形式存储和操作数据的容器类型。
Hashtable是早期Java类库提供的⼀个哈希表实现,本⾝是线程安全的,不⽀持null键和值。由于线程安全导致的性能开销,所以已经很少被推荐使⽤。
HashMap是应⽤更加⼴泛的哈希表实现,⾏为上⼤致与Hashtable⼀致,主要区别在于HashMap不是线程安全的,且⽀持null键和值等。通常情况下,Hash Map进⾏put或者get操作,可以达到常数时间的性能,所以它是绝⼤部分利⽤键值对存取场景的⾸选。
TreeMap则是基于红⿊树的⼀种提供顺序访问的Map,和HashMap不同,它的get、put、remove之类操作都是O(log(n))的时间复杂度,具体顺序可以由指定的Comparator来决定,或者根据键的⾃然顺序来判断。
25. 创建线程有哪⼏种⽅式?(⾮常重要,⾃⼰回顾⼀下)
继承Thread类
实现Runnable接⼝
实现Callable接⼝
应⽤程序可以使⽤Executor来创建线程池
实现Runnable接⼝这种⽅式最受欢迎,因为不需要继承Thread类,⽆法多继承,可以多实现,⼲很多其他事。同时线程池是⾮常⾼效的,很容易实现和使⽤。
26. 字节流如何转为字符流
字节输⼊流转字符输⼊流通过InputStreamReader实现,该类的构造函数可以传⼊InputStream对象。
字节输出流转字符输出流通过OutputStreamWriter实现,该类的构造函数可以传⼊OutputStream对象。
27. Java中什么时候进⾏回收,垃圾回收有什么⽬的

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。