19、final的用法?
1.修饰变量时:变量的值在不可以被修改。
注意:在被修饰的对象是基本数据类型时,被修饰对象的值不能被修改。 在修饰的对象是引用数据类型时,对象的引用地址不会被改变,但是对象的值可以改变。
@Test
public void test04(){
final int a=1;
a=2;
}
2.修饰方法参数时:内修饰的参数不能被修改。
@Test
public void test06(final int a){
a=2;
}
3.修饰方法时:第三种方式,即用final关键字修饰方法,它表示该方法不能被覆盖。这种使用方式主要是从设计的角度考虑,即明确告诉其他可能会继承该类的程序员,不希望他们去覆盖这个方法。这种方式我们很容易理解,然而,关于private和final关键字还有一点联系,这就是类中所有的private方法都隐式地指定为是final的,由于无法在类外使用private方法,所以也就无法覆盖它。
4.修饰类时:用final修饰的类是无法被继承的。
20、static都有哪些用法?
1.修饰成员变量:共享一个内存地址。
2.修饰成员方法:可以直接通过类名调用
3.静态代码块:在类加载的时候同时加载了。
4.静态导入:将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。
21、3*0.1==0.3的输出结果是什么?
@Test
public void test06(){
System.out.println(0.1*3);
System.out.println((3*0.1)==0.3);
}
22、a=a+b与a+=b有什么区别吗?
@Test
public void test06(){
int a=1;
a+=1;
System.out.println(a);
short b=1;
b=b+1;
System.out.println(b);
}
前者是将两个直接相加,而后者是将+=后面的数值转成前面的类型,在进行相加。 问:上述的代码会报错吗? 答:会,short的类型与右边的不一样,会报错。 解决方案:
@Test
public void test06(){
int a=1;
a+=1;
System.out.println(a);
short b=1;
b+=1;
System.out.println(b);
}
23、try catch finally,try里有return,finally还执行么?
1.执行,并且finally的执行早于try里面的return 2.不管有木有出现异常,finally块中代码都会执行; 3.当try和catch中有return时,finally仍然会执行; 4.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的 值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数 返回值是在finally执行前确定的; 5.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
24、Excption与Error包结构?
Java可抛出(Throwable)的结构分为三种类型:被检查的异常(CheckedException),运行时异常 (RuntimeException),错误(Error)。
1、运行时异常
定义:RuntimeException及其子类都被称为运行时异常。 特点:Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws 声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。例如,除数为零时产生的 ArithmeticException异常,数组越界时产生的IndexOutOfBoundsException异常,fail-fast机制产 生的ConcurrentModificationException异常(java.util包下面的所有的集合类都是快速失败 的,“快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。当多个线程对集合进行结构上 的改变的操作时,有可能会产生fail-fast机制。记住是有可能,而不是一定。例如:假设存在两个线 程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的 结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生fail-fast机制,这个错叫并发修改异常。Failsafe,java.util.concurrent包下面的所有的类都是安全失败的,在遍历过程中,如果已经遍历的数 组上的内容变化了,迭代器不会抛出ConcurrentModificationException异常。如果未遍历的数组 上的内容发生了变化,则有可能反映到迭代过程中。这就是ConcurrentHashMap迭代器弱一致的 表现。ConcurrentHashMap的弱一致性主要是为了提升效率,是一致性与效率之间的一种权衡。 要成为强一致性,就得到处使用锁,甚至是全局锁,这就与Hashtable和同步的HashMap一样 了。)等,都属于运行时异常。 常见的五种运行时异常: ClassCastException(类转换异常) IndexOutOfBoundsException(数组越界) NullPointerException(空指针异常) ArrayStoreException(数据存储异常,操作数组是类型不一致) BufferOverflowException
2、被检查异常
定义:Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异 常。
特点 : Java编译器会检查它。 此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕 获处理,否则不能通过编译。例如,CloneNotSupportedException就属于被检查异常。当通过 clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常。被检查异常通常都是可以恢复的。 如: IOException FileNotFoundException SQLException 被检查的异常适用于那些不是因程序引起的错误情况,比如:读取文件时文件不存在引发的 FileNotFoundException 。然而,不被检查的异常通常都是由于糟糕的编程引起的,比如:在对象 引用时没有确保对象非空而引起的 NullPointerException。
3、错误
定义 : Error类及其子类。 特点 : 和运行时异常一样,编译器也不会对错误进行检查。 当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修 复这些错误的。例如,VirtualMachineError就属于错误。出现这种错误会导致程序终止运行。 OutOfMemoryError、ThreadDeath。 Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等
25、OOM你遇到过哪些情况,SOF你遇到过哪些情况?
OOM
除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM)异常的 可能。
Java Heap 溢出
一般的异常信息:java.lang.OutOfMemoryError:Java heap spacess。 java堆用于存储对象实例,我们只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来 避免垃圾回收机制清除这些对象,就会在对象数量达到最大堆容量限制后产生内存溢出异常。 出现这种异常,一般手段是先通过内存映像分析工具(如Eclipse Memory Analyzer)对dump出来的 堆转存快照进行分析,重点是确认内存中的对象是否是必要的,先分清是因为内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。 如果是内存泄漏,可进一步通过工具查看泄漏对象到GCRoots的引用链。于是就能找到泄漏对象是 通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收。 如果不存在泄漏,那就应该检查虚拟机的参数(-Xmx与-Xms)的设置是否适当。
2,虚拟机栈和本地方法栈溢出
如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常 这里需要注意当栈的大小越大可分配的线程数就越少。
3,运行时常量池溢出
异常信息:java.lang.OutOfMemoryError:PermGenspace 如果要向运行时常量池中添加内容,最简单的做法就是使用String.intern()这个Native方法。该方法 的作用是:如果池中已经包含一个等于此String的字符串,则返回代表池中这个字符串的String对 象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。由于常量 池分配在方法区内,我们可以通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,从而间接 限制其中常量池的容量。
4,方法区溢出
方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。也有可 能是方法区中保存的class对象没有被及时回收掉或者class信息占用的内存超过了我们配置。 异常信息:java.lang.OutOfMemoryError:PermGenspace 方法区溢出也是一种常见的内存溢出异常,一个类如果要被垃圾收集器回收,判定条件是很苛刻 的。在经常动态生成大量Class的应用中,要特别注意这点。
SOF(堆栈溢出StackOverflow)
StackOverflowError 的定义:当应用程序递归太深而发生堆栈溢出时,抛出该错误。 因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容 量超过1m而导致溢出。 栈溢出的原因:递归调用,大量循环或死循环,全局变量是否过多,数组、List、map数据过大。
|