美文网首页牛客题集
牛客错题集(四)

牛客错题集(四)

作者: 菊地尤里 | 来源:发表于2018-05-30 20:09 被阅读0次

    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

    相关文章

      网友评论

        本文标题:牛客错题集(四)

        本文链接:https://www.haomeiwen.com/subject/nluxsftx.html