java基础面试题剖析

来源:互联网 发布:ubuntu killall 编辑:程序博客网 时间:2024/05/21 05:37

关于final关键字
1、不能继承final修饰的类,不能覆盖final修饰的方法。
2、final修饰的变量,若没赋值,必须在构造器中赋初始值。

class A{
final int j;
public A(){
j = 9;//若没有此行,则编译不通过。
}
}
3、final类型的方法参数可定义,但不能改变。
class A{
void m(final int i){ //这一行的声明i为一个final没问题。
i ++ ; //但在这里面,i的值不能再被改变。
}
}

、Interface接口关键字
1、接口中的变量
1、必须初始化其值。
2、默认修饰符为public+static+final,其他的修饰符不允许。
2、接口中的方法
1、默认为public+abstract
2、其它修饰符 static,private,protected,final,synchronized,native均不能有。

interface A{
void s();
}
class AA implements A{
void s(){ //编译器在这里提示由于接口中的方法s()修饰符默认是public,
//而这里的s()默认是protected,小于public所以不允许。
}
}

abstract——抽象关键字
abstract class A{
private int i;
private void m();{}
}
抽象类中可以有私有的变量和私有属性,而接口就不行(原因如上),
这是因为java是按实例虚拟调用的,在生成某一个具体的对象可以有私有的属性或方法的。

abstract class A{
private int i;
private void m(){};
public abstract void n();//若是private则编译不通过。
}
抽象类中的抽象方法是让其他类继承的,如果本身都是私有的,就没有什么意义了

对象串行化——
1、仅仅对象类型的数据可以串行化。
2、标记为transient的数据不可以串行化。
存储一个对象到某种永久性存储叫persistence,如存储到磁盘、磁带或别的机器的内存中。
java.io.Serializable接口没有定义方法要实现,仅仅是一个标记暗示实现了这个接口的类可以被考虑串行化。没有实现这个接口的对象不能保存或存储它们的状态。
当一个对象被串行化的时候,仅仅数据被保留,而方法和构造器不是串行化的部分。
一些对象类是不能串行化的因为他们代表的数据是经常变化的。如java.io.FileInputSream和java.langThread。如果串行化的对象包含了不可串行化的对象,整个串行化动作会失败,并抛出NotSerializableException

1.2.3.3.2 例题2:请写一段html,完成下列表格的样子。注意:是单线边框。

该题解释:
陷阱一:
这道题初看起来很简单,似乎就是在考一个简单的“<table>”标记,于是有很多人都直接画出了一个table,至于单线边框的问题,他们总是用“border=”1″”来描述table。
这样的话,画出来的图一定是这样的如图所示。

还是一个双线表格,并没有像上图一样的单线边框。

陷阱二:本题表格中的文字是大小写不同的,有的用的是小写,有的用的是大写,一定要按照要求回答问题,这主要考察的是按照要求完成任务的能力。

正确答案:

<table width=”200″ border=”0″ cellspacing=”1″ bgcolor=”#000000″>
<tr>
<td bgcolor=”#FFFFFF”>A</td>
<td bgcolor=”#FFFFFF”>b</td>
<td bgcolor=”#FFFFFF”>C</td>
</tr>
<tr>
<td bgcolor=”#FFFFFF”>D</td>
<td bgcolor=”#FFFFFF”>e</td>
<td bgcolor=”#FFFFFF”>F</td>
</tr>
</table>

如果你做过网页中的表格,一定知道应该用这个方法获得单线边框的表格,因为这是一个典型的单线表格设计方法。当然,有的人用CSS来回答这个问题,也可以算对,只是方法比较复杂了

 hashCode()——作用
答:在实现Hash算法的集合里面,例如HashSet,该集合不能存放相同的数据,HashSet会根据对象的equals()和hashCode()方法来判断要存放的数据是否已经存在。Hash算法把HashSet划分成多个区域,每个区域就是以哈希码来作为该区域的唯一编码,而hashCode()的作用就是为某对象生成一个哈希码。Hash算法会认为如果两个对象的equals()比较后相等,那么它所对应的hashCode也应该相等,那么
HashSet会从该哈希码所对应的那个区域来查找是否已经存在该对象数据,不存在则放进去。而如果只提供equals方法,不提供hashCode()方法,就算判断出两个对象引用相等,但是HashSet会在不同的区域下寻找是否有该对象,这样,HashSet会把相同的对象引用存放在两个不同的区域里面。
注意:只有实现了Hash算法的集合hashCode才起作用。

Long s=new Long("1");//Long在这是一个类

byte b=s.byteValue();//返回byte

抽象接口不能实例化

forward 和redirect的区别
答:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。

事务的4大特性

答:原子性A,一致性C,隔离性I,永久性D

 import java.io.UnsupportedEncodingException;
public class CutString {
/**
* 判断是否是一个中文汉字
*
* @param c
* 字符
* @return true表示是中文汉字,false表示是英文字母
* @throws UnsupportedEncodingException
* 使用了JAVA不支持的编码格式
*/
public static boolean isChineseChar(char c)
throws UnsupportedEncodingException {
// 如果字节数大于1,是汉字
// 以这种方式区别英文字母和中文汉字并不是十分严谨,但在这个题目中,
这样判断已经足够了
return String.valueOf(c).getBytes(“GBK”).length > 1;
}
/**
* 按字节截取字符串
*
* @param orignal
* 原始字符串
* @param count
* 截取位数
* @return 截取后的字符串
* @throws UnsupportedEncodingException
* 使用了JAVA不支持的编码格式
*/
public static String substring(String orignal, int count)
throws UnsupportedEncodingException {
// 原始字符不为null,也不是空字符串
if (orignal != null && !”".equals(orignal)) {
// 将原始字符串转换为GBK编码格式
orignal = new String(orignal.getBytes(), “GBK”);
// 要截取的字节数大于0,且小于原始字符串的字节数
if (count > 0 && count < orignal.getBytes(“GBK”).length) {
StringBuffer buff = new StringBuffer();
char c;
for (int i = 0; i < count; i++) {
// charAt(int index)也是按照字符来分解字符串的
c = orignal.charAt(i);
buff.append(c);
if (CutString.isChineseChar(c)) {
// 遇到中文汉字,截取字节总数减1
–count;
}
}
return buff.toString();
}
}
return orignal;
}
public static void main(String[] args) {
// 原始字符串
String s = “我ZWR爱JAVA”;
System.out.println(“原始字符串:” + s);
try {
System.out.println(“截取前1位:” + CutString.substring(s, 1));
System.out.println(“截取前2位:” + CutString.substring(s, 2));
System.out.println(“截取前4位:” + CutString.substring(s, 4));
System.out.println(“截取前6位:” + CutString.substring(s, 6));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
运行结果:
1. 原始字符串:我ZWR爱JAVA
2. 截取前1位:我
3. 截取前2位:我
4. 截取前4位:我ZW
5. 截取前6位:我ZWR爱

类的初始化顺序

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化
顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。

如果有继承关系,先输入父类的静态块,接着输出子类的静态块,然后父类的构造方法,最后子类的构造方法。

不使用中间变量,使2数交换——

public class Cast{public static void main(String args[]){int a=5;int b=7;a=a+b;b=a-b;a=a-b;System.out.println("a="+a+"b="+b);}}

字母大小写转换

import java.util.*;public class Show4{public static void main(String args[]){Scanner s=new Scanner(System.in);System.out.println("请输入字母");String s2=s.next();if(s2.matches("\\d+")){System.out.println("请输入字母");}else{char c2=s2.charAt(0);if(c2>='a'&&c2<='z'){c2=(char)(c2-32);//转换为大写System.out.println(c2);}else if(c2>='A'&&c2<='Z'){c2=(char)(c2+32);//转换为小写System.out.println(c2);}}}}

java内存泄露——

当一个对象引用了另一个对象,而另一个对象为空时,会出现内存泄露,所以我们应该在使用对象时,判断下对象是否为空,这样可以有效的防止内存泄露。



 

原创粉丝点击