Java面试题及解析

1、如下代码

public class Test {
        public int aMethod() {
            static int i = 0;
            i++;
            return i;
        }

        public static void main(String args[]) {
            Test test = new Test();
            test.aMethod();
            int j = test.aMethod();
            System.out.println(j);
        }
    }

输出结果是什么?
A. 0
B. 1
C. 2
D. 编译失败
(因为static修饰的变量代表全局的,在类加载的时候就会加载,如果放在非static方法里,又成局部的了,自然不对了;个人理解,放在非static方法里了,因为方法没有加载到,自然不会加载方法里的变量了,但是却用static修饰了,自然冲突了)


2、下列哪种说法是正确的()

A.实例方法可直接调用超类的实例方法
B.实例方法可直接调用超类的类方法
C.实例方法可直接调用其他类的实例方法
D.实例方法可直接调用本类的类方法
(类方法即用static修饰的方法,不能使用this,super关键字,不能调用非static的成员变量,非static的成员方法,只能访问static修饰的成员变量,成员方法)


3、下面代码执行的结果是()

class Super {
        public Integer getLenght() {
            return new Integer(4);
        }
    }
public class Sub extends Super {
    public Long getLenght() {
        return new Long(5);
    }

    public static void main(String[] args) {
        Super sooper = new Super();
        Sub sub = new Sub();
        System.out.println(sooper.getLenght().toString() + "," + sub.getLenght().toString());
    }
}

A. 4,4
B. 4,5
C. 5,4
D. 编译失败
(在重写父类方法的时候不能修改返回值类型。重写的注意事项:(1)重写方法不能比被重写方法限制有更严格的访问级别;(2)参数列表必须与被重写方法的相同;(3)返回类型必须与被重写方法的返回类型相同;(4)重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常,注意:这种限制只是针对检查异常,至于运行时异常RuntimeException及其子类不再这个限制之中;(5)不能重写被标识为final的方法;(6)如果一个方法不能被继承,则不能重写它,如private方法。)


4、在Servlet处理请求的方式为:

A.以进程的方式
B.以程序的方式
C.以线程的方式(sevlet是以多线程处理的一个web 容器)
D.以响应的方式


5、 按照MVC设计模式,JSP用于实现:

A.Model
B.View
C.Controller
D.容器


6、JDBC中,用于表示数据库连接的对象是:

A.Statement
B.Connection
C.DriverManager
D.PreparedStatement


7、在什么时候Float对象会被垃圾回收()

public Object m() {
        Object o = new Float(3.14F);
        Object[] oa = new Object[1];
        oa[0] = o;
        o = null;
        oa[0] = null;
        return o;
    }

A.在“oa[0] = o;”之后
B.在“o = null;”之后
C.在“oa[0] = null;”之后
D.在“return o;”之后
(垃圾回收的判断条件是对象不可达,上面代码中与Float对象可达的有对象o和oa[0],所以在这两个对象都为空之后就可以回收了)


8、下面代码的输出结果()

class Base {
        Base() {
            System.out.print("Base");
        }
    }

    public class Alpha extends Base {
        public static void main(String[] args) {
            new Alpha();
            new Base();
        }
    }

A. Base
B. BaseBase
C. 代码运行但没有输出
D. 运行时抛出异常
(子类如果没有构造方法,默认调用父类的无参的构造方法)


9、在Servlet的生命周期中,容器只调用一次的方法是:

A.service
B.getServletConfig
C.init
D.destroy
(init() 和destroy() 即 初始化 和 销毁 只执行一次)


10、 在一个线程中 Sleep ( 1000 )方法,将使得该线程在多少时间后获得对 CPU 的控制(假设睡眠过程中不会有其他事件唤醒该线程)

A. 正好1000毫秒

B. 1000毫秒不到

C. =>1000毫秒

D. 不一定
(因为在1000ms之后,只是让线程重新回到队列中,如果还有其它线程在执行,还会继续等待,不会立即取得CPU的控制)


11、在WEB-INF目录下,必须存放的文件为:

A.class文件

B.web.xml

B.jar文件

D.html文件


12、下面关于垃圾收集的说法正确的是:

A. 一旦一个对象成为垃圾,就立刻被收集掉。

B. 对象空间被收集掉之后,会执行该对象的finalize方法

C. finalize方法和C++的析构函数是完全一回事情

D. 一个对象成为垃圾是因为不再有引用指着它,但是线程并非如此。
(只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的;垃圾回收器准备释放内存的时候,会先调用finalize();如果你为某个对象定义了finalize() 方法,JVM 可能不会调用它,因为垃圾回收器不曾释放过那些对象的内,调用System.gc() 也不会起作用,因为它仅仅是给 JVM 一个建议而不是命令。)


13、下面的语句会产生什么样的输出?

System.out.println(4&7);

A.4

B.5

C.6

D.7

E.0
(0100 & 1111 = 0100 即为4)


14、下面的程序中,temp的最终值是什么?

long temp=(int)3.9;
temp%=2;

A .0
B .1
C .2
D .3
E .4
(long temp=(int)3.9执行结束后,temp的值为3。因为强转为int的时候是直接舍弃小数点后的内容)


15、以public修饰的类如:public class Car{…} 则Car( )

A、可被其它程序包中的类使用
B、仅能被本程序包中的类使用
C、不能被任意其它类使用
D、不能被其它类继承


16、Java程序的执行过程中用到一套JDK工具,其中java.exe是指( )

A.Java文档生成器
B.Java解释器 (javac是编译器,Java是运行Java程序的,也就是启动虚拟机,把.class字节码文件解释成机器码,然后运行)
C.Java编译器
D.Java类分解器


17、下列关于构造方法的叙述中,错误的是( )

A. Java语言规定构造方法名与类名必须相同

B. Java语言规定构造方法没有返回值,但不用void声明

C. Java语言规定构造方法不可以重载

D. Java语言规定构造方法只能通过new自动调用

(当不声明构造函数时,默认有一个无参数的构造方法;构造函数不能有返回类型;构造函数可以是私有的,这样外部就无法由私有的构造函数创建对象,如单例模式)


18、下面哪项不是response对象的方法()

A. setContentType(String contentTypestr)

B. setHeader(String headername,String headervalue)

C. getParameter(String str)

D. sendError(int errorcode)


19、下面哪项不属于SQL语句的子类()

A. 数据定义语言(DDL)

B. 数据查询语言(DQL)

C. 事务控制语言(TCL)

D. 数据插入语言 (DIL)

(SQL语言包括四类种主要程序设计语言类别的语句:数据定义语言(DDL)、数据操作语言(DML)、数据控制语言(DCL)、事务控制语言(TCL)。
数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句;
数据操作语言(DML),例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句;
数据查询语言(DQL),例如:SELECT语句。(一般不会单独归于一类,因为只有一个语句);
数据控制语言(DCL),例如:GRANT、REVOKE等语句;
事务控制语言(TCL),例如:COMMIT、ROLLBACK等语句。)


20、下面实例化Inner哪个是正确的()

public class Outer {

        public void someOuterMethod() {
            // Line 3
        }

        public class Inner {
        }

        public static void main(String[] argv) {
            Outer o = new Outer();
            // Line 8
        }
    }

A. new Inner(); // At line 3

B. new Inner(); // At line 8

C. new o.Inner(); // At line 8

D. new Outer.Inner(); // At line 8

E.o.new Inner();
(纯属个人看法:此题考的就是内部类,所以要访问内部类里面的构造方法,就必须得由外部类的对象去访问。A可以,是因为A放的位置是在外部类的实例方法里,必须通过外部类的对象去调用才会加载,而类方法是在加载类的时候就会加载。实际也考对static的理解。)


21、按照学生平均成绩(avg_grade) 将students表中的数据检索出来,下面SQL语句正确的是( )

A. SELECT * FROM students ORDER BY avg_grade

B. SELECT * FROM students GROUP BY avg_grade ASC

C. SELECT * FROM students ORDER BY avg_grade DESC

D. SELECT * FROM students ORDER by avg_grade asc
(题目要求的是查出students中的数据,B 怎么都是不对的)


22、下列是jsp作用域的通信对象的有( )

A.Session

B. application

C. pageContext

D. cookie


23、在接口中以下哪条定义是正确的? ( )

A. void methoda();

B. public double methoda();

C. public final double methoda();

D. static void methoda(double d1);

E. protected void methoda(double d1);

(接口only public, abstract, default, static and strictfp are permitted,而且只有default, static修饰的方法才能有方法体,而且必须有方法体,也就是方法后面得有大括号)


24、下面哪个语句正确地声明一个整型的二维数组?

A. int a[][] = new int[][];

B. int a[10][10] = new int[][];

C. int a[][] = new int[10][10];

D. int [][]a = new int[10][10];

E. int []a[] = new int[10][10];


25、8.下列说法错误的有()

A. 数组是一种对象

B. 数组属于一种原生类

C. int number=[]={31,23,33,43,35,63}

D. 数组的大小可以任意改变


26、不能用来修饰interface的有()

A.private
B.public
C.protected
D.static


27、下列说法错误的有(ACD)

A. 在类方法中可用this来调用本类的类方法

B. 在类方法中调用本类的类方法时可直接调用

C. 在类方法中只能调用本类中的类方法

D. 在类方法中绝对不能调用实例方法
(类方法里不能用this,调用实例方法的时候,用对象去调用即可)


28、如下代码

class A {

    A() { }

}

class B extends A {

}

哪两个说明是正确的?

A. B类的构造器应该是 public.

B. B类的构造器应该是没有参数

C. B类的构造器应该调用this().

D. B类的构造器应该调用super().
(子类初始化的时候必须调父类的构造方法,即使没有显示调用,仍然会调用父类的构造方法)


29、如下代码:

public class X {

public X aMethod() { return this;}

}

public class Y extends X {

}

哪两个方法能加到Y类的定义中?

A. public void aMethod() {}

B. private void aMethod() {}

C. public void aMethod(String s) {}

D. private Y aMethod() { return null; }

E. public X aMethod() { return new Y(); }
(C属于重载,其实跟父类的同名方法没什么关系,E属于重写,覆盖父类的同名方法)


30、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。

31、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

32、数据连接池的工作机制是什么?

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

33、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口同步的实现方面有两种,分别是synchronized,wait与notify。(我感觉这个答案并不是那么好)


34、描述forward 和redirect的区别

forward是服务器请求资源,服务器直接访问目标地址的URL,目标地址可以接收request 请求参数,然后把结果发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求哪个地址,浏览器会重新进行请求,此时不能用request传值,浏览器的地址栏会变成新的地址。

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

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

36、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

37、说出Servlet的生命周期,并说出Servlet和CGI的区别

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

38、请编写一JSP程序,它提供一个征求客户意见的文本区,在客户提交意见后,它能将意见及其他客户以前提交的意见一起显示出来

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>提意见</title>
</head>
<body>
    <form method="post" action="display.jsp">
        <textarea name="suggestion" cols="80" rows="5" style="width: 100%">
        </textarea>
        <input type="submit" value="提交">
    </form>
</body>
</html>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>意见展示</title>
</head>
<body>
    <% request.setCharacterEncoding("UTF-8");
    String suggestion = request.getParameter("suggestion");
    Map<Integer, String> suggestionMap = (Map<Integer, String>)session.getAttribute("suggestionMap");
    if(suggestionMap == null){
        suggestionMap = new HashMap<Integer, String>();
    }
    if(suggestion == null){
        suggestion = "这次没收到";
    }
        suggestionMap.put(suggestionMap.size()+1, suggestion);
        session.setAttribute("suggestionMap", suggestionMap);
        for(int i = 1; i <= suggestionMap.size(); i++){%>
            <textarea rows="5" cols="50" style="width: 100%"><%=suggestionMap.get(i) %></textarea>
        <%}
    %>
    <a href="test.jsp"><input type="reset" value="返回"></a>
</body>
</html>

(我之前前端不是用的jsp,才学的,比较坑,会的就别看了,我自己都看不下去了 - -!)


39、.写一个算法对1,8,5,2,4,9,7进行顺序排列

public static void main(String[] argv) {
        int [] arry = {1, 8, 5, 2, 4, 9, 7};
        for (int i = 0; i < arry.length - 1; i++) {
            int count;
            for (int j = i + 1; j < arry.length; j++) {
                if (arry[i] < arry[j]) {
                    count = arry[i];
                    arry[i] = arry[j];
                    arry[j] = count;
                }
            }
        }
        for (int i = 0; i < arry.length; i++) {
            System.out.println(arry[i]);
        }
    }

40、写一段Jdbc连接Oracle的程序,并实现数据

public void testOracle()
    {
        Connection con = null;// 创建一个数据库连接
        PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement
        ResultSet result = null;// 创建一个结果集对象
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");// 1、加载Oracle驱动程序
            System.out.println("开始尝试连接数据库!");
            String url = "jdbc:oracle:" + "thin:@127.0.0.1:1521:XE";// 数据库地址
            String user = "system";// 用户名,系统默认的账户名
            String password = "147";// 你安装时选设置的密码
            con = DriverManager.getConnection(url, user, password);// 2、获取连接
            System.out.println("连接成功!");
            String sql = "select * from student where name=?";// 预编译语句,“?”代表参数
            pre = con.prepareStatement(sql);///3、实例化预编译语句
            pre.setString(1, "刘显安");// 设置参数,前面的1表示参数的索引,而不是表中列名的索引
            result = pre.executeQuery();///4、执行查询,注意括号中不需要再加参数
            while (result.next())
                // 当结果集不为空时
                System.out.println("学号:" + result.getInt("id") + "姓名:"
                        + result.getString("name"));
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                ///5、逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源
                // 注意关闭的顺序,最后使用的最先关闭
                if (result != null)
                    result.close();
                if (pre != null)
                    pre.close();
                if (con != null)
                    con.close();
                System.out.println("数据库连接已关闭!");
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }

(PreparedStatement和statement的区别:1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程;2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处;3.PreparedStatement相对于statement更安全,而且传入的参数会自动强转为数据库里对应字段的类型。)


41、请利用JSP编写一简易的购物车程序,它包括一购物界面及往购物车中添加商品与删除商品功能,并能将用户当前已购的所有商品显示出来。


42、写一个Singleton(单例模式)出来

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}  

43、请编写一JSP程序,它能根据输入的订单号查寻出该订单的详细信息,包括订单用户名及价钱,其中订单号以请求参数的形式传给该JSP。订单信息都保存在SQLSERVER数据库中。并要求将查寻到的订单信息以表格的形式显示给用户。

  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值