2019年11月6日 java1

考点1

关于容器下面说法正确的是? ( )

  • A 列表(List)和集合(Set)存放的元素都是可重复的。
  • B 列表(List)和集合(Set)存放的元素都是不可重复的。
  • C 映射(Map)<key,value>中key是可以重复的。
  • D 映射(Map)<key,value>中value是可以重复的。

正确答案: D

解析

  • List列表的元素是有序的,可重复的
  • 集合Set的元素是无序的,不可重复的
  • map是使用的是键值对存放,key不重复,value是可重复的

考点2

以下关于继承的叙述正确的是

  • A 在Java中类只允许单一继承
  • B 在Java中一个类不能同时继承一个类和实现一个接口
  • C 在Java中接口只允许单一继承
  • D 在Java中一个类只能实现一个接口

正确答案: A

解析

  • 类支持单继承,
  • 接口支持多继承,一个接口可以有多个父接口,子接口扩展某个父接口,将会获得父接口里定义的所有抽象方法、常量。一个接口继承多个父接口时,多个父接口排在extends关键字之后。

考点3

以下会产生信息丢失的类型转换是( )

  • A float a=10
  • B int a=(int)8846.0
  • C byte a=10; int b=-a
  • D double d=100

正确答案: B

解析

精度丢失只会发生在从大范围到小范围的转换
上面四个选项,只有 B 是从 double 到 int,也就是从大范围到小范围。

float a=10.0; 是把 double 转车 float. 会损失精度. 正确的写法是 float=10.0f;

考点4

java Thread中,run方法和start方法的区别,下面说法错误的是?

  • A 通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。
  • B 他们都可以实现了多线程运行。
  • C run方法是thread的一个普通方法调用。
  • D 调用start方法后,一旦得到cpu时间片,就开始执行run()方法。

正确答案: B

解析

start方法和run方法的区别

1.start方法

用start方法来启动线程,是真正实现了多线程,
通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法。但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。

2.run方法

run()方法只是类的一个普通方法而已,如果直接调用run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。

考点5

下面哪个选项正确创建socket连接?

  • A Socket s = new Socket(8080);
  • B Socket s = new Socket(“192.168.1.1”,8080)
  • C SocketServer s = new Socket(8080);
  • D Socket s = new SocketServer(“192.168.1.1”,8080)

正确答案: B

解析

创建客户端Socket

创建 Socket 肯定要知道服务器ip 和 port 啊
服务器的 ServerSocket 只需要开放端口号就行啦
也就是
服务器端:ServerSocket提供的实例 ServerSocket server = new ServerSocket(端口号)
客户端:Socket提供的实例 Socket client = new Socket(IP地址,端口号)

考点6

变量a是一个64位有符号的整数,初始值用16进制表示为:0x7FFFFFFFFFFFFFFF;变量b是一个64位有符号的整数,初始值用16进制表示为:0x8000000000000000。则a+b的结果用10进制表示为多少?

  • A 1
  • B -1
  • C 2^63+2^62+…+2^2+2^1+2^0
  • D –(2^63+2^62+…+2^2+2^1+2^0)

正确答案: B

解析

计算机中是以补码存储并参与运算的,所以题目中的初始值均是补码
(1)a+b的16进制表示为:OxFFFFFFFFFFFFFFF(16位F),转为2进制为111……111(64位1,每个F->4位2)。
(2)有符号数:是针对二进制来讲的。用最高位作为符号位,“0”代表“+”,“1”代表“-”。所以a+b的结果是一个负数。
(3)计算机中负数是以补码的形式保存的,将补码转换成原码的计算方式如下:
①. 对于正数,原码与补码相同。
②.对于负数,将补码除符号位之外,按位取反,末位加1,即得到原码。
(4)a + b = 111……111(64位1)
取反:100……000(1位1,后面63位0)
加一:100……001(中间62位0)
10进制:-1。

考点7

代码片段:

1
2
3
4
5
byte b1=1,b2=2,b3,b6;  
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);

关于上面代码片段叙述正确的是()

  • A 输出结果:13
  • B 语句:b6=b4+b5编译出错
  • C 语句:b3=b1+b2编译出错
  • D 运行期抛出异常

正确答案: C

解析

没有final修饰的byte变量相加后会被自动提升为int型,与目标类型byte不相容,需要强制转换(向下转型)。

表达式的数据类型自动提升规则。

①所有的byte,short,char型的值将被提升为int型;
②如果有一个操作数是long型,计算结果是long型;
③如果有一个操作数是float型,计算结果是float型;
④如果有一个操作数是double型,计算结果是double型;

1
2
final byte b4=4,b5=6;
b6=b4+b5;

声明b4与b5为final常量,不可改变。
所以b4+b5的结果为byte类型。

1
2
byte b1=1,b2=2;
b3=(b1+b2);

b1+b2的结果会自动升级为int类型。
int类型赋值给低级别byte的需要强制转换。

考点8

已知如下的命令执行 java MyTest a b c 请问哪个语句是正确的? ( )

  • A args[0] = “MyTest a b c”
  • B args[0] = “MyTest”
  • C args[0] = “a”
  • D args[1]= “b”

正确答案: CD

解析

考点9

对于代码 var a = 10.42; 取出 a 的整数部分,以下代码哪些是正确的?

  • A parseInt(a);
  • B Math.floor(a);
  • C Math.ceil(a);
  • D a.split(‘.’)[0];

正确答案: AB

解析

Math的ceil floor round详解

  • Math.ceil(); ceiling(天花板) 所以向上取整
  • Math.floor();floor(地板)所以向下取整
  • Math.round()
    • 对于正数是四舍五入,
    • 对于负数,
      • 小数点后的数<=5都是舍去,
      • 而大于5是减一

关于java 10引入的var

2018年3月20日,Oracle发布java10。java10为java带来了很多新特性,其中包括var关键字的引入。
eg:
public class Example {
public static void main(String[] args) {
var eg = new Example;
eg.emptyFunc();
}
public void emptyFunc() {}
}

java对var的要求

java在var上是有要求的。总结起来,有以下三点很重要:
(1)只能用于局部变量上;
(2)声明时必须初始化;
(3)不能用作方法参数。

考点10

下面关于面向对象的一些理解哪些是错误的( )

  • A 面向对象的最重要的特性是支持继承、封装和多态
  • B 系统设计应该遵循开闭原则,系统应该稳定不不可修改,但应支持通过继承、组合等方式进行扩展
  • C 函数式的语言必然是面向对象的语言
  • D 面向对象设计时,每个类的职责应该单一,不要再一个类中引入过多的接口
  • E 过程式语言和面向对象的语言各有其优势,过程式语言更加灵活,面向对象语言更加强调抽象和封装
  • F Java和C++都是静态类型的面向对象编程语言

正确答案: C

解析

什么是动态类型语言

动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。

什么是静态类型语言

静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。