LZ今天刚刚参加一家公司的Java实习生的面试和笔试,并将笔试题拍下来,以备下次使用:
public class Test
{
public static void main(String args[])
{
try
{
mb_operate();
}
catch(Exception e)
{
System.out.print("2");
}
System.out.print("3");
}
public static void mb_operate() throws Exception
{
try
{
throw new Exception();
}
finally
{
System.out.print("1");
}
}
}
答案:输出的结果是:123,此题考查的是异常的处理,首先会执行try里的mb_operate函数,但是发现在执行这个函数的时候,抛出异常,注意这个mb_operate函数的异常写法是正确的,但是它一定会执行finally,所以首先是输出1;然后因为有异常,被主函数给catch到,所以会输出2;然后因为最后会输出3.
第二题是考查RandomAccessFile类的,这个类是用来访问那些保存数据记录的文件的,然后就可以用seek()来访问记录了,并进行读和写了。这些记录的的大小不必相同,但是大小和位置必须是可知的。它的基本的构造方式是RandomAccessFile rf = new RandomAccessFile("file.bat","rw");这样定义的。
第三题还是考查关于文件流的内容。如java.io.DataOutputStream的构造方法的参数是java.io.FileOutputStream。
第四题考查的是关于socket通信方面的知识。不过是简单的socket的知识,Socket类的用来获取输入流的方法是getInputStream方法。
第五题是考查的是关于字节和byte之间的区别:Character流和Byte流的区别是什么?Java的流操作可以分为字节流和字符流。主要区别在于他们的处理方式,字节流是最基本的,所有的InputStream和OutputStream的子类都是用在处理二进制数据的,并且是按照字节来处理的。但是实际中有很多的文本,所以就提出了字符流。这两个之间的转化用InputStreamReader和OutputStreamWriter来关联,实际上是通过byte[]和String来关联。所以答案应该这样回答:前者是按照块来读写,而后者是按照字节来读写。
下一题是关于创建一个vector类的。问为Vector类添加一个元素的方法有哪些?
第一种必然是很基本的,就是Vector v = new Vector(); v.addElement(99); 表示在末尾增加一个对象。而还有一种是通过
下面这一题是非常经典的题目:
public class Test
{
public static void main(String args[])
{
int count = 0;
for(int i = 0; i < 10; i++)
count = count++;
System.out.println(count);
}
} 这里主要是关于Java的中间缓存变量的机制。就是其实在java内部,用的是j = j++;实际上是对应以下的内容
temp = j;
j = j + 1;
j = temp;
所以答案还是0.
以下这一题是关于静态变量的加载问题:
public class Test
{
static
{
a = 1;
}
public static int a = 2;
{
a = 3;
}
public static void main(String args[])
{
System.out.println(a);
}
}
答案是2. 但是如何解释:因为首先看这个函数的内容,这里的首先a是静态的,故第一次在执行时先加载,然后因为这个public static int a = 2,所以第二次会加载这个;但是因为这里的a =3并不会被加载,因为这一部分是属于程序块的内容,故不是静态加载的,所以是不会执行的,除非是在main函数里进行new一个新的Test类才可以。
下一题是关于Java的关键字,其中sizeof不是Java的关键字,其他几个如:instanceof,native,default都是Java的关键字。此题主要考察关于Java的基本功,但是很容易忽略,所以在平时复习的时候也是要注意这方面的积累。
下一题是关于多线程的内容。
public class Test
{
public static void main(String args[])
{
Thread t = new Thread()
{
public void run()
{
pong();
}
};
t.run();
System.out.print("ping");
}
static void pong()
{
System.out.print("pong");
}
} //问,最后输出的结果是什么?
此题考查的是Thread类中的start()和run()方法的区别了。start()方法用来启动一个线程,当调用start方法后,系统才会开启一个新的线程,进而调用run()方法来执行任务,而单独地调用run()方法就跟调用普通的方法是一样的,已经失去了线程的特性了。因此在启动一个线程的时候,一定要使用start()而不是run()。所以输出的是pongping。
7. 下列属于关系型数据库的是()
A. Oracle B MySql C IMS D MongoDB
此题考查的是关于数据的知识点,但是不怎么难。首先得了解数据库有两种基本的类型:关系型数据库和非关系型数据库。而且得注意的是关系型数据库的典型代表是DB2,MySQL,SQL Server等。而非关系型数据库则比如MongDB,Redis等。所以答案是A,B。下一题是考查几个典型的数据结构之间的继承关系。
linkedList继承自List;HashSet继承自AbstractSet。
以上这张图是关于Java一些基本类的继承关系图。
0.6332是属于什么什么数据类型的?
首先因为肯定不是float类型的,因为如果是,那么就必须要在数字后面加上f的,而这样表示的话,默认就是为double类型。所以就是为double类型的。
下面哪个流类属于面向字符的输入流?
A. BufferedWriter B. FileInputStream C. ObjectInputStream D. InputStreamReader
这道题还是考查关于字节流和字符流的关系。因为Java的IO操作中有面向字节(Byte)和面向字符的两种方式。而面向字节的操作为8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和OutputStream的子类。面向字符的操作以字符为单位对数据进行操作,在读的时候将二进制数据转化为字符,在写的时候将字符转化为二进制数据,这些类都是Reader和Writer的子类。总结:以InputStream(输入)/OutputStream(输出)为后缀的是字节流;以Reader(输入)/Writer(输出)为后缀的是字符流。
所以此题选的是D。因为A和D都是面向字符的,而D是输入流;而A则是输出流。故选D。
以下语句中的list扩充了几次?
ArrayList list = new ArrayList(20);
答案是 0 次。
因为这里只是用来生成了一个ArrayList,并且声明了大小是20,所以是在第一次加载的时候,将这个20的大小给指定了。所以实际上只加载了一次,并且并没有扩充。
以下一题是关于super和this的。如果子类的构造函数要引用调用父类的构造方法,必须把super放在函数的首位。
Constructor call must be the first statement in a constructor
for example:
class Base
{
Base()
{
System.out.println("Base");
}
}
public class Checket extends Base
{
Checket()
{
super(); //一定要放在第一行
System.out.println("Checket");
}
public static void main(String args[])
{
Checket c = new Checket();
}
}
还要注意的是,this是指向这个方法的对象的引用,而如果是static的话,那么就是这个类本身的方法了。因而this不能放在static中。而super也是不能用在static中的。
下一题是关于java的几个访问修饰符的访问的权限的:
这几个主要是private,default,protected,public.
首先是private,这个是私有的,只允许在类中来访问,并且是类的成员才有资格来访问,注意:类的子类也是不可以访问的;它的权限是最小的。第二个是default,这个是默认的权限。这个权限默认是比较小的,并且是只允许包里的一些方法去访问,而且也不允许其继承的子类去访问。权限稍大一点的是protected,这个是保护的权限,它允许在同一个类下的成员,同一个包下的成员和其继承的子类来访问它,但是唯独不允许其他包下的类来访问它。权限最大的是public,这个是公开的权限,并且这个权限是允许所有的对象来访问的,包括类,包,其子类和其他包里的对象,所以权限最大。
下一题是关于JDBC的内容的,关于JDBC的事务处理的步骤:
1.获取connection对象;2.取消connection的事务自动提交方式;
Connection conn = DriverManager.getConnection("链接url","用户名","密码");
conn.setAutoCommit(false);
3.捕获执行代码(try/catch),如果执行过程顺利,提交事务;一旦发生异常,回滚事务。
try
{
conn.setAutoCommit(false);
stmt=conn.createStatement();
stmt = conn.executeUpdate("sql语句");
conn.commit();
}
catch(Exception e){
e.printStackTrace();
conn.rollback();
}
3.关闭连接,该步骤最好放在finally代码块里,这样就可以保证关闭连接的操作执行了。
finally{
if(stmt!=null)
stmt.close();
if(conn!=null)
conn.close();
}
以下一些是判断题:default在switch里是必须的。 错。
求X的y次方,其表达式是Math.pow(y,x). 错。应该是 Math.pow(x,y).
子类可以从多个超类中派生出来。 错。 JAVA是单继承。
在哈希时,随着装载因子的增加,发生冲突的概率减少。 错。装在因子的定义是: .填入表中的元素个数 / 散列表的长度。所以装载因子越大,说明填入表中的元素必然越多,那么发生冲突的概率自然也就越大。
String的replace方法只能返回一个新的字符串对象。 对。
线程执行run()方法结束或抛出一个不能捕获的例外,线程进入等待状态。 错。因为线程执行完run()方法后,那么线程就进入死亡状态了。