文章目录
- 一、单选题
- 1. 编译和运行以下代码的结果是什么(本题3分)
- 2. 下列链表的描述,下列语句正确的有(本题3分)
- 3. 根据下述代码,关于编译描述正确的为(本题3分)
- 4. 执行如下程序后,a的值是(本题3分)
- 5. 编译和运行以下类的结果是什么?(本题3分)
- 6. 根据下述代码,输出的结果是(本题3分)
- 7.根据下述代码,正确的输出值为(本题3分)
- 8. 根据下列代码,正确的输出值为(本题3分)
- 9.下列程序的输出内容为(本题3分)
- 10. 若要求”查询选修了3门以上课程的学生的学生号“,正确的SQL语句是(本题3分)
- 11. 正确使用索引可以提高查询效率,productLine列已经添加索引,如下哪些表达式会使用索引?(本题3分)
- 12. 在SQL语句中,与表达式 name NOT IN ("wh1","wh2") 功能相同的表达式是(本题3分)
- 二、 多选题
- 三、判断题(每题2分)
- 21. HashMap 和 TreeMap都允许 key 或 value 的值为 null。
- 22. Hashtable 和 ConcurrentHashMap 都不允许 key 或 value 的值为 null。
- 23. 程序使用 Thread.sleep(0) 语句时,可以删除该行代码,程序运行效果时一样的。
- 24. wait() 方法必须用在同步代码块或方法中。
- 25. sleep 和 wait 都会释放持有的锁资源。
- 26. 可以通过 for 循环遍历删除集合中的元素。
- 27. 变量定义 String 1abc =“abc”,是可以编译通过的。
- 28. volatile 关键字可以保证变量的可见性、有序性、原子性。
- 29. static 修饰的方法不能调用非 static 修饰的方法或变量。
- 30. 抽象类不可以使用 final 关键字来修饰。
- 注意:
一、单选题
1. 编译和运行以下代码的结果是什么(本题3分)
public class StreamTest {
public static void main(String[] args) {
String a="apple";
String b="apple";
String c=new String("apple");
String d=new String("apple");
System.out.println(a==b);
System.out.println(a==c);
System.out.println(c==d);
System.out.println(a.equals(c));
System.out.println(c.equals(d));
}
}
解析:true
,false
, false
, true
,true
-
用
String
定义字符串变量时,会先在常量池里面找有没有字符串apple
,如果没有就把字符串apple
放到常量池,变量名指向常量池中的地址,如果字符串已存在那么就不再重复放字符串到常量池了,变量名直接指向常量池中的地址用
new String()
定义变量时,会和普通的引用类型一样,在堆中新建字符串apple
,变量名指向堆中的地址 -
==
对于基本类型来说是值比较,对于引用类型来说是引用的比较;而equals()
默认情况下是引用比较,只是很多类重写了equals()
方法,比如String
、Integer
等把它变成了值比较,所以一般情况下equals比较的是值是否相等
2. 下列链表的描述,下列语句正确的有(本题3分)
A. 在操作new ArrryList(20);
中,链表扩充了一次。
B. 对于随机访问get
和set
操作时,ArrayList
比LinkedList
更合适。
C. ArrayList
是线程非安全的,LinkedList
是线程安全的。
D. 在链表初始化时,如果像new ArrayList(20)
;一样指定了链表长度时,则在插入第21个元素时,会抛出异常。
解析:
-
A.
ArrayList list=new ArrayList();
这种是默认创建大小为10的数组,每次扩容大小为1.5倍;ArrayList list=new ArrayList(20);
这种是指定数组大小的创建,创建时直接分配其大小,没有扩充。所以,扩充为0次 -
B. 如果集合数据是对于集合随机访问 get 和 set,
ArrayList
绝对优于LinkedList
,因为LinkedList
要移动指针,耽误时间。如果集合数据是对于集合新增和删除操作add
和remove
,LinedList
比较占优势,因为ArrayList
要移动数据。所以 B 正确 -
C.
ArrayList
和LinkedList
都是线程非安全的 -
D. 不会抛出异常,而是会自动扩容为原来长度的1.5倍。
3. 根据下述代码,关于编译描述正确的为(本题3分)
package c05;
public class ab {
public int a;
private int b;
protected int c;
int d;
public void f1(){}
private void f2(){}
protected void f3(){}
void f4(){}
}
package c06;
public class a {
public static void main(String[] args) {
co5.ab t=new co5.ab();
t.a=1;
t.b=2; //编译错误
t.c=2; //编译错误
t.d=2; //编译错误
t.f1();
t.f2(); //编译错误
t.f3(); //编译错误
t.f4(); //编译错误
}
}
解析:
private
: 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
default
(即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
protected
: 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
public
: 对所有类可见。使用对象:类、接口、变量、方法
如下图:
4. 执行如下程序后,a的值是(本题3分)
int a=10;
do{
a--;
}while (a-->0);
System.out.println(a);
A. 0
B. -1
C. 1
D. 死循环
E. -2
解析:选 E.
因为,while(a-->0)
自减条件在while
循环中,即使条件不符,后减的a
仍会执行;但如果a--
放在了循环体中的话,后减的a
就不会执行了
引申:
i--
,--i
、i++
、++i
i--
即 后减减 ,原理是:先自减,然后返回自减之前的值。
本例中,倒数二次循环a=2
时,a--
,使得a=1
,然后条件判断是a=1
与0
判断,条件满足,然后才自减一,使得a=0
, 最后一次循环,a--
,a=-1
,然后 -1小于0,条件不满足,退出循环,但是a
还是要自减一,使得 a 的最后值为 -2 .
--i
即 前减减 ,原理是:先自减,然后返回自减之后的值
同理:i++
、++i
也是如此。
5. 编译和运行以下类的结果是什么?(本题3分)
public class Test {
public void methodA(int i){
System.out.println(i);
}
public int methodA(int i){
System.out.println(i);
}
public static void main(String[] args) {
Test X=new Test();
X.methodA(5);
}
}
A. 该程序编译并运行打印5。
B. 该程序编译错误。
C. 该程序运行时异常,因为它找不到方法Test.methodA(int)
。
D. 该程序编译并运行打印6。
解析: 选 B
该题考的是方法的重载:即发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分。故本题的methodA(int i)
被定义了两次,造成编译错误
引申:
方法的重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不能重写。
6. 根据下述代码,输出的结果是(本题3分)
public class listTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
for (Integer item:list){
if (item.equals(2)){
list.remove(item);
}
}
System.out.println(list);
}
}
A. 打印“[1,2]”
B. 运行时发生异常
C. 编译错误
D. 打印“[1]”
解析: 选 B 。因为 remove(int index)
是删除链表中指定位置的元素,而链表中只有0,1位置有元素。
7.根据下述代码,正确的输出值为(本题3分)
public class Demo {
public static void main(String[] args) {
StringBuilder a= new StringBuilder("A");
StringBuilder b= new StringBuilder("B");
operate(a,b);
System.out.println(a+","+b);
}
private static void operate(StringBuilder x, StringBuilder y) {
x.append(y);
y=x;
}
}
A. A,AB
B. A,B
C. AB,B
D. 编译错误
E. AB,AB
解析: 选 C 。
a指向A,b指向B, operate()
:x指向A,y指向B----------------调用方法:x指向AB,y指向了X为AB
之后:a指向的值变成了AB,b指向的还是B。
如下图:
8. 根据下列代码,正确的输出值为(本题3分)
public class Start {
public static void main(String[] args) {
new Apple();
}
}
class Fruit {
Fruit(){
System.out.println("init a fruit");
}
}
class Apple extends Fruit {
private double w=initW();
private static String color =initC();
Apple(){
System.out.println("init an apple");
}
private static String initC() {
System.out.println("init c");
return "";
}
private double initW() {
System.out.println("init w");
return 1.0;
}
}
解析: 输出顺序为:init c
init a fruit
init w
init an apple
java代码的执行顺序:
-
先执行父类的静态变量和代码块,在执行子类的静态变量和代码块
-
接着执行父类的变量和构造方法里面的方法
-
接着执行子类的变量和构造方法里面的方法
9.下列程序的输出内容为(本题3分)
public class Start {
public static void main(String[] args) {
Set<Integer> set=new HashSet<>();
set.add(0);
set.add(3);
set.add(1);
set.add(2);
set.add(2);
System.out.println(set);
set.remove(2);
System.out.println(set);
}
}
解析: 输出内容为:[0, 1, 2, 3]
[0, 1, 3]
Set
:一个无序(存入和取出顺序又可能不一致)容器,不可以存储重复元素,只允许存入一个null元素。set.remove(Object o
) 方法用于从Set中删除特定元素。
存入和取出顺序又可能不一致的原因:
HashSet
:哈希表里面存放的是哈希值,HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同) 是按照哈希值来存的所以取数据也是按照哈希值取得。
10. 若要求”查询选修了3门以上课程的学生的学生号“,正确的SQL语句是(本题3分)
A. SELECT Sno FROM SC ORDER BY Sno WHERE COUNT (*) > 3
B. SELECT Sno FROM SC ORDER BY Sno HAVING COUNT (*) >= 3
C. SELECT Sno FROM SC GROUP BY Sno HAVING (COUNT (*) > 3)
D. SELECT Sno FROM SC GROUP BY Sno WHERE COUNT (*) > 3
解析: 选 C .
-
order by
的用法使用
order by
,一般是用来,依照查询结果的某一列(或多列)属性,进行排序(升序:ASC
;序:DESC
;默认为升序)。当排序列含空值时:
ASC
:排序列为空值的元组最后显示。DESC
:排序列为空值的元组最先显示。-
单一列属性排序
-
多列属性排序
选择多个列属性进行排序,排序的顺序是,从左到右,依次排序。如果前面列属性有些是一样的话,再按后面的列属性排序。(前提一定要满足前面的属性排序,因为在前面的优先级高)
-
-
group by
的用法group by按照查询结果集中的某一列(或多列),进行分组,值相等的为一组。
-
细化集函数(
count
,sum
,avg
,max
,min
)的作用对象:未对查询结果分组,集函数将作用于整个查询结果。
例子:求各个课程号及相应的选课人数:
SELECT cno,count(sno) from sc
对查询结果分组后,集函数将分别作用于每个组
SELECT cno,count(sno) from sc group by cno
-
GROUP BY
子句的作用对象是查询的中间结果表分组方法:按指定的一列或多列值分组,值相等的为一组。
使用
GROUP BY
子句后,SELECT
子句的列名列表中只能出现分组属性(比如:sno
)和集函数(比如:count()
)。select sno,count(cno) from sc group by sno
-
多个列属性进行分组
举例:
select cno,grade,count(cno) from sc group by cno,grade
-
使用
HAVING
短语筛选最终输出结果只有满足
HAVING
短语指定条件的组才输出。HAVING
短语与WHERE
子句的区别:作用对象不同。-
WHERE
子句作用于基表或视图,从中选择满足条件的元组。 -
HAVING
短语作用于组,从中选择满足条件的组。
举例:
查询选修了3门以上课程的学生学号:
select sno from sc group by sno having count(cno)>3
举例:
查询选修了3门以上课程,且所有课程成绩都高于60分的学生学号及课程数
select sno , count(cno) from sc where grade > 60 group by sno having count(cno) > 3
-
-
小贴士:
group by
字句也和where
条件语句结合在一起使用。当结合在一起时,where
在前,group by
在后。即先对select xx from xx
的记录集合用where
进行筛选,然后再使用group by
对筛选后的结果进行分组 使用having
字句对分组后的结果进行筛选。
having
只能用在group by
之后,对分组后的结果进行筛选(即使用having
的前提条件是分组)
where
后的条件表达式里不允许使用聚合函数,而having
可以当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是:
(1). 执行where xx对全表数据做筛选,返回第1个结果集。
(2). 针对第1个结果集使用group by分组,返回第2个结果集。
(3). 针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。
(4). 针对第3个结集执行having xx进行筛选,返回第4个结果集。
(5). 针对第4个结果集排序。
也就是说其实where不能和聚合函数一起使用,因为select语句执行在where之后。
11. 正确使用索引可以提高查询效率,productLine列已经添加索引,如下哪些表达式会使用索引?(本题3分)
A. select * from products where productLine LIKE "%abc%"
B. select * from products where substr(productLine,2)="abc"
C. select * from products where productLine LIKE "%abc"
D. select * from products where productLine LIKE "abc%"
解析:选 D。
- 使用索引情景
- 字段的数值有唯一性的限制,比如用户名
- 频繁作为
WHERE
查询条件的字段,尤其在数据表大的情况下 - 需要经常
GROUP BY
和ORDER BY
的列 UPDATE
、DELETE
的WHERE
条件列,一般也需要创建索引DISTINCT
字段需要创建索引
- 索引失效的情况
- 索引进行了表达式计算,则会失效
- 对索引使用函数,也会造成失效
- 在
WHERE
子句中,如果在OR
前的条件列进行了索引,而在OR
后的条件列没有进行索引,那么索引会失效 like
以通配符开头(%abc
)会导致索引失效- 索引列与
NULL
或者NOT NULL
进行判断的时候也会失效。
12. 在SQL语句中,与表达式 name NOT IN (“wh1”,“wh2”) 功能相同的表达式是(本题3分)
A. name !=“wh1” AND name != "wh2"
B. name !=“wh1” OR name != "wh2"
C. name =“wh1” AND name = "wh2"
D. name =“wh1” OR name = "wh2"
解析: 选 A.
二、 多选题
13. 下列有关于public,protected,private的描述不正确的是(本题5分)
A. 如果不加上述三个描述词,只能被同一个包内的类访问。
B. 内部类的private类成员不能被外部类访问。
C. public类成员,能够被其他所有类访问。
D. protected类成员,只能被子类访问。
E. private类成员,不能被其他类访问,包括父类和子类。
解析:B、 D、E
B. 对于外部类来说 内部类相当于它的一个属性 内部类中的private也相当于它本身的private属性 所以根据类内可见原则 内部类private是可以被外部类访问的
E. 子类对象拥有父类中的所有属性和方法,则子类当然也继承了父类的私有属性和方法。但是它不能直接访问,之所以说不能直接访问,而不是不能访问,那是因为一旦父类提供了其私有成员的公共访问方法,那么子类就可以访问其私有成员
14. 下面选项中定义正确的有(本题5分)
A. String[] strs = new String[3]{"a","b","c"}
B. String strs[] = new String[]{"a","b","c"}
C. String[] strs = {"a","b","c"}
D. String[] strs = new String{"a","b","c"}
E. String strs[] ={"a","b","c"}
解析: B、C、E
string数组的定义有三种:
String str[] = new String[10]; //创建一个长度为10的String 类型数组。
String str[] = {"a","b"};
String[] str = new String[]{"a","b","c"};
15.下列选项中定义或者描述正确的有(本题5分)
A. 类可以实现多个接口,也可以继承多个父类
B. byte类型的取值范围是-128~127
C. unsigned int =1
D. char类型的长度为2 个字节
解析:B、D
A. Java中一个类可以实现多个接口,但只能继承一个类。因为Java中的多继承有可能会造成二义性。
C. Java 中没有无符号整数的数据类型
16. 关于接口和抽象类,下面选项中说法正确的有(本题6分)
A. 接口支持多继承,一个接口可以继承多个接口
B. 接口中只能有public static final常量,抽象类中既可以有常量,也可以有变量
C. 接口不能实例化,抽象类可以实例化
D.包含抽象方法的类一定是抽象类,但是抽象类不一定含有抽象方法
解析:A、B、D
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
-
接口和抽象类共同点:
- 都不能实例化,都位于继承树的顶端,用于被其他类实现和实现
- 都可以包含抽象方法,实现接口或者继承抽象类的普通子类都必须重写这些抽象方法
-
接口和抽象类不同点:
- 接口里只含有默认方法和抽象方法;抽象类中可以含有普通方法
- 接口不能定义静态方法;抽象类可以定义静态方法
- 接口只能定义静态常量,不能定义普通成员变量,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型;抽象类既可以定义普通成员变量,也可以定义静态成员变量
- 接口中不含构造器;抽象类中含有构造器
- 抽象方法可以有 public,protected,default 这些修饰符,接口默认修饰符为 public
- 一个类可以实现多个接口,但只能继承一个抽象类
17. 下列哪些函数能保证线程将离开运行状态?(本题6分)
A. Thread.killThread()
B. wait()
C. sleep(1000)
D. yield()
E. aLiveThread.join()
F. notify()
G. notifyAll()
解析: B、C、D、E
线程离开运行状态的方法:
- 调用
Thread.sleep()
:使当前线程睡眠至少多少毫秒(尽管它可能在指定的时间之前被中断) - 调用
Thread.yield()
:不能保障太多事情,尽管通常它会让当前运行线程回到可运行性状态,使得有相同优先级的线程有机会执行 - 调用j
oin()
方法:保证当前线程停止执行,直到调用join方法的线程完成为止。然而,如果调用join的线程没有存活,则当前线程不需要停止 - 线程的
run()
方法完成 - 在对象上调用
wait()
方法(不是在线程上调用) - 线程不能在对象上获得锁定,它正试图运行该对象的方法代码。
- 线程调度程序可以决定将当前运行状态移动到可运行状态,以便让另一个线程获得运行机会,而不需要任何理由。
18. 下列有关 try 语句的描述,正确的有(本题6分)
A. try-with-resources
语句中申明的实现 AutoCloseable
接口的资源可以不手动关闭
B. 在一个有多个 catch
的 try-catch
语句中,异常的顺序没有特殊的要求。
C. try
语句中至少有一个 catch
。
D. 使用 try-catch-finally
语句手动对资源关闭时,必须按照创建资源时相反的顺序进行关闭。
E. 在程序正常运行的情况下,try-catch-finally
语句最终都会执行 finally
中的内容
解析:A 、D、E
-
try-with-resources
从jdk1.7开始,Java 7增强了
try
语句的功能——它允许在try
关键字后跟一对圆括号,圆括号可以声明,初始化一个或多个资源,此处的资源指得是那些必须在程序结束时必须关闭的资源(比如数据库连接,网络连接等),try
语句在该语句结束时自动关闭这些资源。这种称为try-with-resources
语句。
try (SqlSession sqlSession = sqlSessionFactory.openSession()) { //...... }
像这样的话,执行完sqlsession
会自动关闭,不用我们在finally
中关闭,也再也不用担心忘记关闭了。
那么为什么这样可以自动关闭资源呢?是不是所有的资源都可以这样关闭呢?
实际上只要这些资源实现类实现了Closeable
或AutoCloseable
接口,就可以自动关闭。比如Sqlsession
它就是extends Closeable
,Closeable extends AutoCloseable
。几乎所有的资源都可以用这种方式实现自动关闭资源,比如OutputStream
,BufferedReader
,PrintStream
,InputStream
等,都可以。据说到目前为止,只有JavaMail Transport
对象不能利用这种方式实现自动关闭。
注意:
try-with-resources
与AutoCloseable
的close
执行顺序 try-close-catch-finally- 多资源用分号隔开,执行close的顺序为后声明的先执行;即按照创建资源时相反的顺序进行关闭
- 多资源 close 异常,不论前面 close 是否出现异常,后面的 close 一定会执行,异常抛出只能捕获最先执行 close 错误的异常。
- B. 在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面,Exception这个异常的根类一定要放在最后一个catch里面,如果放在前面或者中间,任何异常都会和Exception匹配的,就会报已捕获到…异常的错误。故 B 错误
- C. 在try块之后,我们可以使用 catch 块或 finally 块。
19. 下面哪些是 NIO 包特点(本题6分)
A. 文件锁定
B. 字符及编码
C. 内存映射技术
D. 阻塞I/O
解析: A、B、C
NIO 的特点:
- 内存映射 这个功能主要是为了提高大文件的读写速度而设计的
- 字符及编码
- 非阻塞I/O
- 文件锁定 文件锁的出现解决了很多Java应用程序和非Java程序之间共享文件数据的问题
20. 如下复合索引(a,b,c),实际生效的索引是?(本题5分)
A. (a)
B. (b,a)
C. (a,c,b)
D. (a,b)
解析: A、B、C、D
组合索引可以这样理解,比如(a,b,c),abc 都是排好序的,在任意一段 a 的下面 b 都是排好序的,任何一段 b 下面 c 都是排好序的;
组合索引的生效原则是 从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用;
比如:
where a=3 and b=4 and c=5 -- 这种三个索引顺序使用中间没有断点,全部发挥作用;
where a=3 and c=5 -- 这种情况下b就是断点,a发挥了效果,c没有效果
where b=3 and c=4 -- 这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;
where b=4 and a=3 and c=5 -- 这个跟第一个一样(原因:mysql自动优化),全部发挥作用,abc只要 用上了就行,跟写的顺序无关
where a=3 and b>7 and c=3; -- b范围值,断点,阻塞了c的索引
-- a用到了,b也用到了,c没有用到,这个地方b是范围值,也算断点,只不过自身用到了索引
where a>4 and b=7 and c=9; --a用到了 b没有使用,c没有使用(a用了范围所以,相当于断点,之后的 b,c都没有用到索引)
where a=3 order by b; -- a用到了索引,b在结果排序中也用到了索引的效果,a下面任意一段的b是 排好序的
where a=3 order by c; -- a用到了索引,但是这个地方c没有发挥排序效果,因为中间断点了,使 用explain 可以看到 filesort
where b=3 order by a; -- b没有用到索引,排序中a也没有发挥索引效果
三、判断题(每题2分)
21. HashMap 和 TreeMap都允许 key 或 value 的值为 null。
解析: 错误
HashMap 支持 null 键和 null 值
TreeMap 不支持 null 键,但是支持 null 值
22. Hashtable 和 ConcurrentHashMap 都不允许 key 或 value 的值为 null。
解析:正确
ConcurrentHashMap 和 Hashtable 都是支持并发的,二者规定 key,value 均不能为 null,null的话,会抛出空指针异常。
23. 程序使用 Thread.sleep(0) 语句时,可以删除该行代码,程序运行效果时一样的。
解析: 错误
执行 Thread.sleep(0) 后,当前线程不一定会被唤醒,虽然休眠了0秒,但是执行 sleep 方法后,不仅会休眠,还会让 CPU 重新分配。因此,Thread.Sleep(0) 的作用,就是“触发操作系统立刻重新进行一次 CPU竞争”。竞争的结果也许是当前线程仍然获得 CPU 控制权,也许会换成别的线程获得 CPU 控制权。这也是我们在大循环里面经常会写一句 Thread.Sleep(0) ,因为这样就给了其他线程获得 CPU 控制权的权力,这样一些功能就不会假死在那里
24. wait() 方法必须用在同步代码块或方法中。
解析: 正确
Java强制我们的wait()/notify()调用必须要在一个同步块中,就是不想让我们在不经意间出现这种 lost wake up 问题。
不仅仅是这两个方法,包括 java.util.concurrent.locks.Condition 的await()/signal()也必须要在同步块中
25. sleep 和 wait 都会释放持有的锁资源。
解析: 错误
sleep,wait 调用后都会暂停当前线程并让出 cpu 的执行时间,但不同的是 sleep 不会释放当前持有的对象的锁资源,到时间后会继续执行,而 wait 会放弃所有锁并需要 notify/notifyAll 后重新获取到对象锁资源后才能继续执行。
26. 可以通过 for 循环遍历删除集合中的元素。
解析: 错误
for循环只能用来遍历集合,不可以在遍历的同时进行修改和删除
27. 变量定义 String 1abc =“abc”,是可以编译通过的。
解析: 错误
变量的命名要求符合标识符的语法要求:
a. 变量名可以有字母、数字、_、$组成
b. 变量名不能以数字开头
c. Java中变量名的大小写是敏感的
d. 不能使用Java中的保留字作为变量名(保留字:Java中规定好的,一些有特殊含义的词)
e. 中文可以作为变量名,但不提倡使用
f. 变量的命名要见名知意,命名需要遵循驼峰命令规则(如果变量的名字由多个单词组成,除第一个单词以外,其它单词的首字母大写,其余字母小写,尽量不要用拼音来命名变量)
28. volatile 关键字可以保证变量的可见性、有序性、原子性。
解析: 错误
volatile 不能保证变量的原子性。
29. static 修饰的方法不能调用非 static 修饰的方法或变量。
解析: 正确
30. 抽象类不可以使用 final 关键字来修饰。
解析: 正确
抽象类的就是要子类继承然后实现内部方法的。但是final修饰的类是不能再被继承和修改的。所以不能用final修饰。
注意:
以上答案 仅个人意见,如果有错误,欢迎指正,谢谢。