java程序员面试知识点总结

动态绑定的方法实现多态:由于子类可以覆盖父类的方法,因此,同样的方法会在父类和子类中有着不同的表现形式。在java语言中,基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类的实例对象。同样,接口的引用变量也可以指向其实现类的实例对象。而程序调用的方法在运行期间才动态绑定(绑定指的是讲一个方法调用和一个方法主体连接到一起),就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

抽象方法与抽象类中的方法区别:

抽象方法:指在类中存在没有方法体的方法,由abstract(只能修饰类和方法)修饰,不能用{ }括住。

抽象类中的方法:可以有定义和实现,

接口与抽象类

异同 抽象类 接口
 

可以有定义与实现;

继承抽象类的关键字extends

可以有自己的数据成员变量,或者非抽象的成员方法,成员变量可以被定义为private,protexted,和public,抽象类中的抽象方法不能用private,static,synchronized和native修饰,同时方法必须以分号结尾,并且不带{ }。

强调所属关系,is-a

只有定义,没有方法的实现;

实现接口的关键字implements

定义的成员变量默认为public,static和final只能有静态的不被修改的数据成员,而且必须赋初值,所有的成员方法都是public和abstract

强调特定功能的实现,like-a

final,finally和finalize的区别

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可被继承。

finally作为异常处理的一部分,只能用在try/catch语句中,并且附带一个语句块,表示这一段语句最终一定被执行,经常被用在需要释放资源的情况下。

finalize是object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的fianlize方法,可以覆盖此方法来实现对其他资源的回收,例如关闭文件等,注意,一旦垃圾回收器准备释放对象占用的空间,将首先调用其fianlize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用 的内存。

string中的常用方法

substring(int beginIndex)返回一个新的字符串,是这个字符串的子串

trim()返回字符串的副本,忽略前导空白和尾部空白

valueOf(char[] data)返回char数组参数的字符串表示形式

charAtIint index)返回字符串在位置index处的字符

length()返回字符串的长度

concat(String str)将指定字符串连接到此字符串的结尾

throw和throws的区别

1.throws通常出现在函数头,而throw则通常出现在函数体。

2.throws表示出现异常的一种可能性,并不一定发生这些异常;而throw则是抛出了异常。即如果执行了throw则一定抛出了某种异常。

字节流(InputStream和outStream)与字符流(Reader和Writer)的主要区别是:字节流不会用到缓存,而字符流用到。

JVM的内存空间模型为

方法区(还存放了运行时的常量池),堆,虚拟机栈,程序计数器,本地方法栈。

Hashtable和HashMap的区别

HashTable HashMap

不允许null值;

线程安全。

允许空(null)键值(key)最多只允许一条记录的键为null;

线程不安全。

ArrayList和Vector的区别:ArrayList(扩充原来的1.5倍)不是同步的,线程不安全;Vector(扩充原来的2倍)同步的,线程不安全。

每当向HashSet中添加一个元素时,采用下面两种方法判断两个对象是否相同:

1.如果两个对象的hashCode值不同,那么说明两个对象不同;

2.如果两个对象的hashCode值相同,接着会调用对象的equals方法,如果equals方法扥返回结果为true,那么说明两个对象相同,否则,说明两个对象不同。

关于null

我们要澄清一些误解,null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类。看如下代码:

String str = null; // null can be assigned to String
Integer itr = null; // you can assign null to Integer also
Double dbl = null;  // null can also be assigned to Double

String myStr = (String) null; // null can be type cast to String
Integer myItr = (Integer) null; // it can also be type casted to Integer
Double myDbl = (Double) null; // yes it's possible, no error


你可以看到在编译和运行时期,将null强制转换成任何引用类型都是可行的,在运行时期都不会抛出空指针异常。虽然,null可以赋值给引用变量,你不能将null赋给基本类型变量,例如int、double、float、boolean。如果你那样做了,编译器将会报错,如下所示:
int i = null; // type mismatch : cannot convert from null to int
short s = null; //  type mismatch : cannot convert from null to short
byte b = null: // type mismatch : cannot convert from null to byte
double d = null; //type mismatch : cannot convert from null to double

Integer itr = null; // this is ok
int j = itr; // this is also ok, but NullPointerException at runtime


正如你看到的那样,当你直接将null赋值给基本类型,会出现编译错误。但是如果将null赋值给包装类object,然后将object赋给各自的基本类型,编译器不会报错,但是你将会在运行时期遇到空指针异常。这是Java中的自动拆箱导致的。任何含有null值的包装类在Java拆箱生成基本数据类型时候都会抛出一个空指针异常。一些程序员犯这样的错误,他们认为自动装箱会将null转换成各自基本类型的默认值,例如对于int转换成0,布尔类型转换成false,但是那是不正确的。例如,

Integer iAmNull = null;
int i = iAmNull; // Remember - No Compilation Error


但是当你运行上面的代码片段的时候,你会在控制台上看到主线程抛出空指针异常。

自动装箱和自动拆箱

1)自动装箱:Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱。

2)自动拆箱就是:反之将Integer对象转换成int类型值,这个过程叫做拆箱。因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。

原理:

1)自动装箱时编译器调用valueOf将原始类型值转换成对象。

2)同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。

举例:

Integer i = 11;//自动装箱,实际上执行了Integer i = Integer.valueOf(11);

int t = i;//自动拆箱,实际上执行了 int t = i.intValue();

实现多线程同步的方法:

1.synchronized关键字

2.wait与notify

3.Lock()

servlet处理客户端请求:

1.用户通过单击一个连接来向Servlet发起请求。

2.Web服务器接收到该请求后,会把该请求提交给相应的容器来处理,容器会为此创建两个对象:HttpServletResponse和HttpServletRequest。

3.容器可以根据请求消息中的URL消息找到对应的Servlet,然后针对该请求创建一个单独的线程,把第2步创建的两个对象以参数的形式传递到新创建的进程中。

4.容器调用Servlet的service()方法来完成对用户请求的响应,service()方法还会调用doPost()方法和doGet方法完成具体的响应任务,同时把生成的动态页面返回给容器。

5.容器把响应消息组装为http格式返回给客户端,删除对象。

Servlet的生命周期:加载,创建,初始化,处理客户请求和卸载。

猜你喜欢

转载自blog.csdn.net/zyf2695421695/article/details/88668855