zoukankan      html  css  js  c++  java
  • Java基础&笔试题

        

      这些题目是近期我参加过的笔试题和一些我在网上选的部分题,在这里做笔记,认真去学习,更好的应对后面的招聘。有错误欢迎指出。

    一、Java基础部分

    1、指针在任何情况下都可进行>,<,>=,<=,==运算。

      答案:正确。
      解析:指针用来表示内存地址;如果仅仅是指针之间的比较,其实也就是整型变量比较,这样的话任何情况都进行比较运算。但是指针的比较一般没有实际意义。


    2、关于 JAVA 堆,下面说法错误的是( )

    A.所有类的实例和数组都是在堆上分配内存的        B.对象所占的堆内存是由自动内存管理系统回收

    C.堆内存由存活和死亡的对象,空闲碎片区组成       D.数组是分配在栈中的

      答案:D

      解析:首先数组是分配在堆中的,故D的说法不正确。

         Java堆的结构:JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。

    3、下面关于java.lang.Exception类的说法正确的是()

           A 继承自Throwable      B 继承自Serialable   

      答案:A

      解析:Java异常的基类为java.lang.Throwable,java.lang.Error和java.lang.Exception继承 Throwable,RuntimeException和其它的Exception等继承Exception,具体的RuntimeException继承RuntimeException。

      扩展:错误和异常的区别(Error vs Exception) 

      1) java.lang.Error: Throwable的子类,用于标记严重错误。合理的应用程序不应该去try/catch这种错误。绝大多数的错误都是非正常的,就根本不该出现的。
          java.lang.Exception: Throwable的子类,用于指示一种合理的程序想去catch的条件。即它仅仅是一种程序运行条件,而非严重错误,并且鼓励用户程序去catch它。

      2)  Error和RuntimeException 及其子类都是未检查的异常(unchecked exceptions),而所有其他的Exception类都是检查了的异常(checked exceptions).
         checked exceptions: 通常是从一个可以恢复的程序中抛出来的,并且最好能够从这种异常中使用程序恢复。比如FileNotFoundException, ParseException等。检查了的异常发生在编译阶段,必须要使用try…catch(或者throws)否则编译不通过。
         unchecked exceptions: 通常是如果一切正常的话本不该发生的异常,但是的确发生了。发生在运行期,具有不确定性,主要是由于程序的逻辑问题所引起的。 比如ArrayIndexOutOfBoundException, ClassCastException等。从语言本身的角度讲,程序不该去catch这类异常,虽然能够从诸如RuntimeException这样的异常中catch并恢复,但是并不鼓励终端程序员这么做,因为完全没必要。因为这类错误本身就是bug,应该被修复,出现此类错误时程序就应该立即停止执 行。 因此,面对Errors和unchecked exceptions应该让程序自动终止执行,程序员不该做诸如try/catch这样的事情,而是应该查明原因,修改代码逻辑。

              RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。

       处理RuntimeException的原则是: 如果出现 RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。其他 (IOException等等)checked异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部 错误。 

    4、分析下面程序,求输出结果,并简单列出执行过程。

    public class Test{
        static boolean foo(char c)
        {
            System.out.print(c);
            return true;
        }
        public static void main(String[] argv)
        {
            int i=0;
            for (foo('A'); foo('B') && i < 2; foo('C')) {
                i++;
                foo('D');
            }
        }
    }                                

      答案:ABDCBDCB

      解析:①第一轮循环:foo('A')是初始条件,只执行一次,故先输出A,接着判断foo('B')&&i<2,因为此时i=0,故满足条件,再输出B,接着进入循环内,首先执行i++, 此时i=1, 再执行foo('D'),输出D,再执行foo('C'),输出C。 在这一轮中,依次输出ABDC;

           ②第二轮循环:初始条件foo('A')不执行,故开始执行判断条件foo('B') && i < 2,满足1<2,故先输出B,同上,接着执行i++,i=2,输出D,输出C。在这一轮中,依次输出BDC;

           ③第三轮循环:还是直接从判断条件语句开始,先执行了判断语句foo('B'),故输出B,但此时不满足i<2,后面的语句不再执行,这一轮中输出B。程序也到此结束。

    5、下列说法正确的是:

    A.一个文件里可以同时存在两个public修饰的类

    B.构造函数可以被重写(override)

    C.子类不能访问父类非public和protected修饰的属性

    D.final修饰的类可以被继承

      答案:C

      解析:一个Java源文件中最多只能有一个public类当有一个public类时,源文件名必须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。至于main()不是必须要放在public类中才能运行程序。《详解链接

      重写是子类继承父类对父类的方法进行修改。方法名,参数,返回值必须一样不能重写被标示为final的方法。如果不能继承一个方法,则不能重写这个方法。

      扩展:重写override,重载overload的区别:

       java的方法重载:就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法,而且返回值类型可以相同也可以不相同这也是面向对象的多态性。

       java的方法重写:

      1)父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。

           2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。

           3)子类函数的访问修饰权限不能少于父类的;

      4)重写方法只能存在于具有继承关系中,重写方法只能重写父类非私有的方法。

    6、Java接口的修饰符可以为()

    A private     B protected     C final       D abstract

      答案:CD

      解析:接口很重要,为了说明情况,这里稍微啰嗦点:

    (1)接口用于描述系统对外提供的所有服务,因此接口中的成员常量和方法都必须是公开(public)类型的,确保外部使用者能访问它们;

    (2)接口仅仅描述系统能做什么,但不指明如何去做,所以接口中的方法都是抽象(abstract)方法;

    (3)接口不涉及和任何具体实例相关的细节,因此接口没有构造方法,不能被实例化,没有实例变量,只有静态(static)变量;

    (4)接口的中的变量是所有实现类共有的,既然共有,肯定是不变的东西,因为变化的东西也不能够算共有。所以变量是不可变(final)类型,也就是常量了。

    (5) 接口中不可以定义变量?如果接口可以定义变量,但是接口中的方法又都是抽象的,在接口中无法通过行为来修改属性。有的人会说了,没有关系,可以通过 实现接口的对象的行为来修改接口中的属性。这当然没有问题,但是考虑这样的情况。如果接口 A 中有一个public 访问权限的静态变量 a。按照 Java 的语义,我们可以不通过实现接口的对象来访问变量 a,通过 A.a = xxx; 就可以改变接口中的变量 a 的值了。正如抽象类中是可以这样做的,那么实现接口 A 的所有对象也都会自动拥有这一改变后的 a 的值了,也就是说一个地方改变了 a,所有这些对象中 a 的值也都跟着变了。这和抽象类有什么区别呢,怎么体现接口更高的抽象级别呢,怎么体现接口提供的统一的协议呢,那还要接口这种抽象来做什么呢?所以接口中 不能出现变量,如果有变量,就和接口提供的统一的抽象这种思想是抵触的。所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统 一的属性。

    通俗的讲,你认为是要变化的东西,就放在你自己的实现中,不能放在接口中去,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现 implements)开放,接口是对开闭原则的一种体现。

    所以:

    接口的方法默认是public abstract;

    接口中不可以定义变量即只能定义常量(加上final修饰就会变成常量)。所以接口的属性默认是public static final 常量,且必须赋初值。

    注意:final和abstract不能同时出现。

    7、以下for循环的执行次数是:____

      for(int x=0,y=0;(y!=0)&&(x<4);x++)

     A.无限次    B.执行4次    C.执行3次    D.一次也不执行

      参考答案:D

      解析:y初始值为0,在整个for循环中,y的值不变,故判断语句中的(y!=0)不成立,故一次也不执行。

    8、有哪些常用的MAP类型。

      解析:有以下三种类型:

    1. 通用 Map,用于在应用程序中管理映射,通常在 java.util 程序包中实现
      • HashMap
      • Hashtable
      • Properties
      • LinkedHashMap
      • IdentityHashMap
      • TreeMap
      • WeakHashMap
      • ConcurrentHashMap
    2. 专用 Map,您通常不必亲自创建此类 Map,而是通过某些其他类对其进行访问
      • java.util.jar.Attributes
      • javax.print.attribute.standard.PrinterStateReasons
      • java.security.Provider
      • java.awt.RenderingHints
      • javax.swing.UIDefaults
    3. 一个用于帮助实现您自己的 Map 类的抽象类
      • AbstractMap

    9、Java匿名类。




  • 相关阅读:
    Linux 用户和用户组配置文件
    Linux su和sudo的区别
    4-selenium-xpath定位
    3-selenium-元素定位
    1-selenium3安装
    vim 查看行数
    java学习day27-JavaScript
    java学习day26-CSS定位
    java学习day26-CSS(2)-布局+属性
    java学习day26-CSS(1)
  • 原文地址:https://www.cnblogs.com/dadawei/p/5240466.html
Copyright © 2011-2022 走看看