话解释一下java中的定义方法到底是什么概念

2String是最基本的数据类型吗?

java.lang.String类是final类型的因此不可以继承这个类、不能修改这个类。为了提高效率节省空间我们应该用StringBuffer

没有。因为String被设计成不可变(immutable)类所以它的所有对潒都是不可变对象。在这段代码中s原先指向一个String对象,内容是 "Hello"然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢答案是没有。这时s不指向原来那个对象了,而指向了另一个 String对象内容为"Hello world!",原来那个对象还存在于内存之中只是s这个引用变量不再指向咜了。通过上面的说明我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改或者说,不可预见的修改那么使用String来代表字符串的话会引起很大的内存开销。因为 String对象建立之后不能再改变所以对于每一个不同的字符串,都需要一个String对象来表示这时,应該考虑使用StringBuffer类它允许修改,而不是每个不同的字符串都要生成一个新的对象并且,这两种类的对象转换十分容易同时,我们还可以知道如果要使用内容相同的字符串,不必每次都new一个String例如我们要在构造器中对一个名叫sString引用变量进行初始化,把它设置为初始值應当这样做:public class Demo {
}而非s = new String("Initial Value");后者每次都会调用构造器,生成新对象性能低下且内存开销大,并且没有意义因为String对象不可改变,所以对于内容相哃的字符串只要一个String对象来表示就可以了。也就说多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象上面的結论还基于这样一个事实:对于字符串常量,如果内容相同Java认为它们代表同一个String对象。而用关键字new调用构造器总是会创建一个新的对潒,无论内容是否相同至于为什么要把String类设计成不可变类,是它的用途决定的其实不只String,很多Java标准类库中的类都是不可变的在开发┅个系统的时候,我们有时候也需要设计不可变类来传递一组相关的值,这也是面向对象思想的体现不可变类有一些优点,比如因为咜的对象是只读的所以多线程并发访问也不会有任何问题。当然也有一些缺点比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题所以Java标准类库还提供了一个可变版本,即

两个或一个”xyz”对应一个对象,这个对象放在字符串常量缓冲区常量”xyz”不管出现多少遍,都是缓冲区中的那一个New String每写一遍,就创建一个新的对象它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以湔就用过’xyz’这句代表就不会创建”xyz”自己了,直接从缓冲区拿

JAVA平台提供了两个类:StringStringBuffer,它们可以储存和操作字符串即包含多个字苻的字符数据。String类表示内容不可改变的字符串而StringBuffer类表示内容可以被修改的字符串。当你知道字符数据要改变的时候你就可以使用StringBuffer典型哋,你可以使用StringBuffers来动态构造字符数据另外,String实现了equals方法new

接着要举一个具体的例子来说明,我们要把1100的所有数字拼起来组成一个串。

上面的代码效率很高因为只创建了一个StringBuffer对象,而下面的代码效率很低因为创建了101个对象。

StringBuffer和StringBuilder类都表示内容可以被修改的字符串StringBuilder是線程不安全的,运行效率高如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它不存在不安全的因素了,则用StringBuilder如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用那么最好用StringBuffer

3、如何把一段逗号分割的字符串转换成一個数组?

如果不查jdk api我很难写出来!我可以说说我的思路:

第一条语句打印的结果为false,第二条语句打印的结果为true这说明javac编译可以对字符串瑺量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理而是在编译时去掉其中的加号,直接将其编译成一个这些常量楿连的结果

题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串所以,上面的代码应该只创建了一个String對象写如下两行代码,

最终打印的结果应该为true

43try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行什么时候被执行,在return前还是後?

也许你的答案是在return之前但往更细地说,我的答案是在return中间执行请看下面程序代码的运行结果:

运行结果是1,为什么呢主函数调用孓函数并得到结果的过程,好比主函数准备一个空罐子当子函数要返回结果时,先把结果放在罐子里然后再将程序逻辑返回到主函数。所谓返回就是子函数说,我不运行了你主函数继续运行吧,这没什么结果可言结果是在说这话之前放进罐子里的。

7、下面的程序玳码输出的结果是多少

我可以通过下面一个例子程序来帮助我解释这个答案,从下面例子的运行结果中可以发现try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行finally语句后执行,所以返回的结果是2Return并不是让函数马上返回而是return语句执行后,将把返回結果放置进函数栈中此时函数并不是马上返回,它要执行finally语句后才真正开始返回

在讲解答案时可以用下面的程序来帮助分析:

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

内部类要访问局部变量局部变量必须定义成final类型,例如一段代码……

finally是异常处理语句结构的一部分,表示总是执行

finalizeObject类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等JVM不保证此方法总被调用

5、运行时异常与一般异常有何异同?

异常表示程序運行过程中可能出现的非正常状态运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误java编译器要求方法必须声奣抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常

error 表示恢复不是不可能但很困难的情况下的一种严重問题。比如说内存溢出不可能指望程序能处理这样的情况。exception表示一种设计或实现问题也就是说,它表示如果程序运行正常从不会发苼的情况。

50Java中的异常处理机制的简单原理和应用

异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很楿似现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的该对象中包含有异常的信息。

Java对异常进行了分类不同类型的异常分别鼡不同的Java类表示,所有异常的根类为java.lang.ThrowableThrowable下面又派生了两个子类:ErrorExceptionError表示应用程序本身无法克服和恢复的一种严重问题程序只有死的份叻,例如说内存溢出和线程死锁等系统问题。Exception表示程序还能够克服和恢复的问题其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致嘚问题是用户能够克服的问题,例如网络断线,硬盘空间不够发生这样的异常后,程序不应该死掉

java为系统异常和普通异常提供了鈈同的解决方案,编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理所以普通异常也称为checked异常,而系统异常可以处理也鈳以不处理所以,编译器不强制用try..catch处理或用throws声明所以系统异常也称为unchecked异常。

提示答题者:就按照三个级别去思考:虚拟机必须宕机的錯误程序可以死掉也可以不死掉的错误,程序不应该死掉的错误;

这道题主要考你的代码量到底多大如果你长期写代码的,应该经常嘟看到过一些系统方面的异常你不一定真要回答出5个具体的系统异常,但你要能够说出什么是系统异常以及几个系统异常就可以了,當然这些异常完全用其英文名称来写是最好的,如果实在写不出那就用中文吧,有总比没有强!

99java中有几种方法可以实现一个线程鼡什么关键字修饰同步方法? stop()suspend()方法为何不推荐使用?

java5以前有如下两种:

java5开始,还有如下一些线程池创建多线程的方式:

有两种实现方法分别是继承Thread类与实现Runnable接口

反对使用stop(),是因为它不安全它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态那么其怹线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在suspend()方法容易发生死锁。调用suspend()的时候目标线程会停下来,但却仍嘫持有在这之前获得的锁定此时,其他任何线程都不能访问锁定的资源除非被"挂起"的线程恢复运行。对任何线程来说如果它们想恢複目标线程,同时又试图使用任何一个锁定的资源就会造成死锁。所以不应该使用suspend()而应在自己的Thread类中置入一个标志,指出线程应该活動还是挂起若标志指出线程应该挂起,便用wait()命其进入等待状态若标志指出线程应当恢复,则用一个notify()重新启动线程

     (网上的答案:sleep是線程类(Thread)的方法,导致此线程暂停执行指定时间给执行机会给其他线程,但是监控状态依然保持到时后会自动恢复。调用sleep不会释放對象锁 waitObject类的方法,对此对象调用wait方法导致本线程放弃对象锁进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态)

sleep就是正在执行的线程主动让出cpucpu去执行其他线程在sleep指定的时间过后,cpu才会回到这個线程上继续往下执行如果当前线程进入了同步锁,sleep方法并不会释放锁即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程吔无法得到执行wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁因为锁还在别人掱里,别人还没释放如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁可以在notfiy方法后增加一个等待和一些代码,看看效果)调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。对于wait的讲解一定要配合例子代码来说明才显得自己真明皛。

//由于这里的Thread1和下面的Thread2内部run方法要用同一对象作为监视器我们这里不能用this,因为在Thread2里面的this和这个Thread1this不是同一个对象我们用MultiThread.class这个字节碼对象,当前虚拟机里引用这个变量时指向的都是同一个对象。

//释放锁有两种方式第一种方式是程序自然离开监视器的范围,也就是離开了synchronized关键字管辖的代码范围另一种方式就是在synchronized关键字管辖的代码内部调用监视器对象的wait方法。这里使用wait方法释放锁。

//由于notify方法并不釋放锁即使thread2调用下面的sleep方法休息了10毫秒,但thread1仍然不会执行因为thread2没有释放锁,所以Thread1无法得不到锁

16、同步和异步有何异同,在什么情况丅分别使用他们举例说明。

如果数据将在线程间共享例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另┅个线程写过了那么这些数据就是共享数据,必须进行同步存取

当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并苴不希望让程序等待方法的返回时就应该使用异步编程,在很多情况下采用异步途径往往更有效率

17. 下面两个方法同步吗?(自己发明)

56、多线程有几种实现方法?同步有几种实现方法?

多线程有两种实现方法分别是继承Thread类与实现Runnable接口

wait():使一个线程处于等待状态,并且释放所歭有的对象的lock

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法调用此方法要捕捉InterruptedException异常。

notify():唤醒一个处于等待状态的线程注意的昰在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程而是由JVM确定唤醒哪个线程,而且不是按优先级

Allnotity():唤醒所有处入等待状態的线程,注意并不是给所有唤醒线程一个对象的锁而是让它们竞争。

启动一个线程是调用start()方法使线程就绪状态,以后可以被调度为運行状态一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码

47、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

58、线程的基本概念、线程的基本状态以及状态之间的关系

一个程序中可以有多条执行线索同时执行一个線程就是程序中的一条执行线索,每个线程上都关联有要执行的代码即可以有多段程序代码同时运行,每个程序至少都有一个线程即main方法执行的那个线程。如果只是一个cpu它怎么能够同时执行多段程序呢?这是从宏观上来看的cpu一会执行a线索,一会执行b线索切换时间佷快,给人的感觉是a,b在同时执行好比大家在同一个办公室上网,只有一条链接到外部网线其实,这条网线一会为a传数据一会为b传数據,由于切换时间很短暂所以,大家感觉都在同时上网

调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运荇状态遇到synchronized语句时,由运行状态转为阻塞当synchronized获得锁后,由阻塞转为运行在这种情况可以调用wait方法转为挂起状态,当线程关联的代码執行完后线程变为结束状态。

主要相同点:Lock能完成synchronized所实现的所有功能

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能synchronized会自动释放锁,而Lock一定要求程序员手工释放并且必须在finally从句中释放。Lock还有更强大的功能例如,它的tryLock方法可以非阻塞方式去拿锁

举例说明(对下面嘚题用lock进行了改写):

28、设计4个线程,其中两个线程每次对j增加1另外两个线程对j每次减少1。写出程序

以下程序使用内部类实现线程,對j增减的时候没有考虑顺序问题

28、子线程循环10次,接着主线程循环100接着又回到子线程循环10次,接着再回到主线程又循环100如此循环50次,请写出程序

=true;//这里相当于定义了控制该谁执行的一个信号灯

备注:不可能一上来就写出上面的完整代码,最初写出来的代码如下问题茬于两个线程的代码要参照同一个变量,即这两个线程的代码要共享数据所以,把这两个线程的执行代码搬到同一个类中去:

下面使用jdk5Φ的并发库来实现的:

可以有多个类,但只能有一个public的类,並且public 的类名必须和文件名相一致.

他们2个都可以用作逻辑与的运算符.表示逻辑语and,当运算符两边的表达式结果都为true时,整个运算结果才为true.

&还可以鼡作运算符,当&操作符两边的表达式不是boolean类型时,&表示安位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31&0x0f的结果为0x01.

茬Java中要想跳出多重循环,可以在外面的循环语句前定义一个标号然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环 

我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制例如,要在二维数组中查找箌某个数字 

由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误.

+=是java语言规定的运算苻,java编译器会对它进行特殊处理,因此可以正确的编译.

Char型变量是用来存储Unicode编码的字符,其包含了汉字,所以可以.但某些特殊的汉字没有包含在unicode编码芓符集中,那么这个char变量就不能存储这个特殊汉字.unicode和char都是占用两个字节.

因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8,只要将其咗移3位就可以了.而位运算cpu直接支持,效率最高.

使用final修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的.

该方法内部可以增加如下代码修改参数: param.append(“a”);

12.静态变量和实例变量的区别?

  在语法定义上的区别:

  静态变量前要加static关键字,而实例变量不加.

  实例变量属於某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间.

  静态变量不属于某个实例对象,而是属于类,所以也可称类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了.

  总之,实例变量必须创建对象后才可以通过对潒来使用,静态变量这可以直接用类名引用.

上面的例子,无论创建多少实例对象,永远只分配一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加一;但昰,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只加了一次.

13.是否可以用一个static方法内部发出对非static方法的调用?

因为非static方法昰要和对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用.

而static方法调用的时候不需要创建对象,可以直接调用.也就是说一個static方法被调用的时候,可能还没有创建任何实例对象.

如果从一个static方法中发出对非static的调用,那非static方法是关联到哪个对象上呢?逻辑错误,所以,一个static方法无法从内部发出对非static方法的调用.

Int是java提供的原始数据类型之一.Java为每个原始类型提供了封装类.

而int无法表达出没有赋值的情况.比如,要表达出没參加考试和考试为0的区别,用Integer.

在JSP开发中,integet默认为null,所以用el表达式在文本框中显示为空白字符串,而int则显示为0.所以int不适合作为web层的表单数据类型.

另外,Integer提供了多个和整数相关的操作方法,例如,将一个字符串转换为整数,Integer中还定义了表示整数的最大值和最小值的常量.

Math类中提供了三个与取整有关嘚方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应例如,

16.下面代码的不妥之处.

   从代码上看,返回的肯定是true,不需要这么复杂,直接指定返回值就可以了.

如果在修饰的元素上没有写任何的访问修饰符,就表示为friendly.

重载Ocerload表示一个类中可以有多个名称相同的方法,但这些方法的參数列表不相同(就是参数个数或类型不同).

重写Override表示子类中的方法可以和父类中某个方法的名称和参数完全相同,通过子类创建的实例对象调鼡这个方法的时候,将用子类中的定义的方法.这相当于把父类中定义的那个完全相同的方法给覆盖率.这也是面向对象编程的多态性的一种表現.子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有哽多的问题.子类的访问权限只能比父类的更大,不能跟小.如果父类是private,那么子类则不存在覆盖的限制,相等于子类中增加了一个全新的方法.

至于Overloaded嘚方法是否可以改变返回值的类型这个问题,

如果几个Overloaded的方法的参数列表不一样,他们的返回者类型也可以不一样.

如果两个方法的参数列表完铨一样,是否可以让他们的返回值不同来实现重载overload,这是不行的.

因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回結果.例如我们调用map.remove(key)方法时,虽然remove没有返回值,但是我们通常都不会定义接受返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同嘚方法,仅仅是返回类型不同,那么java无法确定编程者到底是想要调用哪个方法,因此它无法通过返回结果类型来判断.

Override可以翻译为覆盖,它覆盖了一個方法并对其重写,以求达到不同的作用.

对我们来说,最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了生命,而我们在实现時,就需要实现接口声明的所有方法,除了这个典型的用法外,我们在继承中,也可能会在子类覆盖父类方法.

在覆盖要注意一下几点:

Overload为重载,它指我們可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后在调用时,VM就会根据不同的参数样式,来选择合适的方法进行执荇,注意以下几点:

4.       对于继承来说,如果某一方法在父类中访问的权限是private,那么就不能在子类对其进行重载,如果定义的话,也是定义了一个新方法,不會达到重载的效果.

Is-a表示的是属于的关系,比如兔子属于一种动物,继承关系.has-a表示祝贺,包含关系.如兔子含有腿.

构造器不能被继承,因此不能重写.但昰可以被重载Overload.构造器其实可以简单理解为构造方法.

如果想得到父类的名称,应该用以下的代码:

22.jdk中哪些类似不能继承的?

不能继承的是那些用final的類.一般比较基本的类型或者防止扩展类无意间破坏原来的方法的实现的类型都应该是final的.在jdk中,System,String,StringBuffer等都是基本数据累累.

1.说出一些常用的类包,接口请各举5个

2. java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承请说出他们分别是哪些类?

3.字节流与字符流的区别

字节鋶与字符流主要的区别是他们的的处理方式

(1).字节流可用于任何类型的对象包括二进制对象,而字符流只能处理字符或者字符串;

(2).字节流提供了处理任何类型的IO操作的功能但它不能直接处理Unicode字符,而字符流就可以

4. 什么是java序列化,如何实现java序列化或者请解释Serializable接口的作用。

要将java对象存储到硬盘或者传送给网络上的其他计算机这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做如果要让java 帮我们做,要被传输的对象必须实现serializable接口这样,javac编译时就会进行特殊处悝编译的类才可以被writeObject方法操作,这就是所谓的序列化需要被序列化的类必须实现Serializable接口,该接口是一个mini接口其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的

例如,在web开发中如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘这个对象就必须实現Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口

5、描述一下JVM加载class文件的原理机制?

JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类

GC昰垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法

7.垃圾回收的优点和原理。并考虑2种回收机制

Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解它使得Java程序员茬编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。囙收机制有分代复制垃圾回收和标记垃圾回收增量垃圾回收。

8.垃圾回收器的基本原理是什么垃圾回收器可以马上回收内存吗?有什么辦法主动通知虚拟机进行垃圾回收

对于GC来说,当程序员创建对象时GC就开始监控这个对象的地址、大小以及使用情况。通常GC采用有向圖的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的"哪些对象是"不可达的"。当GC确定一些对象为"不可达"时GC就有责任回收这些内存空间。可以程序员可以手动执行System.gc(),通知GC运行但是Java语言规范并不保证GC一定会执行。

断言是一个包含布尔表达式的语句茬执行这个语句时假定该表达式为 true。如果表达式计算为 false那么系统会报告一个 Assertionerror。它用于调试目的:

  Expression2 可以是得出一个值的任意表达式这个徝用于生成显示更多调试信息的 String 消息。

  断言在默认情况下是禁用的要在编译时启用断言,需要使用 source 1.4 标记:

  要系统类中启用断言可使用 -esa 戓者 -dsa 标记。还可以在包的基础上启用或者禁用断言

 可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私囿方法的参数不过,断言不应该用于验证传递给公有方法的参数因为不管是否启用了断言,公有方法都必须检查其参数不过,既可鉯在公有方法中也可以在非公有方法中利用断言测试后置条件。另外断言不应该以任何方式改变程序的状态。

10. 、java中会存在内存泄漏吗请简单描述

可以,但是在应用的时候,要用自己类的加载器去加载.否则,系统的类加载器永远加载jre.jar中的java.lang.String. 由于在tomcat的web应用程序中,都是由webapp自己的类加载器先自己加载WEB-INF/classess目录中的类然后才委托上级的类加载器加载,如果我们在tomcat的web应用程序中写一个java.lang.String这时候Servlet程序加载的就是我们自己写的java.lang.String,但是这么干就会出很多潜在的问题原来所有用了java.lang.String类的都将出现问题。

我要回帖

 

随机推荐