JAVAOO面试题
1、 面向对象的特征有哪些方面
面向对象的特征: 继承、封装、多态
(1).继承: (主要特显的是:代码的复用..)
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要.
(2).封装: (隐藏一些信息:体现的是Java的安全和代码的复用..)
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象.
(3).多态性: (体现了:相同的行为,不同的实现...)
多态性是指允许不同类的对象对同一消息作出响应.多态性包括参数化多态性和包含多态性.多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题.
2、 String是最基本的数据类型吗?
不是
基本 数据类型:byte,int,short,long,float,boolean,double,char
3、 int 和 Integer 有什么区别
int是java的原始数据类型,Integer是java为int提供的封装类.
Java为每个原始数据类型提供了封装类(以下是数据类型)
基本数据类型 包装类
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
4、 String 和StringBuffer的区别
String的长度是不可变的,StringBuffer的长度是可变的.
如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
5、 运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行异常.java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常.
运行时异常: 是代表程序在运行的过程,发生了非正常的效果;
一般异常:是指在编写代码的时候,就出现的异常,这个异常也叫编译异常
6、 说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素的移动等内存操作,所以查询数据效率快而在中间插入数据效率慢.
Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差. (原因是:从多线程变成单线程)
而LinkedList使用双向链表实现存储,按序号查询数据需要进行向前或向后遍历,但是在中间插入数据时只需要记录本项的前后项即可,所以在中间插入数据效率较快
7、 Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法,他是支持集合类的算法类...
Collection是个java.util下的接口,它是各种集合结构的父接口,出了Map集合.
8、 HashMap和Hashtable的区别。
就HashMap与HashTable主要从三方面来说。
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value
四.HashTable不可以, 键值都不可以重复,而,HashMap 的键值都可以为空 键不可以重复, 值可以重复
9、 final, finally, finalize的区别。
final:修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以保证被修饰的变量,变成常量,(不改变).常量在声明时给定初值,而在以后的引用中只能读取,不可修改.被final声明的方法只能被使用,但是,不能重载.
finally:在这个里面的代码在什么情况下都会执行,所以,再异常处理时提供 finally 块来执行任何清除操作.如果在try中发生异常的话,,那么就会跳入与except相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话).
finalize:是Java中的一个方法,Java 技术允许使用 finalize() 方法来通知Java中的垃圾回收机制线程来对此对象进行回收内存,这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的.它是在 Object 类中定义的,因此所有的类都继承了它.子类覆盖finalize() 方法以整理系统资源或者执行其他清理工作.finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的.
10、 sleep() 和 wait() 有什么区别?
sleep()方法是使线程停止一段时间的方法.在sleep 时间间隔期满后,线程不一定立即恢复执行.这是因为在这个时刻,有可能其它线程正在占用cpu,除非"醒来"的线程具有更高的优先级,有可能会占用cpu,马上进入运行状态.
wait()是线程交互时,如果线程对一个同步对象发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到.
11、 Overload(重载)和Override(重写)的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是在两个类中,这个两个类的关系是父子关系 ,
重载Overloading是一个类中多态性的一种表现.
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).子类重写父类的方法,此方法的返回类型,只能是大于父类方法的返回类型,或者是等于,子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了.
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型或者是顺序不同,则称为方法的重载(Overloading).Overloaded(重载)的方法是可以改变返回值的类型.
12、 error和exception有什么区别?
Error表示系统级的错误和程序不必处理的异常,
Error 是程序发生了非常严重的错误,他不能同异常处理机制进行处理.但是可以通过修改代码来进行避免..
Exception表示需要捕捉或者需要程序进行处理的异常.
Exception 是程序可以通过异常处理机制进行处理的,可以发生异常就处理,也可以发现异常不急处理,向调用方,进行抛,throw....throws....
13、 同步和异步有何异同,在什么情况下分别使用他们?举例说明。
如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取.当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率.
14、 abstract class(抽象类)和interface(接口)有什么区别?
设计:(让设计更合理) 目的,不要产生父类对象; 使用 抽象类或者是接口;
抽象方法:(规划代码) 规划子类的代码
作用:
抽象类;与类的区别是
他有抽象方法; 抽象方法只有方法的申明;
接口: 与类的区别;
他全部是抽象方法,抽象方法只有方法的申明;
面向接口编程:
抽象类和接口的区别:
第一:结构上(修饰上):
抽象类,一个是类(abstract class),
接口,而这个是接口(interface)
第二:属性上;
抽象类 可以是:普通属性,常量 等等,(变化的)
接口 (只能是) public static fianl 修饰的属性
第三: 方法
抽象类 : 有抽象方法, 有实现方法,
接口:全部是public抽象方法
第四 构造方法:
抽象类 有构造方法;
但是,他是子类产生父类的实例对象的时候,默认调用父类的构造方法,
用来实例化父类的属性和方法等等;
接口 没有构造方法
原因: 是实现接口,而不是继承;
第五:
抽象类 单根继承(注意理解 单根继承和多重继承的区别 )
接口 多重继承,接口继承接口;
多重实现;
共同点: 都不能实例化对象
15、 GC是什么? 为什么要有GC?
GC是垃圾收集器.Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理.要请求垃圾收集,可以调用下面的方法之一:
System.gc();
Runtime.getRuntime().gc();
16、String s = new String("xyz");创建了几个String Object?
两个对象,一个是“xyx”,一个是指向new String("xyz")的引用对象s.
17、启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运行.run()方法可以产生必须退出的标志来停止一个线程.
18、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口.抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数.
19、List, Set, Map是否继承自Collection接口?
List、Set是,Map不是
20、数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性.
String有length()这个方法.
21、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否.equals()是判读两个Set是否相等.
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值.
22、构造器Constructor是否可被override(重写)?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载 Overloading
23、是否可以继承String类?
String类是final类故不可以继承.
24、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
byte可以,long和String都不可以
25、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return后执行
26、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递.Java 编程语言只由值传递参数.当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用.对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的.
27、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问.
28、Java中的异常处理机制的简单原理和应用。
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常.违反语义规则包括2种情况.一种是JAVA类库内置的语义检查.例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException.一种情况就是JAVA允许程序员扩展这种语义检查(叫做运行时异常),序员可以创建自己的异常,自由选择在何时用throw关键字引发异常.有的异常都是java.lang.Thowable的子类.
29、你所知道的集合类都有哪些?主要方法?
最常用的集合类是 List 和 Map. List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表. List 适用于按数值索引访问元素的情形.Map 提供了一个更通用的元素存储方法.Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值.
30、描述一下JVM加载class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件.它负责在运行时查找和装入类文件的类.
.java 源文件;
使用jvm 中的javac 命令,编译java源文件(.java文件)
.class 字节码文件
类加载
先加载java必要的类库,再是其他的类库,
字节码校验
校验内容: 语法检查, 类检查,方法检查,属性检查,等等..
解释 : 解释给操作系统,执行java程序...
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备、解析
装载:查找和导入类或接口的二进制数据
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的
校验:检查导入类或接口的二进制数据的正确性
准备:给类的静态变量分配并初始化存储空间
解析:将符号引用转成直接引用
初始化:激活类的静态变量,初始化Java代码和静态Java代码块
31、char型变量中能不能存贮一个中文汉字?为什么?
是能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的
32、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现
wait():使一个线程处于等待状态,并且释放所持有的对象的lock.这个方法是属性Object的.
sleep():这个方法是线程类中的,使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉 InterruptedException异常.
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级.
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争.
33、线程的基本概念、线程的基本状态以及状态之间的关系
新建、就绪(start方法调用后)、运行、睡眠(sleep方法)、等待(wait方法)、挂起、恢复、阻塞、死亡
34、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以.必须只有一个类名与文件名相同.
35、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
对象流,字节流,字符流.字节流继承于InputStream OutputStream,字符流继承于Reader writer在java.io包中还有许多其他的流,主要是为了提高性能和使用方便.
对象流继承于InputStream OutputStream,
36、java中实现多态的机制是什么?
方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现.
37、静态变量和实例变量的区别?
static i = 10; //常量 (优先加载..)
class A a; a.i =10;//可变 全类共有
38、什么是java序列化,如何实现java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序列化是为了解决在对对象流进行读写操作时所引发的问题.序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流.
39、是否可以从一个static方法内部发出对非static方法的调用?
不可以,如果其中包含对象的method();不能保证对象初始化.
40、在JAVA中,如何跳出当前的多重嵌套循环?
用break; return 方法. 使用标记...