2021年09月04日 java2

考点1:java常识

下列描述中,错误的是( )

  • A java要求编程者管理内存
  • B java的安全性体现在多个层次上
  • C java中没有指针机制
  • D java有多线程机制

解析

显示答案/隐藏答案正确答案: A

Java与C++的区别在于:Java去除了指针的概念,使用引用,并且Java的内存管理不需要程序员来管理,由Java虚拟机来完成对内存的管理

考点2:abstract final static native

若在某一个类定义中定义有如下的方法: abstract void performDial( ); 该方法属于()

  • A 本地方法
  • B 最终方法
  • C 解态方法
  • D 抽象方法

解析

显示答案/隐藏答案正确答案: D
  • 本地方法:简单地讲,一个native Method就是一个java调用非java代码的接口;native方法表示该方法要用另外一种依赖平台的编程语言实现。
  • 最终方法final void B(){},这样定义的方法就是最终方法,最终方法在子类中不可以被重写,也就是说,如果有个子类继承了这个最终方法所在的类,那么这个子类中不能出现void B(){}这样的方法。
  • 最终类:**final class A {},**这样定义的类就是最终类,最终类不能被继承。
  • abstract修饰抽象类

A.vJAVA中有两种方法:JAVA方法和本地方法。 JAVA方法是由JAVA编写的,编译成字节码,存储在class文件中; 本地方法是由其它语言编写的,编译成和处理器相关的机器代码,本地方法保存在动态链接库中,即.dll(windows系统)文件中,格式是各个平台专有的。
JAVA方法是与平台无关的,但是本地方法不是。
B.final void A() {},这样定义的方法就是最终方法,最终方法在子类中不可以被重写。 也就是说,如果有个子类继承这个最终方法所在的类,那么这个子类中就不能再出现void A() {}这样的方法了。
C.不存在解态方法这种东西,应该是笔误打错了,是静态方法。 静态方法的使用完全独立于该类的任何对象。 在类中使用static修饰的静态方随着类的定义而被分配和装载入内存中;而非静态方法属于对象的具体实例,只有在类的对象创建时在对象的内存中才有这个方法的代码段。

考点3:GUI

在委托事件模型中,源生成事件并把它发送给一个或多个监听器,每个监听器必须向事件源注册。

  • A T
  • B F

解析

显示答案/隐藏答案正确答案: A

考点4:实例变量 局部变量 final变量

下面有关java实例变量,局部变量,类变量和final变量的说法,错误的是?

  • A 实例变量指的是类中定义的变量,即成员变量,如果没有初始化,会有默认值。
  • B 局部变量指的是在方法中定义的变量,如果没有初始化,会有默认值
  • C 类变量指的是用static修饰的属性
  • D final变量指的是用final 修饰的变量

解析

显示答案/隐藏答案正确答案: B

局部变量必须初始化

定义在类中的变量是类的成员变量,可以不进行初始化,Java会自动进行初始化,如果是引用类型默认初始化为null,如果是基本类型例如int则会默认初始化为0
局部变量是定义在方法中的变量,必须要进行初始化,否则不同通过编译
被static关键字修饰的变量是静态的,静态变量随着类的加载而加载,所以也被称为类变量
被final修饰发变量是常量

为什么局部变量不会默认初始化

局部变量是指类方法中的变量,必须初始化。局部变量运行时被分配在栈中,量大,生命周期短,如果虚拟机给每个局部变量都初始化一下,是一笔很大的开销,但变量不初始化为默认值就使用是不安全的。出于速度和安全性两个方面的综合考虑,解决方案就是虚拟机不初始化,但要求编写者一定要在使用前给变量赋值。

变量分类

image-20210904224728900

考点5:集合 Collection和Collections

对Collection和Collections描述正确的是

  • A Collectionjava.util下的类,它包含有各种有关集合操作的静态方法
  • B Collectionjava.util下的接口,它是各种集合结构的父接口
  • C Collectionsjava.util下的接口,它是各种集合结构的父接口
  • D Collectionsjava.util下的类,它包含有各种有关集合操作的静态方法

解析

显示答案/隐藏答案正确答案: BD

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

  • Collection是单列集合的顶层接口,
  • Map是双列集合的顶层接口
  • Collections是一个集合的工具类,提供了排序、查找等操作集合的一些常用方法

考点6:java构造函数

下列有关java构造函数叙述正确的是()

  • A 构造器的返回值为void类型
  • B 如果一个源文件中有多个类,那么构造器必须与公共类同名
  • C 构造器可以有0个,1个或一个以上的参数
  • D 每个类可以有一个以上的构造器

解析

显示答案/隐藏答案正确答案: CD

考点7:has-a is-a 子类通过继承得到父类的成员

Gadget has-a Sprocket and Gadget has-a Spring and Gadget is-a Widget and Widget has-
a Sprocket

以下哪两段代码可以表示这个关系? (选择两项) ( )

  • A
    1
    2
    class Widget { Sprocket s; }
    class Gadget extends Widget { Spring s; }
  • B
    1
    2
    class Widget { }
    class Gadget extends Widget { Spring s1; Sprocket s2; }
  • C
    1
    2
    class Widget { Sprocket s1; Spring s2; }
    class Gadget extends Widget { }
  • D
    1
    2
    class Gadget { Spring s; }
    class Widget extends Gadget{ Sprocket s; }

解析

显示答案/隐藏答案正确答案: AC

is-a表示继承:Gadget is-a Widget就表示Gadget 继承 Widget;
has-a表示从属:Gadget has-a Sprocket就表示Gadget中有Sprocket的引用,Sprocket是Gadget的组成部分;
like-a表示组合:如果A like-a B,那么B就是A的接口

从题目中可以得出以下几个结论:

  • Gadget中有对Sprocket的引用。

  • Gadget中有对Spring的引用。

  • Gadget继承了Widget。

  • Widget中有对Sprocket的引用。

  • A

    class Widget { Sprocket s; }
    class Gadget extends Widget { Spring s; }
    完全符合要求,这里的结论1虽然没有明确表明,但是因为结论3(Gadget继承了Widget)的存在,即父类中的非私有成员(Sprocket)子类都默认拥有。故结论都成立。

  • B

    class Widget { }
    class Gadget extends Widget { Spring s1; Sprocket s2; }
    结论123成立,但是没有表明结论4。

  • C

    class Widget { Sprocket s1; Spring s2; }
    class Gadget extends Widget { }
    完全符合要求,这里的结论12虽然没有明确表明,但是因为结论3(Gadget继承了Widget)的存在,即父类中的非私有成员(Sprocket和Spring)子类都默认拥有。故结论都成立。

  • D

    class Gadget { Spring s; }
    class Widget extends Gadget{ Sprocket s; }
    结论24成立,但是结论13没有表明。这里只是表明了Widget继承了Gadget,并且Widget具有对Spring的引用。

这道题主要考查我们的Java类与类之间的关系。 类与类之间有三种关系:
(1)is-a 包括了继承(类)和实现(接口)关系;
(2)has-a包括了关联、聚合、组合关系;
(3)use-a包括了依赖关系;

考点8:JVM垃圾回收算法

以下哪些jvm的垃圾回收方式采用的是复制算法回收

  • A 新生代串行收集器
  • B 老年代串行收集器
  • C 并行收集器
  • D 新生代并行回收收集器
  • E 老年代并行回收收集器
  • F cms收集器

解析

显示答案/隐藏答案正确答案: AD

两个最基本的java回收算法:复制算法和标记清理算法
复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法
标记清理:一块区域,标记可达对象(可达性分析),然后回收不可达对象,会出现碎片,那么引出
标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象
两个概念:新生代和年老代
新生代:初始对象,生命周期短的
永久代:长时间存在的对象
整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收。
P.S:Serial New收集器是针对新生代的收集器,采用的是复制算法
Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理
Parallel Old(并行)收集器,针对老年代,标记整理 CMS收集器,基于标记清理
G1收集器:整体上是基于标记 整理 ,局部采用复制

综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。

考点9:super关键字 this关键字

在使用super和this关键字时,以下描述错误的是()

  • A 在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过
  • B super()this()不一定要放在构造方法内第一行
  • C this()super()可以同时出现在一个构造函数中
  • D this()super()可以在static环境中使用,包括static方法和static语句块

解析

显示答案/隐藏答案正确答案: BCD

1、super()表示调用父类构造函数、this()调用自己的构造函数,而自己的构造函数第一行默认会使用super()调用父类的构造函数,所以这俩不能在一个构造函数中会出现重复引用的情况
2、super()和this()必须在构造函数第一行,所以这一点也表明他俩不能在一个构造函数中
3、this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块(里面不能使用非static类型的)。

super()和this()不能同时在构造方法中使用,因为会导致重复实例化两次,而且这俩函数也不能放入static中,因为静态中不能操作实例对象

在构造器B中,使用this()调用其他构造器A时,构造器A的第一行会默认调用super()。

假设this()和super()能同时放在一起,则super()会被调用两次,初始化父类两次。
现实中父类只需要初始化一次就够了,所以this()和super()不能同时出现。