当前位置:   article > 正文

Java面试_在编程语言中,add用于什么情况

在编程语言中,add用于什么情况
1.什么是Java虚拟机?为什么Java被称为平台无关的编程语言?

java虚拟机是一个可以执行字节码文件(.class)的虚拟机进程。
为什么java与平台无关呢?因为java源程序(.java)首先被编译器编译成字节码文件(.class),然后java虚拟机将字节码文件解释成机器码。而不同的操作平台,装有不同的java虚拟机(JVM),能够将相同的字节码文件(.class)解释为对应平台所需要的机器码。所以,java是一种与平台无关的编程语言。

2.JDK和JRE的区别是什么?

JDK是完整的Java软件开发包,包括编译器、Java运行时环境和其它的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。
JRE是Java运行时环境,它是JDK的一个组成部分,只包括Java虚拟机、Java核心类库和支持文件。

3.可否在static环境中访问非static变量?

static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

4.Java支持的数据类型有哪些?什么是自动拆装箱?

支持类型
Java支持8种基本数据类型:
其中整数值型有四种:byte,short,int,long,
字符型一种:char
浮点类型两种:float,double
布尔型一种:boolean
整数默认int型,小数默认是double型。Float和long类型的必须加后缀。
Java还支持引用数据类型,引用类型包括类、接口、数组等。引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。而包装类就属于引用类型。

自动拆装箱
自动装箱和拆箱就是基本类型和引用类型之间的转换,转换的目的是因为基本类型转换为引用类型后,就可以new对象,从而调用包装类中封装好的方法进行基本类型之间的转换或者toString,还有就是如果集合中想存放基本类型,泛型的限定类型只能是对应的包装类型。

5.“static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

“static”关键字表明一个成员变量或者是成员方法可以在没有所属类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为static方法是编译时静态绑定的,而方法覆盖是基于运行时动态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。

6.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

方法覆盖
Java中方法覆盖(Overriding)是指子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。重写方法不能为private,运用中最典型的就是对接口方法的覆盖。
方法重载
Java中方法重载(Overloading)就是具有相同函数名,返回类型可以不同,参数个数、顺序、类型不同的函数。Overloading发生在同一个类里面具有两个或者是更多的函数具有相同名字的情况下。

7.Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

构造函数是对象被创建时初始化对象的成员方法,它具有和它所在的类完全一样的名字。构造函数只能有入口参数,没有返回类型,因为一个类的构造方法的返回类就是类本身。构造函数定义后,创建对象时就会自动调用它,对新创建的对象分配内存空间和初始化。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。
方法名称相同,参数项不相同。那么认为一个方法是另一个方法的重载方法。重载只跟参数有关,与返回类型无关。方法名和参数相同而返回类型不相同,不能说是重载。
构造方法重载是方法重载的一个典型的特例。参数列表不同。

8.Java为什么不支持多继承?

Java中类不支持多继承,因为两个继承于中一个父类的子类,被同一个子类继承时,会出现方法的引用歧义,所以Java中只支持单继承,即一个类只有一个父类。
java中的接口支持多继承,即一个子接口可以有多个父接口。接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能。

9.什么是值传递和引用传递?

值传递
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
引用传递
引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。

10.接口和抽象类的区别是什么?

接口是对动作的抽象,抽象类是对根源的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,大猫,小猫,来定义两个类,他们的抽象类是猫。说明,他们都是猫。猫可以奔跑,狗也可以奔跑,把“奔跑”定义成一个接口,然后让这些类去实现它。
所以,在高级语言上,一个类只能继承一个类(抽象类)(正如猫不可能同时是动物和植物),但是可以实现多个接口(吃奔跑口、跳跃接口)。
区别如下:
1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现。
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果。
7、抽象类里可以没有抽象方法。
8、如果一个类里有抽象方法,那么这个类只能是抽象类。
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可继承接口,并可多继承接口,但类只能单根继承。

11.解释一下线程和进程

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,如程序计数器,一组寄存器和栈,但是线程可以与同一个进程种其它的线程共享进程的全部资源。

12.进程与线程有什么区别?

1、线程的划分尺度小于进程,使得多线程程序的并发性高。
2、进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
3、每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
4、一个进程崩溃后,在保护模式下不会对其它进程产生影响。线程只是一个进程的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。

13.创建线程有几种不同的方式?

线程的创建方式有下面三种:
1、继承Thread类(真正意义上的线程类),是Runnable接口的实现。
2、实现Runnable接口,并重写里面的run方法。
3、使用Executor框架创建线程池。
其中实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。


14.线程的几种可用状态分别是什么?


1.新建(new)
新创建了一个线程对象。
2.可运行(runnable)
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。
3.运行(running)
可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。
4.阻塞(block)
阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有 机会再次获得cpu timeslice转到运行(running)状态。阻塞的情况分三种:
a、等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
b、同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
c、其他阻塞: 运行(running)的线程执行Thread.sleep(long ms)或t.join()方法或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
5.死亡(dead)
线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。


15.同步方法和同步代码块的区别是什么?


定义
同步方法是指有synchronized关键字修饰的方法。由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
同步代码块是指有synchronized关键字修饰的语句块。被该关键字修饰的语句块会自动被加上内置锁,从而实现同步。
区别
1、同步方法默认用this或者当前类class对象作为锁;
2、同步方法作用于整个方法,同步代码块作用范围更小,作用于整个代码块。
3、同步方法使用关键字synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用synchronized(object){代码内容}进行修饰;

 

16.在监视器(Monitor)内部,线程同步是如何实现的?


监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。


17.什么是死锁(deadlock),产生的条件是什么?


死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。
死锁的发生必须具备以下四个必要条件。
1.互斥
互斥条件是指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2.请求和保持
请求和保持条件是指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3.不剥夺
不剥夺条件是指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4.环路
环路等待条件是指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。


18.如何确保多个线程可以访问多个资源同时又不导致死锁?


如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。所以为了确保多个线程访问多个资源同时又不导致死锁,我们可以指定获取锁的顺序,并强制线程按照指定的顺序获取锁。


19.Java集合类框架的基本接口有哪些?


Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:
Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的Collection。
List:有顺序的collection,并且可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复。
集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。


20.为什么集合类没有实现Cloneable和Serializable接口?


集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。


21.什么是迭代器(Iterator)?


迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址。迭代器提供了一种方法,可以用来访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。
Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。


22.Iterator和ListIterator的区别是什么?


区别有一下几点:
1.使用范围
使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
2.add方法
ListIterator有add方法,可以向List中添加对象,而Iterator不能。
3.逆向遍历
ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
4.索引定位
ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
5.修改对象
都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。


23.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?


Iterator的安全失败是基于对底层集合做拷贝,所以,它不受源集合上修改的影响。java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。


24.Java中的HashMap的工作原理是什么?


存储方式
Java中的HashMap是以键值对(key-value)的形式存储元素的。
调用原理
HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。
其它特性
HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。


25.hashCode()和equals()方法的重要性体现在什么地方?


Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。


26.HashMap和Hashtable有什么区别?


区别一
HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null,HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行。
区别二
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
区别三
HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
区别四
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
区别五
HashMap不能保证随着时间的推移Map中的元素次序是不变的。


27.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?


区别

1、Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
2、Array大小是固定的,ArrayList的大小是动态变化的。
3、ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

应用
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。


28.ArrayList和LinkedList有什么区别?


1、ArrayList是基于动态数组实现的,LinkedList是基于链表的数据结构。
2、get访问List内部任意元素时,ArrayList的性能要比LinkedList性能好。LinkedList中的get方法是要按照顺序从列表的一端开始检查,直到另一端。
3、对于新增和删除操作LinkedList要强于ArrayList,因为ArrayList要移动数据。
4、LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。


29.Comparable和Comparator接口是干什么的?列出它们的区别。


Java提供了只包含一个compareTo()方法的Comparable接口。这个方法用来给两个对象排序,结果返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。
Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,比较结果才返回true。


30.什么是Java优先级队列(Priority Queue)?


PriorityQueue是一个基于优先级堆的无界队列,队列的元素是依据自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。

31.大O符号(big-O notation)的作用是什么?有哪些使用方法?


大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是性能在最坏的场景下有多么好。
大O符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,一般使用大O符号基于时间、内存和性能来选择最好的实现。大O符号可以对大量数据的性能给出一个很好的说明。


32.有序数组和无序数组的区别是什么?


1、有序数组最大的好处在于查找的时间复杂度是O(log n),而无序数组是O(n)。
2、有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量O(1)。

33.Java集合类框架的最佳实践有哪些?

实践一

根据应用的需要,正确选择要使用集合的类型对性能非常重要,所以,如果提前知道元素的大小是固定的,我们就会使用Array,而不ArrayList。
实践二
对于那些允许指定初始容量的集合。如果能估计出存储的元素的数目,就可以提前设置初始容量,以此来避免重新计算hash值或者是扩容。
实践三
为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时的ClassCastException。
实践四
使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。
实践五
编程的时候接口优于实现。
实践六
底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null。

34.Enumeration接口和Iterator接口的区别有哪些?

1.速度

Enumeration速度是Iterator的2倍。
2.内存
Enumeration比Iterator占用更少的内存。
3.安全
Enumeration安全性远远低于Iterator,因为当集合里面的对象正在被Iterator遍历的时候,其他线程无法修改对象。
4.可操作
Enumeration不允许调用者删除底层集合里面的元素,Iterator可以。

35.HashSet和TreeSet有什么区别?

区别一

底层存储的数据结构不同。HashSet底层用的是HashMap哈希表结构存储,而TreeSet底层用的是TreeMap树结构存储。
区别二
有序性不同。HashSet是无序的,而TreeSet是有序的。
区别三
存储时保证数据唯一性依据不同。HashSet是通过复写hashCode()方法和equals()方法来保证数据唯一性的,而TreeSet通过Compareable接口的compareTo()方法来保证数据唯一性的。
区别四
时间复杂度不同。HashSet的add()、remove()和contains()方法的时间复杂度是0(1),TreeSet的时间复杂度是0(logn)。

36.Java中垃圾回收有什么目的?垃圾回收的时机是什么?

目的

识别并且丢弃应用不再使用的对象来释放和重用资源。
时机
1.程序员可以手动调用gc,但是Java语言规范并不保证GC一定会执行。
2.当应用程序空闲时,即没有应用线程在运行时,GC会被调用。
3.Java堆内存不足时,GC会被调用。

37.System.gc()和Runtime.gc()的作用是什么?

这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。GC本身是会周期性的自动运行的,由JVM决定运行的时机,现在的版本有多种更智能的模式可以选择,还会根据运行的机器自动去做选择。

38.finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?

在释放对象占用的内存之前,垃圾收集器会调用对象的finalize()方法。
目的是回收某些对象,清理内存,一般建议在该方法中释放对象持有的资源。


39.如果对象的引用被置为null,占用内存将在何时被回收?


在下一个垃圾回收周期,这个对象将是可被回收的。


40.Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?


JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象,一直到垃圾收集器把这些对象回收掉之前,会一直占据堆内存空间。


41.串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?


吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。

串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。


42.在Java中,对象什么时候可以被垃圾回收?


当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。java垃圾回收是有jvm自动执行的,不是人为操作的,所以当不存在对某对象的任何引用时,该对象就处于被jvm回收的状态,并不是马上予以销毁。


43.JVM的永久代中会发生垃圾回收么?


垃圾回收不会发生在永久代。如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。永久代也是被回收的,所以,正确的永久代大小对避免Full GC是非常重要的因素。


44.Java中的两种异常类型是什么?他们有什么区别?


Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常。
不受检查的异常不需要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方法或者是构造函数的外面。相反,受检查的异常必须要用throws语句在方法或者是构造函数上声明。


45.Java中Exception和Error有什么区别?


Error类定义了不期望被用户程序捕获的异常,表示仅靠程序本身无法恢复的严重错误,比如说内存溢出、动态链接异常、虚拟机错误。应用程序不应该抛出这种类型的对象。假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以在进行程序设计时,应该更关注Exception类。
Exception类用于用户程序可以捕获的异常情况,是由Java应用程序抛出和处理的非严重错误,比如所需文件没有找到、零作除数,数组下标越界等。它的各种不同子类分别对应不同类型异常。可分为两类:Checked异常和Runtime异常


46.throw和throws有什么区别?


1.throw是在代码块内针对对象的,即在捕获方法内的异常并抛出时使用。throws是针对方法的,即将方法的异常信息抛出去。

2.throw是主动(在方法内容里我们是主动捕获并throw的),而throws是被动(在方法上是没有捕获异常进行处理,直接throws的)。


47.异常处理的时候,finally代码块的重要性是什么?


无论是否抛出异常,finally代码块总是会被执行。就算是没有catch语句同时又抛出异常的情况下,finally代码块仍然会被执行。最后要说的是,finally代码块主要用来释放资源,比如:I/O缓冲区,数据库连接。


48.异常处理完成以后,Exception对象何时回收?


Exception对象会在下一个垃圾回收过程中被回收掉。


49.finally代码块和finalize()方法各有什么作用,区别是什么?


finally:在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize:方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。注意:finalize不一定被jvm调用,只有当垃圾回收器要清除垃圾时才被调用。
区别
无论是否抛出异常,finally代码块都会执行,它主要是用来释放应用占用的资源。finalize()方法是Object类的一个protected方法,它是在对象被垃圾回收之前由Java虚拟机来调用的。


50.什么是Applet?


Applet是一种特殊的Java程序,它本身不能单独运行,需要嵌入在一个HTML文件中,借助浏览器或Appletviewer来解释执行.Applet可能通过网络传输,由浏览器自动装载并执行。


51.一个Applet有哪些生命周期?


一个Applet的生命周期分为以下四个阶段:
Init
每次加载时都会初始化一个小程序。此方法通知Applet,方法已经被装入系统,在第一次调用start方法之前总是先调用它。Init方法是Applet运行的起点。如果需要执行初始化任务,可以在Applet的子类中重载该方法,例如,在init方法中创建线程,而在destroy方法中消灭(destroy)相应的线程。
Start
开始执行一个小程序。此方法通知Applet开始执行,当调用init方法或者在Web页中再次访问时被调用。在Applet的子类中重载该方法,将每次访问该WWW页需执行的操作放入其中,例如,一个含自动画的Applet可以使用start方法恢复动画。
Stop
停止applet的执行。此方法通知Applet停止执行,当含有该Applet的Web页被其他页代替时调用该方法,也正是在Applet被消灭之前。在Applet的子类中重载该方法,将每次Web页不再可见时需执行的操作放入其中。
Destroy
在卸载小程序之前执行最后的清理。此方法通知Applet,它正在被收回,应该释放已分配给它的所有资源,stop方法总是在该方法调用之前被调用。


52.当一个applet被加载时会发生什么?


当一个applet被加载之后,首先,创建了一个applet控件类的实例。实例创建之后,小程序就开始自动初始化,初始化完成之后,applet开始运行。


53.Applet和Java应用程序有什么区别?


区别一

Java应用程序可以在浏览器之外独立执行的Java程序。Java Applet需要依托于浏览器来执行。
区别二
Java应用程序需要具有特定签名的主要方法才能开始执行。Java Applet不需要。
区别三
Java应用程序的安全策略比较宽松。Java小程序的安全策略通常为限制性的。


54.对Java小程序有什么限制?


基于安全的原因,对Java小程序施加了以下限制:
1.小程序无法加载库或定义本地方法。
2.一个applet通常不能读写执行主机上的文件。
3.小程序无法读取某些系统属性。
4.一个小程序不能建立网络连接,除了它来自的主机。
5.一个小程序不能在执行它的主机上启动任何程序。


55.什么是不可信任的小程序?


不受信任的小程序是那些无法访问或执行本地系统文件的Java小程序。默认情况下,下载的所有applet都被认为是不受信任的。


56.通过网络加载的Applet和通过文件系统加载的Applet有何区别?


区别一

通过网络加载的Applet,由小应用程序类加载程序加载,并受小应用程序安全管理程序强制执行的限制。
区别二
通过文件系统加载的Applet,由文件系统加载程序加载。允许通过文件系统加载的小程序读取文件,写入文件并在客户机上加载库。此外,允许通过文件系统加载的小程序执行进程。
区别三
通过文件系统加载的小程序不会通过字节代码验证程序。


57.applet类加载器的作用是什么?


作用一

当applet是从网络上加载的时候,它是由applet类加载器载入的。类加载器有自己的java名称空间等级结构。类加载器会保证来自文件系统的类有唯一的名称空间,来自网络资源的类有唯一的名称空间。
作用二
当浏览器通过网络载入applet的时候,applet的类被放置于和applet的源相关联的私有的名称空间中。然后,那些被类加载器载入进来的类都是通过了验证器验证的。验证器会检查类文件格式是否遵守Java语言规范,确保不会出现堆栈溢出(stack overflow)或者下溢(underflow),传递给字节码指令的参数是正确的。


58.弹出式选择菜单(Choice)和列表(List)有什么区别?


Choice是以一种紧凑的形式展示的,需要下拉才能看到所有的选项。Choice中一次只能选中一个选项。List同时可以有多个元素可见,支持选中一个或者多个元素。


59.布局管理器的作用是什么?常用的有哪些?


布局管理器用于组织容器中的组件。
常用的有:
FlowLayout 流式布局
BorderLayout 边框式布局
GridLayout 网格布局
CardLayout 卡片布局
GridBagLayout 复杂的网格布局


60.Scrollbar和JScrollPane有什么区别?


Scrollbar是一个组件,不是容器。
ScrollPane是容器,滚动事件由自己来处理。


61.Swing的方法中,有哪些是线程安全的?


Swing的规则是:当Swing组件被具现化时,所有可能影响或依赖于组件状态的代码都应该在事件派发线程中执行。
因此有3个线程安全的方法:
repaint(),revalidate(),andinvalidate()。


62.Component子类中,哪些支持绘画功能?


在Canvas,Frame,Panel,和小程序类支持的绘画。


63.MenuItem和CheckboxMenuItem有什么不同?


CheckboxMenuItem继承自MenuItem类,支持菜单选项可以选中或未选中。


64.BorderLayout的元素是如何布局的?


BorderLayout也是一种非常简单的布局策略,它把容器内的空间简单地划分为东、西、南、北、中五个区域,每加入一个组件都应该指明把这个组件加在哪个区域中。BorderLayout是顶层容器(Jframe,Jdialog和JApplet)的默认布局管理器。


65.GridBagLayout的元素是如何布局的?


GridBagLayout里面的元素是按照网格进行布局的。不同大小的元素可能会占据网格的多于1行或一列。因此,行数和列数可以有不同的大小。


66.在java中面板和框架的区别是什么?


JFrame上可以根据需要加载各种面板,在Swing中的JFrame窗体与AWT中的Frame窗体有一些不同。
JFrame由他的窗体本身加上其上的JRootPane根面板,JLayeredPane层面板,containPane内容面板,glassPane玻璃面板,JMenuBar菜单栏(可选,不包括在内)四部分组成。
其中根面板在JRootPane类中实现,层面板在JLayeredPane类中实现,他们都是JComponent的子类。而containPane和glassPane没有专门对应的类。


67.事件侦听器接口和事件适配器类之间的关系是什么?


监听器是接口,而适配器是个实现类。
适配器仅仅是为了编程的方便而加入的。实现了它所对应的监听器接口,“实现”的方式就是为每一个接口方法提供一个实现体。
有时一个接口有很多接口方法,编程时从适配器继承,可以仅仅实现你所感兴趣的事件响应方法。
总而言之,事件侦听器接口定义了特定事件的事件处理程序必须实现的方法。事件适配器提供事件侦听器接口的默认实现。


68.GUI组件如何处理自己的事件?


GUI组件通过实现相应的事件侦听器接口,并将添加自身为事件侦听器来处理自己的事件。在JDK中定义了多种事件类,用以描述GUI程序中可能发生的各种事件,组件在与用户交互时,遇到特定操作则会触发相应的事件,即自动创建事件类对象并提交给Java运行时系统。


69.Java的布局管理器比传统的窗口系统有什么优势?


Java使用布局管理器在所有窗口平台上布局组件的方式相同。另外,布局管理器不受绝对大小和位置的限制,因此它们能够适应窗口系统之间特定于平台的差异。


70.什么是Java用于所有Swing组件的设计模式?


Java中的Swing组件使用了MVC(视图-模型-控制器)设计模式。
布局管理器是策略模式;
swing组件是MVC模式、观察者模式;
边框是修饰模式。


71.JDBC是什么?


JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,可以用来构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时不必关心特定数据库的底层细节。


72. Driver在JDBC中有哪些作用?


JDBC驱动提供了特定厂商对JDBCAPI接口类的实现,驱动必须要提供java.sql包下面这些类的实现:Connection,Statement,PreparedStatement,CallableStatement,ResultSet和Driver。


73.解释一下Class.forName方法?


Class.forName方法是一个静态方法,用于加载将建立到数据库的连接的驱动程序,返回与给定的字符串名称相关联类或接口的Class对象。
该方法有两种形式:Class.forName(String name, boolean initialize, ClassLoader loader)和 Class.forName(String className)。第一种形式的参数name表示的是类的全名;initialize表示是否初始化类;loader表示加载时使用的类加载器。第二种形式则相当于设置了参数 initialize的值为 true,loader的值为当前类的类加载器。


74.PreparedStatement优于Statement的优点是什么?


优点一

用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次
优点二
PreparedStatement是预编译语句,尽最大可能提高了性能。预编译语句有可能被重复调用,语句在被编译器编译后的执行代码被缓存下来,下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
优点三
极大地提高了安全性,可以有效的避免SQL注入。
优点四
PreparedStatement对象可以重复使用不同的输入值到他们的查询。


75.CallableStatement是什么,有哪些作用?


CallableStatement 对象为所有的DBMS提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参,另一种形式不带结果参数。结果参数是一种输出 (OUT) 参数,是已储存过程的返回值。两种形式都可带有数量可变的输入(IN 参数)、输出(OUT 参数)或输入和输出(INOUT 参数)的参数。问号将用作参数的占位符。
存储过程由数据库存储和提供,存储过程可能会从用户获取输入值,并可能返回结果。存储过程的使用受到高度鼓励,因为它提供了安全性和模块性。


76.连接池是什么,有哪些作用?


与数据库的交互可能是昂贵的,关于数据库连接的打开和关闭。特别是当数据库客户端数量增加时,这个代价非常高,消耗了大量的资源。应用服务器在启动时获得一个数据库连接池,并保存在一个池中。连接请求由驻留在池中的连接提供。在连接结束时,请求将返回到池中,并可用于满足将来的请求。


77.连接池的工作原理是什么,有什么优点?


工作原理
当应用启动的时候,就初始化一些连接放在池中,如果客户端请求连接,则先判断池中是否还有连接:
如果有就返回客户端。
如果没有,判断当前连接数有没有超过系统允许的最大连接个数。没有超过的话则创建并返回连接,若超过则出错。
当用户用完连接之后,再将连接放回池中。

优点
可以实现连接的复用。


78.RMI是什么?


RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力,是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。
Java远程方法调用(Java RMI)是一种执行远程过程调用(RPC)的面向对象的Java API,支持直接传输序列化的Java类和分布式垃圾收集。远程方法调用(RMI)也可以看作是在远程运行的对象上激活方法的过程。


79.如何使用RMI开发?


使用RMI开发主要分为六个步骤:
1.定义一个远程接口,远程接口必须继承接口,每个方法必须抛出远程异常,方法参数和方法返回值都必须是可序列化的。
2.实现远程接口。
3.定义使用远程对象的客户程序。
4.产生远程访问对象的桩和框 。
5.注册远程对象。
6.运行服务器和客户程序。


80.什么是RMI架构的基本原理?


RMI体系结构是基于一个非常重要的行为定义和行为实现相分离的原则。RMI允许定义行为的代码和实现行为的代码相分离,并且单独运行在不同的JVM上。


81.RMI架构层的结构是如何组成的?


RMI体系结构由三层组成,分别是:
存根和骨架层(Stub and Skeleton Layer)
远程引用层(Remote Reference Layer)
传输层(Transport Layer)
Stub and Skeleton layer:这一层对于成员来讲,是透明的。该层主要负责拦截客户端向接口发起的方法调用,并将这些调用重定向到远程RMI服务。
Remote Reference Layer:这一层处理从客户端到服务器远程对象的引用的解释。该层解释和管理从客户端到远程服务对象的引用。连接方式是点到点的。
Transport layer:最后一层负责连接参与服务的两个JVM。这一层基于网络中机器之间的TCP / IP连接,提供了基本的连接和一些防火墙渗透策略。


82.RMI中的远程接口有哪些作用?


远程接口在RMI主要有以下作用:
1.用来标识接口,目的是为了辨识哪些接口是可以从非本地虚拟机调用方法的。
2.为每个远程对象定义构造函数。
3.为所有远程接口中的每个远程方法提供实现。
4.实现远程接口的类,应声明正在实现的远程接口。
5.所有作为远程对象的对象,必须直接或间接地实现这个接口。


83.java.rmi.Naming类的作用是什么?


java.rmi.Naming类提供了用于存储和获取对远程对象注册表中远程对象的引用的方法。Naming类的每个方法都可将某个名称作为其一个参数,该名称是使用以下形式的URL格式(没有scheme组件)的。


84.在RMI中绑定的意义是什么?


绑定是关联或注册远程对象的名称的过程,后面用来查找远程对象。远程对象可以使用Naming类的bind或rebind方法与名称关联。


85.使用命名类的bind()和rebind()方法有什么区别?


bind方法绑定负责将指定的名称绑定到远程对象。
rebind方法负责将指定的名称重新绑定到新的远程对象。若该名称存在绑定,绑定将被替换。


86.一个RMI程序正常运行的要点是什么?


为了使RMI程序正常运行,必须完成下面的工作:
1、汇编所有源文件。
2、用rmic生成存根。
3、开始rmiregistry。
4、启动RMIServer。
5、运行客户端程序。


87.存根在RMI中的意义是什么?


远程对象的存根充当远程对象的客户端本地代理或代理。调用者 调用本地存根上的一个方法,该方法负责在远程对象上执行该方法。


88.DGC的作用是什么?


DGC的作用主要有一下两点:
DGC在RMI中用于自动垃圾收集。
DGC使用引用计数算法为远程对象提供自动内存管理。


89.在RMI中使用RMISecurityManager的意义是什么?


RMISecurityManager用于提供可被RMI应用程序使用的安全管理器。若不设置安全管理器,则RMI的类加载器无法从远程下载任何的类。


90.Marshalling和Demarshalling是什么?


当应用程序想要通过网络将其内存对象传递给另一个主机或将其存储到存储器时,内存中的表示形式必须转换为适当的格式。这个过程被称为编组。相反操作被称为Demarshalling。


91.Servlet是什么?


Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是用Java编写的服务器端程序,主要的作用是处理客户端请求并生成动态Web内容。
一般情况下,Servlet主要用于处理或者存储由HTML表单提交的数据,提供动态内容并管理状态信息。


92.Applet和Servlet有什么区别?


Applet是客户端Java程序,Servlet是服务器端组件。
Applet运行在客户机上的Web浏览器中,Servlet运行在Web服务器上。
Applet可以使用用户接口类,servlet没有用户接口,等待客户端的HTTP请求,并在每个请求中产生一个响应。


93.GenericServlet和HttpServlet有什么区别?


HttpServlet是GenericServlet的子类。
GenericServlet是个抽象类,必须给出子类才能实例化。它给出了设计servlet的一些架构,定义了servlet生命周期,以及一些得到名字、配置、初始化参数的方法,其设计的是和应用层协议无关的。
HttpServlet是子类,所以具有GenericServlet的一切特性,还添加了doGet, doPost, doDelete, doPut, doTrace等方法用来处理http协议里命令的请求响应过程。


94.一个Servlet在生命周期中经历了哪些过程?


Servlet 在加载之后依次经历了实例化、服务、销毁三个过程。
init()
在服务器装入Servlet时,将会执行init()方法,目的是为了初始化Servlet对象。也可以通过配置服务器,在启动服务器或客户机首次访问Servlet时装入Servlet。Init()方法在整个生命周期中,仅仅执行一次,与访问Servlet的客户机数量无关。
service()
负责响应客户的请求,是Servlet的核心。当一个客户请求一个HttpServlet对象时,对象就会调用Service()方法,并传递给方法一个请求对象和一个响应对象作为参数。Service()方法在HttpServlet中已存在,默认的服务功能是调用与HTTP请求的方法相应的do功能。
destroy()
在服务器端停止且卸载Servlet时执行该方法,用来释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,所以在调用destroy()方法时,需要确认这些线程已经终止或完成。与init()方法一样,整个生命周期中,仅执行一次。


95.doGet()和doPost()有什么区别?


区别一

get是从服务器上获取数据,post是向服务器传送数据。
区别二
get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。过程对用户不可见。
区别三
对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
区别四
get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
区别五
get安全性非常低,post安全性较高。但是Get执行效率却比Post方法好。


96.什么是服务器端包含(SSI)?


服务端包含(SSI)是一种简单的解释型服务端脚本语言,多数情况下只用在Web上,用servlet标签嵌入。SSI最常用的场景把一个或多个文件包含到Web服务器的一个Web页面中。当浏览器访问Web页面的时候,Web服务器会用对应的servlet产生的文本来替换Web页面中的servlet标签。


97.什么是ServletChaining?


ServletChaining是一种传输方法,用来把一个Servlet的输出发送给另一个Servlet。第二个Servlet的输出可以发送给第三个Servlet,依次循环。链末端Servlet负责把响应发送给客户端。 


98.如何找出当前向你请求servlet的客户机?


ServletRequest类具有查找客户机的IP地址或主机名的功能。
getRemoteAddr()获取客户机的IP地址。
getRemoteHost()获取客户机的主机名。


99.HTTP响应的结构是什么?


HTTP响应由三部分组成:
状态代码:描述响应的状态。它可以用来检查请求是否已经成功完成。在请求失败的情况下,状态码可以用来找出失败的原因。如果您的servlet没有返回状态码,则默认返回成功状态码HttpServletResponse.SC_OK。
HTTP标头:它们包含更多关于响应的信息。例如,标题可以指定响应被视为陈旧的日期/时间,或用于安全地将实体传送给用户的编码形式。
Body:它包含响应的内容。正文可能包含HTML代码,图像等。主体由紧接在标题之后的HTTP事务消息中传输的数据字节组成。


100.sendRedirect和forward方法有什么区别?


区别一
sendRedirect方法可以定位到同一个web站点的其他应用,甚至可以通过传入绝对路径定位到别的web站点。forward方法只能转发给同一个web站点的资源。
区别二
sendRedirect转发后,浏览器url地址变为目的url地址。forward重定向后,浏览器url地址不变。
区别三
使用sendRedirect转发的过程,浏览器先向目的Servlet发送一次请求,Servlet看到sendRedirect将目的url返回到浏览器,浏览器再去请求目的url,目的url再返回response到浏览器。浏览器和服务器两次请求响应。
使用forward重定向的过程,是浏览器先向目的Servlet发送一次Request请求,然后再服务器端由Servlet再将请求发送到目的url,再由服务器端Servlet返回Response到浏览器端。浏览器和服务器一次请求响应。
区别四
sendRedirect方法由于两次浏览器服务器请求,所以有两个Request和Response。
forward方法的调用者与被调用者之间共享Request和Response。


101.什么是JSP?


JSP(Java Server Page)是一个文本文档,是一种将静态内容和动态生成内容混合在一起的技术。
JSP包含两种类型的文本:静态数据和JSP元素。静态数据可以用任何基于文本的格式表示,如HTML或XML。


102.如何处理JSP请求?


1.收到JSP请求之后,浏览器首先请求一个扩展名为.jsp的页面。
2.Web服务器读取请求,并使用JSP编译器将JSP页面转换为一个servlet类。需要注意的是,只有第一次请求或者是JSP文件变化的时候,才会编译JSP文件。
3.调用生成的servlet类处理浏览器的请求。
4.请求执行结束,servlet将响应发送回客户端。


103.JSP有哪些优点?


使用JSP技术有下面的一些优点:
1.页面可以预编译。
2.代码更新容易,因为JSP页面被动态地编译成了servlet。
3.可以将JSP页面轻松地与包含HTML或XML片段的静态模板组合,并生成动态内容。
4.可以提供定制的JSP标签库,页面作者可以使用类似XML的语法进行访问。
5.无需编辑使用应用程序逻辑的各个页面,可以在组件级别进行逻辑更改。


104.JSP中指令(Directive)的作用是什么?JSP中有哪些不同类型的指令?


指令用于设置页面级指令,从外部文件插入数据,指定自定义标签库。
指令定义<%@ and %>。
具体的指令如下表所示:


105.什么是JSP动作?有哪些作用?


使用XML语法的结构来控制servlet引擎的行为,是JSP动作。
JSP页面被请求时,执行JSP动作。JSP动作可以动态插入到文件中,重用JavaBeans组件,将用户转发到其它页面或为Java插件生成HTML。


106.JSP动作的语法是什么?有哪些标准动作元素?


语法只有一种:
<jsp:action_name attribute=”value”>
标准动作元素如下:


107.Scriptlet是什么?有哪些作用?


定义

在JSP技术中,scriptlet是一段有效的Java程序,程序嵌入在JSP页面中。当Web容器处理JSP页面时执行,通常会产生输出,并将输出发送到客户的输出流里。
标签(<% %>)中除了不能定义类和方法、不能用import引入类外,可以包含任何有效的Java代码。Java类在Jsp外部定义,可以使用page指令的import属性引入,或者以Java Bean的形式使用。Java中的方法必须在类内定义,但Jsp允许使用声明定义方法。需要注意的是,窗体(GUI)设计代码在Jsp中无效。
任何文本,HTML标记,JSP元素必须在scriptlet之外,当JSP收到客户的请求时,scriptlet就会被执行,如果scriptlet有显示的内容,这些显示的内容就被存在out对象中。
作用
1.用来声明将要用到的变量或方法;
2.用来编写JSP表达式;
3.使用任何隐含的对象和任何用<jsp:useBean>声明过的对象。


108.JSP中的Decalarations是什么?


JSP声明与Java中的变量声明类似。声明用于声明变量,以便随后在表达式或脚本中使用。注意,添加声明时,必须使用序列来包含添加的声明。


109.JSP中的表达式的作用是什么?


JSP表达式的作用是将脚本语言表达式的值(转换为字符串)插入Web服务器返回给客户端的数据流中。表达式是在<% = and %>标签之间定义的。既可以用来创建算术表达式,同样可以用来创建逻辑表达式。


110.JSP隐式对象是什么?有哪些?


JSP隐式对象是JSP容器在每个页面中提供给开发人员的Java对象,开发人员可以无需明确声明直接调用。JSP隐式对象也称为预定义变量。
JSP所支持的隐式对象:




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/543003
推荐阅读
相关标签
  

闽ICP备14008679号