2021年09月11日 java1

考点1:抽象类和接口的区别

下列对接口的说法,正确的是( )

  • A 接口与抽象类是相同的概念
  • B 若要实现一个接口为普通类则必须实现接口的所有抽象方法
  • C 接口之间不能有继承关系
  • D 一个类只能实现一个接口
显示答案/隐藏答案正确答案: B

A 接口与抽象类是不同的概念。抽象类是用于捕捉子类的通用特性,接口是抽象方法的集合;
B 实现接口必须实现接口的所有方法;
C 接口可以继承一个或多个接口,抽象类只能继承一个类或者实现多个接口;
D 一个类只能继承一个类,但是可以实现多个接口。

自jdk8之后,实现类不必实现接口的所有方法!此题需要添加限制条件!!!!!因为jdk8之后为了引入steam(),增加了default关键字!
java8之后,对接口进行了增强,新增了default和static方法,这两种是不用子类去实现的

考点2:HashSet

有这样一段程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test{ 
public static void main(String [] args){
List list=new ArrayList();
list.add("a");
list.add("b");
list.add("a");
Set set=new HashSet();
set.add("a");
set.add("b");
set.add("a");
System.out.println(list.size()+","+set.size());
}
}

请问运行主要的程序会打印出的是什么()

  • A 2,2
  • B 2,3
  • C 3,2
  • D 3,3
显示答案/隐藏答案正确答案: C

list有序可重复,set无序不可重复

HashSet不能添加重复的元素,当调用add(Object)方法时候,
首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素;
如果已存在则调用Object对象的equals方法判断是否返回true, 如果为true则说明元素已经存在,如为false则插入元素

考点3:字符串和整数的连接操作

下面这三条语句

1
2
3
System.out.println("is "+ 100 + 5);
System.out.println(100 + 5 +" is");
System.out.println("is "+ (100 + 5));

的输出结果分别是? ( )

  • A is 1005, 1005 is, is 1005
  • B is 105, 105 is, is 105
  • C is 1005, 1005 is, is 105
  • D is 1005, 105 is, is 105
显示答案/隐藏答案正确答案: D

1.”is”说明后面的内容都会被强制转换为string,所以是最后结果是拼接起来的
2.100+5先得到105,然后与is拼接
3.先算括号内的

在java中,“+” 和 “+=” 是经过重载的运算符,而java不允许程序员进行运算符的重载。
如果 “+”之前是String,那么此时,“+” 的作用就是连接两个字符串;
若此时 “+” 后面是基本数据类型的话,可以直接进行连接,若是引用数据类型的话,则会调用该对象的toString()方法。

关键看顺序
String先出现,则其后的int统一当作String来拼接
若两个int先出现,则int会先执行运算
如果有括号,括优先级高于运算符

考点4:start方法才是启动线程

下面程序的运行结果是:( )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void main(String args[]) {

Thread t = new Thread() {
public void run() {
pong();
}
};

t.run();
System.out.print("ping");

}

static void pong() {
System.out.print("pong");
}
}
  • A pingpong
  • B pongping
  • C pingpong和pongping都有可能
  • D 都不输出
  • E pong
  • F ping
显示答案/隐藏答案正确答案: B

t.run是调用的Thead类中的run()方法,t.start才是执行线程,
所以这题就是执行普通run()方法,先输出pong,在输出ping。

考点5:等价类 无效等价类

某程序要求每次输入只能是正整数,并且每次输入的数值要求必须是100的倍数且小于等于500,则下列哪个是正确的无效等价类( )

  • A (0,100)、(100,200)、(200,300)、(300,400)、(400,500)、(500,+∞);
  • B (500,+∞)
  • C (500,+∞)、任意大于0小于500的非100倍数的整数;
  • D (-∞,100)、(100,200)、(200,300)、(300,400)、(400,500)、(500,+∞);
显示答案/隐藏答案正确答案: D

无效等价类和有效等价类相反,即不满足程序输入要求或者无效的输入数据构成的集合

什么是有效等价类

https://baike.baidu.com/item/%E6%97%A0%E6%95%88%E7%AD%89%E4%BB%B7%E7%B1%BB
有效等价类指输入完全满足程序输入的规格说明,有效、有意义的输入数据所构成的集合。利用有效等价类可以检验程序是否满足规格说明所规定的功能和性能。

什么是无效等价类

无效等价类和有效等价类相反,即不满足程序输入要求或者无效的输入数据构成的集合。使用无效等价类,可以鉴别程序异常情况的处理。

在程序设计中,不但要保证所有有效地数据输入能产生正确的输出,同时需要保障在输入错误或者空输入的时候能有异常保护,这样的测试才能保证软件的可靠性。

等价类(满足条件的集合):

$ {100,200,300,400,500}$​

无效等价类:

$(-\infty,100) \bigcup (100,200) \bigcup (200,300) \bigcup (300,400) \bigcup(400,500) \bigcup(500,+\infty)$

考点6:对象流 序列化

以下关于对象序列化描述正确的是

  • A 使用FileOutputStream可以将对象进行传输
  • B 使用PrintWriter可以将对象进行传输
  • C 使用transient修饰的变量不会被序列化
  • D 对象序列化的所属类需要实现Serializable接口
显示答案/隐藏答案正确答案: CD

使用ObjectOutputStream和ObjectInputStream可以将对象进行传输.
声明为static和transient类型的成员数据不能被串行化。
因为static代表类的状态, transient代表对象的临时数据。

考点7:抽象类和接口的区别

jdk1.8中,下面有关java 抽象类和接口的区别,说法错误的是?

  • A 抽象类可以有构造方法,接口中不能有构造方法
  • B 抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法
  • C 一个类可以实现多个接口,但只能继承一个抽象类
  • D 接口中可以有普通成员变量,抽象类中没有普通成员变量
显示答案/隐藏答案正确答案: BD
  1. 接口中不能有构造方法,抽象类中可以有。
    1. 抽象类中构造方法作用:用于初始化抽象类的成员;
    2. 抽象类的构造方法不能像普通类那样直接调用,抽象类的构造方法一般由为继承它的子类使用super调用,或者创建抽象类匿名内部类子类是调用。
  2. 接口中方法默认是public abstract(只能是这两个关键字,或其中一个或都省略)
  3. 接口中的变量默认是public static final(只能是这三个关键字,或其中两个/一个或都省略)

Ps : java中一个类只能继承一个类,但一个接口可以继承多个接口

不能通过调用抽象类的构造器来创建对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package base.abstractandinterface;

public abstract class AbstractTest {
protected int a;
protected String b;

public AbstractTest(int a) {
this.a = a;
}

public AbstractTest(int a, String b) {
this.a = a;
this.b = b;
}

public AbstractTest() {
}

public abstract void show();
}

class A extends AbstractTest {


public A() {
}

public A(int a) {
// 调用父类的构造器
super(a);
}

public A(int a, String b) {
// 调用父类的构造器
super(a, b);
}

@Override
public void show() {
System.out.println("int Class A ...");
System.out.println("a=" + a + ",b=" + b);
}

public static void main(String[] args) {
AbstractTest abstractTest;
// 抽象类不能直接调用构造器进行初始化
abstractTest = new AbstractTest();
// abstractTest = new AbstractTest(20, "helloworld");
abstractTest = new A(20, "helloworld");
abstractTest.show();
}
}

报错如下:

1
'AbstractTest' is abstract; cannot be instantiated
1
2
3
4
5
6
7
abstractTest = new AbstractTest() {
@Override
public void show() {
System.out.println("在匿名内部类方式实现的子类中");
}
};
abstractTest.show();

运行结果:

1
在匿名内部类方式实现的子类中

接口没有构造器

1
2
3
public interface InterfaceTest {
public InterfaceTest();
}

报错如下:

1
Not allowed in interface

考点8:Java基础知识

下面有关Java的说法正确的是( )

  • A 一个类可以实现多个接口
  • B 抽象类必须有抽象方法
  • C protected成员在子类可见性可以修改
  • D 通过super可以调用父类构造函数
  • E final的成员方法实现中只能读取类的成员变量
  • F String是不可修改的,且java运行环境中对string对象有一个对象池保存
显示答案/隐藏答案正确答案: ACDF

解释一下c选项,意思是父类中的protected方法子类在重写的时候访问权限可以修改,其实就是重写的要素之一,换了个说法而已
抽象类可以不具有抽象方法! 抽象类可以不具有抽象方法! 抽象类可以不具有抽象方法! 重要的事情说三遍

考点9:HttpServletRequest方法

以下哪些方法可以取到http请求中的cookie值()?

  • A request.getAttribute
  • B request.getHeader
  • C request.getParameter
  • D request.getCookies
    `
    显示答案/隐藏答案正确答案: BD

下面的方法可用在 Servlet 程序中读取 HTTP 头。这些方法通过 HttpServletRequest 对象可用:

1)Cookie[] getCookies()
返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。

2)Object getAttribute(String name)
以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回 null。

3)String getHeader(String name)
以字符串形式返回指定的请求头的值。Cookie也是头的一种

4)String getParameter(String name)
以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。