本书内容摘自《Java程序员面试笔试宝典》
很多同学在面试时其实有个误区,认为准备的东西越详细越好
其实不是,就和批试卷一样,写长篇大论其实并不会必然加分
老师阅卷时间有限只会抓关键词,面试官也是一样的道理
加上面试官每天面试的人有很多,不可能在你身上浪费大量的时间,更不可能有时间听你背书
工作不是要一个背书机器,加上计算机语言晦涩难懂,要想把整本书背下来基本不可能
那么为什么有时候我们听大佬说话句句都是重点
因为他抛弃了所有的赘述,只留下了关键词和框架
但是这本书怎么说呢,回答问题的逻辑稍微有点乱,有时候看着看着就把问题忘了,所以有些拓展内容就删掉了,留到别的页面去单独和大家讨论
面试的时候除非面试官追问,否则一般两三句话可以搞定了
所以这篇博文的回答都会很短,但是不是直接靠这个回答就可以了,大家要根据关键词将语言用自己的话组织起来
纯面向对象,平台无关,有内置类,支持Web应用开发,安全和健壮,规避了C++的弊端
Java编译成字节码JVM解释,C++经过编译生成二进制代码
Java纯面向对象,C++兼具面向对象过程
Java没有指针更安全
Java不支持多重继承
Java自带回收功能
Java语言不支持运算符重载,C++支持
Java和平台无关,C++有关
Java提供对注释文档内建支持
Java包含了标准库
main是JVM识别的特殊方法名,是程序的入口方法
main方法不一定是第一个被执行的,在前面利用静态块实现输出语句
静态对象优于非静态对象
父类优于子类
按照成员变量定义顺序
Java的变量有三种:成员变量,静态变量【全局变量】,局部变量
成员变量还有四种:public,private,protected,default
可以定义,但只有一个类被public修饰,且必须与文件名相同,没有public类文件名随便一个类的名字
用来在对象实例化时初始化对象的成员变量的函数
Java不支持多重继承,Java一个类可以实现多个接口,间接达到多重接口的目的
为了解决引用传递中,修改一个值会影响到另一个值的问题
允许程序运行时自我检查,增加程序的灵活性
功能主要有
定义一个接口,在接口中生命调用的方法,实现这个接口,最后把实现类的一个对象作为参数传递给调用程序
出发点不同:前者用常规思维的方式处理问题,后者强调过程的抽象化与模块化
层次逻辑关系不同:前者用计算机逻辑来模拟客观世界,后者把客观世界的问题抽象成计算机可以处理的过程
数据处理方式与控制程序方式不同:前者将对应的代码封装成一个整体,后者是直接通过程序来处理数据处理完毕即可显示结果
分析设计与编码转换方式不同:前者从分析、设计到编码采用一致性模型,后者从分析、设计到编码之间按规则进行转换
抽象、继承、封装、多态
较高的开发效率
保证软件的鲁棒性
保证软件的高可维护性
子类适用父类的一些成员变量与方法,提高代码的复用性,提高开发效率
组合相当于【Has】
继承相当于【Is】,在这种情况下才使用继承
多态是指同一个操作对于不同的对象,会有不同的语义
有两种表现方式
方法的重载【同名方法,不同参数】
方法的覆盖【子类覆盖父类】
重载是同一个类中的方法之间的关系,覆盖是父类和子类的关系
覆盖只能一个方法或者一对方法产生关系,重载是多个方法之间的关系
覆盖参数列表相同,重载参数列表不同
覆盖调用根据对象的类型,重载调用根据实参和形参的方法体
相同点
不同点
接口是一种特殊形式的抽象类,但抽象类多用于同类食物中无法具体描述的方法的场景,仅限于子类和父类有逻辑关系才使用
静态内部类,成员内部类,局部内部类,匿名内部类
getClass().getSuperclass().getName()
this用来指向当前实例对象,super用来访问父类
只能由字母,数字,下划线和美元符号组成,第一个字符不能是数字,标识符不能包含空白字符
break直接结束当前循环
continue结束此次循环,进入下一次循环
return是一个跳转语句,是的程序返回到调用该方法的地方
final声明属性、方法和类
finally是异常处理一部分
finalize是覆盖此方法来实现对其他资源的回收
对bollean表达式进行检查,用来保证程序的正确性,在开发和测试使用
为某特定数据类型或对象分类单一的存储空间,预创建对象个数无关
实现某个方法或属性与类而不是对象关联在一起
switch表达式只能是int
省略了break,匹配语句后面所有的情况包括default都会被执行
修饰被不同线程访问和修改的变量,系统直接从对应内存提取,不会利用缓存
判断一个引用类型的变量所指向的对象是否是一个类的实例,即它左边的对象是否是它右边的类的实例【boolean类型】
全称strict float point,指的是精确浮点,确保浮点数运算
8种,byte,short,int,long,float,double,char,boolean
创建类的实例后,不允许修改它的值,类似于const,一般情况下封装类都是不可变类,包括String
创建不可边类的原则
值传递形参的改变不会影响实参的值,引用传递形参的修改就会影响实参的值
类型自动转换,强制类型转换
涉及byte、short和char类型的运算,会强制转换为int
需要得到short类型的结果,需要显示地转换
round方法表示四舍五入
ceil方法表示向上取整
floor方法表示向下取整
前者程序开始前自增,后者程序执行完毕后自增
>>被称为有符号右移运算【为正数高位补0,负数时高位补1】
>>>被称为无符号右移运算【执行运算时,都会在高位补0】
可以,不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字
①创建对象
String s1 = new String("abc");
String s2 = new String("abc");
②声明对象
String s1 = "abc";
String s2 = "abc";
==用来比较两个变量的值是否相等
equals在没有被覆盖的情况下和==运算符一样,覆盖以后可以比较数据内容而不是引用
hashCode用来鉴定两个对象是否相等,返回对象地址是否相等
equals方法用于比较对象的内容是否相等(覆盖以后)
hashcode方法只有在集合中用到
当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。
将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。
1)String、StringBuffer、StringBuilder都用于字符串操作,其中,String是不可变类,即String对象一旦被创建,其值不能被修改,而StringBuffer和StringBuilder都是可变类,对象被创建以后仍然可以对其值进行修改。
2)在字符串需要共享的场合中使用String合适,而当一个字符串经常需要被修改时,最好使用StringBuffer或者StringBuilder,具体看是否多线程
3)String类实例化对象有两种方式:可以利用构造方法的方式(String str = new String("Hello"))来进行初始化,也可以用赋值的方式(String str = “Hello”)进行初始化。而StringBuffer和StringBuilder只能通过构造方法的方式(StringBuffer sb = new StringBuffer(“Hello”))来初始化。
4)StringBuffer是线程安全的,StringBuilder不是线程安全的。
5)在执行效率方面,StringBuilder最高,StringBuffer次之,String最低。一般而言,如果要操作的数据量比较小,应优先使用String;如果在单线程下操作大量数据,应优先选择StringBuilder;如果是在多线程下操作大量数据,应优先考虑StringBuffer
6)StringTokenizer是用来分割字符串的工具类。
对象的特点是封装了一些数据,同时提供一些属性和方法,所以数组是对象
有自己的属性【如何length】,也有一些方法被调用【clone】
一维数组两种
type arrayName[ ]或者type[ ]arrayName
二维数组三种
type arrayName[ ][ ] ;
type[ ][ ] arrayName;
type[ ] arrayName[ ];
前一个是数组长度,后一个是字符串长度
一定会执行,并且在return前执行
把异常当做对象来处理,并定义了一个基类java.lang.Throwable作为所有异常的父类
一般异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见的运行错误
java编译器要求方法声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未捕获运行时异常。
输入和输出都被称为抽象的流,流可以被看做一组有序的字节集合,即数据在两设备之间的传输
流可以分为两大类:字节流和字符流
File类管理文件和文件夹,通过类不仅能够查看文件或目录的属性,而且还可以实现对文件或目录的创建、删除与重命名等操作。
GET是一种最简单的请求方法,其主要功能是从服务器端获取用户所需资源,并将其作为相应返回给客户端
GET方法的作用主要用来获取服务器端资源信息,不会影响到资源自身的状态
POST方法在这个基础上还可以向服务器上传数据
Servlet 是采用Java语言编写的服务器端程序,它运行于Web服务器中的Servlet容器中,其主要功能是提供请求/响应的Web服务模式,可以生成动态的Web内容,而这正是HTML所不具备的功能。
与其他生成动态页面技术相比,Servlet有诸多优点
加载、创建、初始化、处理客户请求、卸载
加载:容器通过类加载器使用Servlet类对应的文件来加载Servlet
创建:通过调用Servlet的构造函数来创建一个Servlet实例。
初始化:通过调用Servlet 的init( )方法来完成初始化工作
处理客户请求:Servlet 一旦被创建后,它就可以为客户端提供服务了。
卸载:容器在卸载Servlet之前需要调用destroy()方法,让Servlet自己释放其占用的系统资源
JSP的引入在一定程度上解决了Servlet存在的缺点
改进了Web应用程序代码可读性差,系统可扩展性可维护性差的缺陷
相同点
JSP可以看做特殊的Servlet,只要是JSP可以完成的工作,Servlet都可以完成
不同点
Servlet是在Java嵌入HTML代码,编写不方便,JSP实现是在HTML中嵌入Java代码
Servlet中没有内置对象
JSP中的内置对象都是通过HttpServletRequest对象、HttpServletResponse 对象以及HttpServlet对象得到。
MVC全程Model【模型】,View【视图】、Controller【控制器】首字母组合
MVC强制性地分离Web应用的输入、处理和输出,使得MVC应用程序分成3个核心部件
在JSP中,内置对象又称为隐含对象,是指在不声明和不创建的情况下就可以被使用的一些成员变量。
JSP一共提供有9个内置对象:
request ( 请求对象)
response (响应对象)
pageContext(页面上下文对象)
session ( 会话对象)
application (应用程序对象)
out (输出对象)
config(配置对象)
page (页面对象)
exception (例外对象)
jsp: include。用来在页面被请求时引入一个文件。 |
|
jsp : useBean。用来寻找或者实例化一个JavaBean。 |
|
jsp: setProperty。用来设置已经实例化的Bean对象的属性 |
|
jsp : getProperty。用来获取某个JavaBean的属性 |
|
jsp:foward。用来把请求转到一个新页面 |
|
jsp: plugin。用于在浏览器中播放或显示一个对象 |