牛客错题集(四)

1.在try的括号里面有return一个值,那在哪里执行finally里的代码?
正确答案: B 你的答案: A (错误)
不执行finally代码
return前执行
return后执行

每一本Java书都有讲过。“假设利用 return 语句从 try 语句块中退出。在方法返回前,finally子句的内容将被执行。如果 finally 子句中也有一个 return 语句,这个返回值将会覆盖原始的返回值。”

finally 语句块是在 try 或者 catch 中的 return 语句之前执行的。更加一般的说法是,finally 语句块应该是在控制转移语句之前执行,控制转移语句除了 return 外,还有 break 和 continue。另外,throw 语句也属于控制转移语句。虽然 return、throw、break 和 continue 都是控制转移语句,但是它们之间是有区别的。其中 return 和 throw 把程序控制权转交给它们的调用者(invoker),而 break 和 continue 的控制权是在当前方法内转移
https://www.ibm.com/developerworks/cn/java/j-lo-finally/

是关于 try return finally 的详细解释文档,很有说服力。

错题

清单 6.
public class Test { 
public static void main(String[] args) { 
       System.out.println("return value of getValue(): " + getValue()); 
    } 
 
public static int getValue() { 
       int i = 1; 
       try { 
                return i; 
       } finally { 
                i++; 
       } 
    } 
}
清单 6 的执行结果:

1
return value of getValue(): 1

在 finally 语句块(iinc 0, 1)执行之前,getValue()方法保存了其返回值(1)到本地表量表中 1 的位置,完成这个任务的指令是 istore_1;然后执行 finally 语句块(iinc 0, 1),finally 语句块把位于 0 这个位置的本地变量表中的值加 1,变成 2;待 finally 语句块执行完毕之后,把本地表量表中 1 的位置上值恢复到操作数栈(iload_1),最后执行 ireturn 指令把当前操作数栈中的值(1)返回给其调用者(main)。这就是为什么清单 6 的执行结果是 1,而不是 2 的原因。

清单 9.
public class Test { 
public static void main(String[] args) {  
System.out.println(test());  
    }  
 
public static String test() {  
try {  
System.out.println("try block");  
return test1();  
} finally {  
System.out.println("finally block");  
        }  
    }  
public static String test1() {  
System.out.println("return statement");  
return "after return";  
    }  
}
清单 9 的结果:
try block 
return statement 
finally block 
after return

因为return test1();这条语句等同于 :
String tmp = test1();
return tmp;

2.复习计算机网络和socket通信

Java Socket编程----通信是这样炼成的

3.以下关于final关键字说法错误的是(A,C)(两项)

A) final是java中的修饰符,可以修饰类、接口、抽象类、方法和属性
B) final修饰的类肯定不能被继承
C) final修饰的方法不能被重载
D) final修饰的变量不允许被再次赋值

final修饰的方法可以被重载 但不能被重写
java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
 是引用对象的地址值不能变,引用变量所指向的对象的内容是可以改变。
 final变量永远指向这个对象,是一个常量指针,而不是指向常量的指针。

4.说明输出结果。

package test;
import java.util.Date; 
public class SuperTest extends Date{ 
    private static final long serialVersionUID = 1L; 
    private void test(){ 
       System.out.println(super.getClass().getName()); 
    } 
      
    public static void main(String[]args){ 
       new SuperTest().test(); 
    } 
}

正确答案: C 你的答案: B (错误)
A.SuperTest
B.SuperTest.class
C.test.SuperTest
D.test.SuperTest.class

①.首先 super.getClass() 是父类的getClass()方法,其父类是Date,它的getClass()方法是继承自Object类而且没有重写,
所以就是调用object的getClass()方法。而看一下getclass的方法解释如下图

image

所以可以知道是返回当前运行时的类。
②.在调用getName()方法而getName()是:包名+类名**

5.变量不能被defalut修饰
6.以下可以正确获取结果集的有
正确答案: A D 你的答案: A (错误)
A.Statement sta=con.createStatement();
ResultSet rst=sta.executeQuery(“select * from book”);
B.Statement sta=con.createStatement(“select * from book”); ResultSet rst=sta.executeQuery();
C.PreparedStatement pst=con.prepareStatement();
ResultSet rst=pst.executeQuery(“select * from book”);
D.PreparedStatement pst=con.prepareStatement(“select * from book”);
ResultSet rst=pst.executeQuery();

1、 PreparedStatement继承 Statement, PreparedStatement 实例包含已编译的 SQL 语句, 所以其执行速度要快于 Statement 对象。
2、作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。三种方法
execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数

  1. PreparedStatement尽最大可能提高性能. 最重要的一点是极大地提高了安全性.

7.Java中以static关键字修饰的方法称为类方法,实例化一个类,引用的普通方法称为实例方法。

8.System是java.lang中的类,out为System中的一个静态成员,out是java.io.PrintStream类的对象,而println()是java.io.PrintStream类的方法,所有可以调用类.静态方法.println()方法。

9.public interface IService {String NAME="default";}
默认类型等价表示是哪一项:
public static final String NAME="default";
接口中的变量默认是public static final 的,方法默认是public abstract 的
所以你可以这样写:
public static final int i=10;或则int i=10;(可以省略掉一部分)
注意在声明的时候要给变量赋予初值

10.What is displayed when the following is executed;

double d1=-0.5;
System.out.println("Ceil d1="+Math.ceil(d1));
System.out.println("floor d1="+Math.floor(d1));

正确答案: A 你的答案: B (错误)
Ceil d1=-0.0
floor d1=-1.0

Ceil d1=0.0
floor d1=-1.0

ceil 和 floor 方法 上都有一句话:If the argument is NaN or an infinity or positive zero or negative zero, then the result is the same as the argument,意思为:如果参数是 NaN、无穷、正 0、负 0,那么结果与参数相同,
如果是 -0.0,那么其结果是 -0.0

11.以下代码的输出结果是?

public class B
{
    public static B t1 = new B();
    public static B t2 = new B();
    {
        System.out.println("构造块");
    }
    static
    {
        System.out.println("静态块");
    }
    public static void main(String[] args)
    {
        B t = new B();
    }
}

正确答案: C 你的答案: A (错误)
静态块 构造块 构造块 构造块
构造块 静态块 构造块 构造块
构造块 构造块 静态块 构造块
构造块 构造块 构造块 静态块
并不是静态块最先初始化,而是静态域.
而静态域中包含静态变量、静态块和静态方法,其中需要初始化的是静态变量和静态块.而他们两个的初始化顺序是靠他们俩的位置决定的!
So!初始化顺序是 t1 t2 静态块

12.JSP对象 怎样获得
out->response.getWriter
request ->Service方法中的req参数
response ->Service方法中的resp参数
session ->request.getSession
application ->getServletContext
exception ->Throwable
page ->this
pageContext ->PageContext
Config ->getServletConfig

13.Collection和Collections
java.util.Collection 是一个集合接口。
它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
以下接口实现了Collection接口:
map,set,list,vector

java.util.Collections 是一个包装类。
它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

14.什么时候是编译时出错,什么时候运行时出错

编译时
编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.另外还有啥链接器.汇编器.为了了便于理解我们可以统称为编译器)

那编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有没有错别字和病句一样.如果发现啥错误编译器就告诉你.如果你用微软的VS的话,点下build.那就开始编译,如果下面有errors或者warning信息,那都是编译器检查出来的.所谓这时的错误就叫编译时错误,这个过程中做的啥类型检查也就叫编译时类型检查,或静态类型检查(所谓静态嘛就是没把真把代码放内存中运行起来,而只是把代码当作文本来扫描下).所以有时一些人说编译时还分配内存啥的肯定是错误的说法.

15.异常(编译时异常和运行时异常)
https://blog.csdn.net/youngstar70/article/details/62227032

16.重载的概念是:
方法名称相同,参数个数、次序、类型不同
因此重载对返回值没有要求,可以相同,也可以不同
但是如果参数的个数、类型、次序都相同,方法名也相同,仅返回值不同,则无法构成重载

17.声明为static和transient类型的成员数据不能被串行化。因为static代表类的状态, transient代表对象的临时数据。


6316247_1470493382915_C801D3B0A0AF97DF607C783246F436DF.png

18.类变量在不设置初始值时,会进行默认值赋值,而局部方法中声明的变量则必须进行初始化,他不会进行默认值赋值。

19.静态变量只能在类主体中定义,不能在方法中定义

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);
    }
}

即编译失败

https://www.cnblogs.com/dianqijiaodengdai/p/6144698.html

20.静态方法中new内部类的实例对象
https://www.cnblogs.com/printN/p/6249177.html

你可能感兴趣的:(牛客错题集(四))