经典面试题
-----version 1.0
题注:以下答案仅限本人个人见解,若有错误和建议请多多指教。QQ:1807812486
题目来源
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
答:java虚拟机是执行java字节码的虚拟进程。javac将java代码编译成.class字节码文件,不同平台有着不同的JVM, 可以将.class文件解释成对应的机器码文件。因为有JVM的存在,我们不用关心底层的实现。
2.JDK和JRE的区别是什么?
答:jre是java运行时环境,包含了java虚拟机,核心类库,和支持文件,但是它不包含JDK(JAVA开发工具)--编译 器,调试器,和其他工具。
JDK是完整的软件开发包,不仅有JAVA开发工具,还包含了JRE.
3.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
static是静态的意思,它可以修饰变量或者函数,还有代码块。静态变量和静态函数在类加载的时候就会被初始化,它们的调用不需要类的实列化。
JAVA中不可以覆盖一个private方法,因为被private修饰的方法不能被子类继承。被子类继承的方法不应当比它的父类的权限更低。
也不可以覆盖一个static方法,因为静态方法在类加载时被绑定,而覆盖是在运行时动态被绑定。
4.是否可以在static环境中访问非static变量?
不可以,静态方法或者静态成员变量都是随类的加载而加载到静态方法区,此时对象不一定被实列化了,没有对象就不能访问非静态成员。
5.Java支持的数据类型有哪些?什么是自动拆装箱?
8中基本数据类型:byte short char int float long double boolean
执行Integer i=5时 会自动装箱 使用Integer.valueof(5);
执行int j=i时 会自动拆箱执行
6.Java中的方法覆盖(Overriding)和方法重载(Overload)是什么意思?
覆盖是发生在子类和父类之间,覆盖时函数名称,参数类型,参数个数必须完全相同。发生在编译时
重载发生在同一个包的类中,重载的函数名相同,参数的类型或者参数的个数不相同。发生在运行时
7.Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?
当一个对象被创建的时候会调用构造方法,如果没有构造方法,程序会自动调用默认的构造方法。
构造方法的重载和普通的构造方法相同,方法名称相同,参数列表不同,发生在运行时。
复制构造函数是C++中的概念,JAVA中的克隆方法是这种机制的体现
8.Java支持多继承么?
不支持,java出于对安全的考虑,只支持单继承不支持多继承。因为如果子类继承的多个父类中有相同的方法或属性,子类就不知道要继承哪一个。而接口可以多实现,因为接口只定义方法,而不具体实现,即使有多个相同的方法,子类也只会实现一个。
9.接口和抽象类的区别是什么?
1.构造函数:接口没有构造函数,抽象类可以有构造函数
2.使用: 抽象类可以被实列化,也可以被继承,但一个子类只能继承一个父类。接口不能被实列化,一个子类可以实 现多个接口
3.成员: 接口中只能由public static final变量,方法也只能使用public修饰,而且没有方法体。
抽象类可以有静态方法,实列方法,抽象方法,也可以有成员变量。
10.什么是值传递和引用传递?
值传递发生在基本数据类型中,传递的是变量值的副本,副本的值改变不影响原来的值
引用传递发生对对象中,传递的是对象的地址的副本,副本的改变会影响原来对象的改变。
11.进程和线程的区别是什么?
进程是一个执行者的应用程序,线程是进程的一个可执行序列。一个进程有多个线程,线程又成为轻量级进程。
1.地址空间和其他资源(独立性):各进程相互独立,一个进程的多个线程之间可以资源共享。一个进程的线程在其他 进程中不可见
2.通信:进程间通信ICP,线程间可通过全局变量资源共享,进行通信
3.调度和切换:线程的上下文的切换比进程的上下文的切换快的多。
12.创建线程有几种不同的方式?你喜欢哪一种?为什么?
有三种
1.继承Thread类 2.实现runnable接口 3.实现Callable接口 4.通过Excutor来创建线程池
我喜欢实现runnable接口,因为一个类只能继承一个类,继承了Thread类会很不方便
13.概括的解释下线程的几种可用状态。
1.新建:new时创建了一个线程对象
2.可运行状态 调用了start()方法后,线程变成可运行状态,等待获取cpu使用权限
3.运行状态: 获取cpu使用权限后线程开始运行
4.阻塞状态:线程运行时执行了wait() sleep(),join()方法,或者遇到IO阻塞都会进入阻塞状态
5.死亡:线程运行结束,或者抛出异常会进入死亡状态
14.同步方法和同步代码块的区别是什么?
同步方法的锁是this,或者当前类的对象
同步代码块可以选择对象锁,它比同步方法更细腻一些,我们可以只同步需要同步的问题。使用synchronized(object){}
15.在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
每个对象通过某种逻辑关联一个监视器,每个监视器和一个对象关联引用,为了实现监视器互斥功能,每个对象都关联着一把锁。一旦有方法或者代码块被synchronized修饰,那么这个部分就放入了监视区域,确保一次只有一个线程执行该区域的代码块,线程在获取锁之前都不能执行该部分的代码。
16.什么是死锁(deadlock)?
死锁指的是线程间因为竞争资源进入了相互等待的状态,如果没有外界干扰,这种状态将一直持续下去。
发生死锁的四个条件
1.进程间有共享的资源
2.使用共享资源时其他进程必须等地
3.使用资源时不能被其他进程强制夺取
4.一个线程持有一种共享资源,必须等待另一种共享资源才能运行。且各线程间形成了一种循环。
互斥性,保持和请求,不可剥夺性还有要形成闭环
17.如何确保N个线程可以访问N个资源同时又不导致死锁?
所有线程按照指定顺序获取锁,释放锁
18.Java集合类框架的基本接口有哪些?
List,Set,Queue继承Collection接口
Arraylist实现List接口,增加获取元素比较方便
LinkList 实现List接口,删除增加元素比较块
Vector 实现List接口,可自动增长对象数组,线程安全,但是在单线程中执行缓慢。
Stack 继承Vector ,模拟栈
HashSet 实现Set接口,保存的元素不能重复,访问效率高但无序。
SortedSet 实现Set接口保存的元素不能重复,但是有序。
TreeSet 红黑树实现,性能平均。
HashMap HashTable SortedMap WeakhashMap实现了Map接口
Hashmap 线程不安全,只能有一个Key为null值,可以有多个value为null。LinkedHashMap迭代有序,不像TreeHashMap那样维护需要代价
Hashtable 线程安全,但是执行缓慢。不允许key为null
19.为什么集合类没有实现Cloneable和Serializable接口?
因为克隆和序列化的语义和含义都跟它的具体实现有关,只是标识接口并没有具体实现。因此应当由集合类中的具体的类去实现来决定怎么样被克隆和实列化
20.什么是迭代器(Iterator)?
迭代器是一种设计模式,他是一个对象也有一个接口由Collection类实现。Java程序员遍历Iterator中的对象时不需要关心对象的底层实现,只需要调用迭代器中的方法。
21.Itrator和ListItrator有什么不同
Itraor可以用来遍历SET和List ListItrator只能用来遍历List
Itrator只能向后遍历, ListItrator既可以向前遍历,也可以向后遍历。
ListItrator实现了Itrator接口,并包含一些其他功能。
22.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
在迭代器遍历一个集合对象的时候,如果修改集合中的内容,则会发生快速失败。util下的集合都是快速失败。
采用安全失败机制的容器,在迭代时不直接在集合内容中访问,而是复制原有集合的内容,在拷贝的集合上进行遍历。concurrent下的集合都是安全失败
-
Java中的HashMap的工作原理是什么?
HashMap通过<key,value>键值对的形式来储存值,在使用put方法时,会先通过hashcode()方法计算hash值,然后再在所在的点链表上遍历使用equal()方法比较,如果相同则将value覆盖到对应可key中,如果不存在则追加到链表末尾。capacity默认值是16,load factor是0.75.
24.hashCode()和equals()方法的重要性体现在什么地方?
hashCode()和equals()共同确定元素的唯一性。如果只用equals()遍历效率会很低。先用hashCode确定元素的大概位置,然后再逐个比较能提高效率。
25.HashMap和Hashtable有什么区别?
HashMap和Hashtable都实现了map接口
HashMap允许键和值为null Hashtable不允许
HashMap线程不安全但是效率高,Hashtable线程安全效率不高。
26.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型
Array的大小固定,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法。
当处理固定大小的基本数据类型时,使用ArrayList时会自动拆箱装箱,处理效率较慢。
27.ArrayList和LinkedList有什么区别?
ArrayList是用数组实现,适合查找。
LinkedList是用链表实现,适合增加删除,占用空间大。
28.Comparable和Comparator接口是干什么的?列出它们的区别。
Comparable由实现该类的对象实现comparaTo()方法,根据对象实现的comparaTo()方法可以实现排序。排序的顺序不能改变。
Comparator由外部类实现comparaTo()方法,可以实现多个外部类,排序时按需取,实现代价较大。
29.什么是Java优先级队列(Priority Queue)?
PriorityQueue是基于优先堆(大小堆)的具有优先级的队列,每次取出的都是具有最高优先级的元素,优先级根据comparaTo()接口中定义的顺序来定义,如果没有该接口,则根据自然顺序来定义优先级。PriorityQueue不允许有null值。线程不安全,入队出队的复杂度都是O(lgn)
30.你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?
O表示一个数据结构增加或者删除元素时,程序运行时所需要的渐进时间复杂度上界。。O也可以描述内存消耗。
O:大O是上界
Θ:大Θ是平均值
Ω:大Ω是下界
31.如何权衡是使用无序的数组还是有序的数组?
有序数组方便查找,插入不方便。无序数组方便插入,查找不方便。
32.Java集合类框架的最佳实践有哪些?
元素的数量如果固定就选择Array,如果不固定且插入频繁就选择LinkedList,如果查询频繁就选择ArrayList.如果需要同步就选择Vector.如果需要使用键值对来储存就选择map接口。
33.Enumeration接口和Iterator接口的区别有哪些?
实现Enumeration接口的类可以遍历其中的元素,但是不能删除,修改。
实现Iterator接口的类,不仅可以遍历底层的元素,还可以修改删除。此外,Iterator是线程安全的。
34.HashSet和TreeSet有什么区别?
HashSet是用散列表实现,因此储存的元素是无序的。key不能重复。增加删除查找都是O(1)
HashTable是用红黑树实现的,储存是有序的,增加,删除,查找都是O(lgn)
35.Java中垃圾回收有什么目的?什么时候进行垃圾回收?
GC发生在对象不再被引用时或者新生代的内存满了的时候
垃圾回收可以回收不再使用的内存,释放资源。垃圾回收机制是一个守护线程。
36.System.gc()和Runtime.gc()会做什么事情?
通知jvm可以开始回收垃圾了,具体什么时候回收需要看垃圾回收线程能抢占CPU
37.finalize()方法什么时候被调用?析构函数(finalization)的目的是什么
当垃圾回收器宣告一个对象死亡时需要进行两次标记,当一个对象不可达时会进行第一次标记,并判断对象是否覆写了finalnize()方法,并将这个对象放入优先队列。虚拟机稍后会自动建立一个低优先级的线程执行finalnize()方法,但不保证等到该方法运行完才结束。
finalnize()方法是对象最后一次逃脱死亡的机会,如果在该方法中将该对象与引用链中的一个对象关联即可。
38.如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
不会,因为垃圾回收器是一个后台线程,只有在其他线程执行到安全点或者安全区域时,才会去扫描可回收的对象。而且finalnize()方法中没有自救才会被释放。
39.Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?
JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。
永久代是用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类,永久代中一般包含:
类的方法(字节码...)
类名(Sring对象)
.class文件读到的常量信息
class对象相关的对象列表和类型列表 (e.g., 方法对象的array).
JVM创建的内部对象
JIT编译器优化用的信息
40.串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?
41.在Java中,对象什么时候可以被垃圾回收?
1.垃圾回收器在进行扫描时,对象的引用计数器为0
2.从根节点不可达到的对象会被回收。
且在finalnize()方法中没有引用该对象。
42.JVM的永久代中会发生垃圾回收么?
不会,永久带中主要存放的是类加载信息,常量,和静态变量,所以不会发生垃圾回收。如果永久带满了会发生full GC
jvm内存结构
43.Java中的两种异常类型是什么?他们有什么区别?
Error和Exception都继承了Throwable接口,Error是指发生严重错误程序无法执行如内存溢出,系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。。Exception又分为受检查异常,如SQLException,IOException.受检查需要经过try catch检查处理。像数据越界,空指针就是不受检查异常,在程序运行过程中可能发生错误,但不用检查。这种错误一般是逻辑错误。
44.Java中Exception和Error有什么区别?
一个是外界因素导致的,一个是程序本身造成的。
45.throw和throws有什么区别?
throws用于在方法体上声明该方法可能会抛出的异常,如public void doA(int a)throws Exception1 ,Exception2{}。方法的调用者应该处理这些异常。
throw用于具体抛出一个异常,让用户或者程序员知道发生了异常。
下面的解释来自牛客网的讨论
链接:https://www.nowcoder.com/questionTerminal/b769424fb8bf49d9bff97353c75d6f06
来源:牛客网
系统自动抛出的异常
所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。
语句抛出的异常
用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常。
throw是语句抛出一个异常。
语法:throw (异常对象);
throw e;
throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......}
public void doA(int a) throws Exception1,Exception3{......}
举例:
throws E1,E2,E3只是告诉程序这个方法可能会抛出这些异常,方法的调用者可能要处理这些异常,而这些异常E1,E2,E3可能是该函数体产生的。
throw则是明确了这个地方要抛出这个异常。
如: void doA(int a) throws Exception1,Exception3{
try{
......
}catch(Exception1 e){
throw e;
}catch(Exception2 e){
System.out.println("出错了!");
}
if(a!=b)
throw new Exception3("自定义异常");
}
代码块中可能会产生3个异常,(Exception1,Exception2,Exception3)。
如果产生Exception1异常,则捕获之后再抛出,由该方法的调用者去处理。
如果产生Exception2异常,则该方法自己处理了(即System.out.println("出错了!");)。所以该方法就不会再向外抛出Exception2异常了,void doA() throws Exception1,Exception3 里面的Exception2也就不用写了。
而Exception3异常是该方法的某段逻辑出错,程序员自己做了处理,在该段逻辑错误的情况下抛出异常Exception3,则该方法的调用者也要处理此异常。
throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。
throws主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。
throw是具体向外抛异常的动作,所以它是抛出一个异常实例。
throws说明你有那个可能,倾向。
throw的话,那就是你把那个倾向变成真实的了。
同时:
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
46.异常处理完成以后,Exception对象会发生什么变化?
发生异常后,Exception对象会变成不可达,在一下次GC时被回收掉。
47.finally代码块和finalize()方法有什么区别?
finally()代码配合try catch 使用,不管是否发生异常都会在return 前执行。
finalize()在立即回收时调用,是对象自我拯救的最后一个机会。
48.什么是Applet?
是一种java应用小程序,能够在html中运行,并产生特殊的效果。在加载html文件时会将applet的class文件一起加载到html中,当客户浏览时会下载到客户本地上运行。主要用来创建动态交互的web应用程序。
49.一个 Applet 的生命周期
init 每次加载的时候初始化
start 每次初始化后立即调用,从其他页面返回到applet页面时,也将调用start方法
stop 跳转到其他页面时调用。
destroy 关闭浏览器时调用
paint start方法调用之后会立即调用paint()方法,或者是applet要在浏览器上重现它自身的时候。
50.什么是JDBC?
它是一种面向对象的,对数据库进行操作的API.它使得程序员可以操作数据库而不用关心其具体底层实现。使得java能够跨平台运行。
51.解释下驱动(Driver)在JDBC中的角色。
52.Class.forName()方法有什么作用?
在使用反射生成一个对象时,这个类必须要先被加载。Class.forName()可以静态的加载一个类。
53.PreparedStatement比Statement有什么优势?
1.会预编译,相同的SQL语句不会重复编译,速度会更快
2.可以防止SQL注入,安全性更高。
3.可读性更强,只需要填入参数就行了。
54.数据库连接池是什么意思?
传统的操作数据库的方式是使用一次数据库就打开,关闭一次数据库,这样是非常耗时,消耗内存的。使用数据库连接池可以在程序开始运行时统一打开一定数目的数据库,使用是从中拿取一个,使用完后还回去。
55.什么是RMI?
56.RMI体系结构的基本原则是什么?
对象的创建和使用分离,在服务器创建对象,在客户端使用对象
57.RMI体系结构分哪几层?
58.RMI中的远程接口(Remote Interface)扮演了什么样的角色?
59.什么是分布式垃圾回收(DGC)?它是如何工作的?
(不喜欢applet和RMI故跳过)
90.解释下Serialization和Deserialization。
序列化是指将一个对象的内容进行流化存储在磁盘或者网络中,反序列化就是将存储在磁盘或者网络中的流的内容读取出来,构建成一个对象。实现序列化需要实现Sweializable接口,这是一个标识接口。
91.什么是Servlet?
是一种运行在服务端的java类,它可以处理客户端/网页的请求,从而产生网页的动态内容。
92.说一下Servlet的体系结构。
ServletConfig Servlet的配置文件。
ServletContext获取Servlet上下文
GenericServlet处理http协议的请求
参考链接
93.Applet和Servlet有什么区别?
一个运行在客户端,一个运行在服务器
94.GenericServlet和HttpServlet有什么区别?
HttpServlet是一个Servlet,它继承于GernericServlet,用于处理http请求。
在service()方法中直接将SevletRequest和ServletResponse强转为HttpServletRequest和HttpServletResponse
在开发中,直接覆写doXxx()方法就可以了。
GenericServlet是一个抽象类,它继承了ServletConfig和Servlet接口。其中的Service方法是抽象方法。
新建的Servlet直接继承GernericServlet会更简洁。
95.解释下Servlet的生命周期。
1.客户端发送请求,服务端接收请求。
2.检查是否有Servlet对象,没有就新建。
3.调用Servlet的init()方法初始化
4.创建一个用于封装请求消息的HttpRequest对象和一个用于返回的Httpresponse对象。
5.Web程序关闭或者重启之前将调用Servlet的Destory()方法摧毁对象。
96.doGet()方法和doPost()方法有什么区别
1.doGet处理Get请求,在传递参数时会将参数显示在URL中,对于用户可见,这样安全性较低。此外传送的数据大小也有限<=2KB,但是执行效率高,所以在查询数据时可以使用GET请求,其他不建议。从get中获取值的方法是Resquest.queryString();
2.doPost处理Post请求,传递的参数放在请求体中,不可见安全性高d
97.什么是web应用程序
web应用程序是可以通过浏览器访问的应用程序,通常由Servlet,html,css构成。基于B/s构成的应用程序,核心是对数据库的操作。
98.什么是服务端包含(Server Side Include)?
99.什么是Servlet链(Servlet Chaining)?
第一个Servlet的输出作为第二个Servlet的输入,第二个Servlet的输出作为第三个的输入。
100.如何知道是哪一个客户端的机器正在请求你的Servlet
ServletRequest可以通过 getRemoteAddr()找到客户端的IP,通过getRemoteHost()可以获取主机名。
101.HTTP响应的结构是怎么样的?
响应头:1XX,请求成功,继续处理。 2XX 成功,行为被接受,采纳。 3XX 重定向,为了完成请求必须进一步执行操作。 4XX 客户端错误,请求包含语法错误或无法实现。 5XX 服务器错误 服务器不能实现一种明显的无效的请求。
消息头:服务器与客户端的暗码,告诉服务器该怎么执行请求。
消息正文:传递服务器响应客户端要显示的内容。
102.什么是cookie?session和cookie有什么区别?
cookie是存放在浏览器上的一小段文本信息,用来记录服务器使用response发送给客户端的状态信息。当再次访问服务器时就会把请地址和cookie一起发送给服务器,服务器检查cookie从而确定用户的状态,此外还可以修改cookie。
session是存放在服务器上的一段文本信息,当用户访问服务器时,服务器就会记录下客户端的状态保存在服务器上。
区别:cookie保存在浏览器上,浏览器可以禁用cookie。cookie保存字符串对象,session可以保存java对象。
cookie存储的数据量较小。cookie是一张通信证,session是一张访问记录表。
103.浏览器和Servlet通信使用的是什么协议?
http协议
104.什么是HTTP隧道?
它是一种利用http或者https将多种网络通信协议封装起来的技术,因此http扮演者一个打通网络通信的管到的角色,其他协议被掩盖成http协议就是thhp隧道。
105.sendRedirect()和forward()方法有什么区别?
sendRedirect()是浏览器的跳转,浏览器地址会发生变化。会发送两次请求,response,request对象都会重新生成,传送速度慢。
forward()是服务器内部的跳转,浏览器地址不会发生变化。共享同一个请求,可以访问web-inf下的资源信息。不能跨域跳转,只发送了一个请求。
106.什么是URL编码和URL解码?
编码是对不安全的字符,如中文,替换成对应的16进制表示。URLencoder(String url,String encoder)
解码是将不安全的字符的16进制,替换成中文等不安全字符。URLDecoder(String url,String encoder)
107.什么是JSP页面?
jsp一种java显示开发动态网站的技术,jsp编译时会编译成Servlet文件,然后编译成.class文件。jsp有九大内置对象,response,request,exception,out,application,session,page,pagecontext.
jsp=html+servlet
108.JSP请求是如何被处理的?
jsp页面通过浏览器发送给服务器,服务器判断请求是否是第一次或者页面是否改变,如果是服务器就将jsp页面翻译成servlet。jvm将servlet编译成.class文件,然后将字节码文件加载到服务器内存上执行。服务器将处理结果以html文件返回给客户端。如果不是第一次,或者没有改变,则省略编译,翻译直接运行。
109.JSP有什么优点?
- 被动态编译成Servlet
- 会被预编译
- jSP很容易和静态模板集合一起,如html/xml.
- 开发者提供页面设计者以类XML的格式来访问自定义的JSP标签库
110.什么是JSP指令(Directive)?JSP中有哪些不同类型的指令?
Directive是jsp被编译成Servlet的时候,JSP引擎需要处理的指令。 Drective用来设置页面自别的指令,从外部文件插入数据,指定自定义的标签库。
包含指令(include directive):用来包含文件和合并文件内容到当前页面。
页面指令 (page directive):用来定义JSP页面中特定的属性,比如错误页面和缓冲区。
taglib:用来声明页面中使用的自定义标签库。
111.什么是JSP动作(JSP action)?
jsp动作以XML的形式来控制Servlet的行为,当jsp页面被请求的时候jSP动过会执行。它可以动态的被插入到文件中,
重用javaBean组件。转发用户到其他页面,或者是给java插件产生html代码。jSP动作包含如下:
1.jsp:include当jsp被请求的时候包含一个文件
2.jsp:useBean找出或者初始化一个javaBean
3.jsp:getProperty获取JavaBean的属性
4.jsp:setProperty设置JavaBean的属性
5.jsp:forward把请求发送到新的页面
6.jsp:plugin产生特定浏览器的代码
112.什么是Scriptlets?
在jsp页面中可以在<% %>标签内添加的java代码。
113.声明(Decalaration)在哪里?
声明用来指出即将要使用的变量,和java中的声明变量很相似。声明必须包含在开始标签与结束标签之间。
114.什么是表达式(Expression)?
<%=getName()%>表示执行后会自动转化为字符串显示在jsp页面中。
115.隐含对象是什么意思?有哪些隐含对象?
隐含对象是jsp容器中内置的java对象,开发者不用申明就可以使用。如
response,request,application,page,pageContext,session,config,exception
116.面向对象软件开发的优点有哪些?
代码开发模块化,易于维护。
代码可以复用,提高开发效率。
增加代码的理解性。
有很多优秀的特点,封装继承多态抽象。
117.封装的定义和好处有哪些?
1.更加安全,定义为private后其他类不可以直接访问。
2.避免了大规模的更改,提高了维护性。
118.多态的定义?
调用同一个方法时呈现出不同的行为特征。多态的实现由重载,和重写实现。多态的作用是提高程序的可复用性。
119.继承的定义?
是一种可以让一个类获得其他类的方法和属性的机制。可以提高代码的可重用性。
120.抽象的定义?抽象和封装的不同点?
抽象就是把一些具有公共特征的行为剥离出来,只为其定义形式而不具体实现。比如动物中的叫声有狗,毛,猪等不同叫声,但是他们的行为都是叫。于是可以把动物的公有特征抽象出来,这样可以形成一个规范。
封装是指将类的属性和一些私有方法封装起来,不允许有其他类直接访问。这样可以提高程序的可维护性和安全性。