0%

JavaSE常见问题汇总

note1

以下合法的标识符是?(A,E,F,G)
A.flag_3
B.my code
C.discount%
D.234rate
E.$name
F.println
G.main

解释:Java的关键字不能用做标识符,但是println,main不属于标识符(标识符一般在编辑器中会被高亮成紫色)。

note2

标识符的命名规范
1)见名知意

(2)类名、接口名等:每个单词的首字母都大写(大驼峰法则),形式:XxxYyyZzz,

例如:HelloWorld,String,System等

(3)变量、方法名等:从第二个单词开始首字母大写(小驼峰法则),其余字母小写,形式:xxxYyyZzz,

例如:age,name,bookName,main

(4)包名等:每一个单词都小写,单词之间使用点.分割,形式:xxx.yyy.zzz,

例如:java.lang

(5)常量名等:每一个单词都大写,单词之间使用下划线_分割,形式:XXX_YYY_ZZZ,

例如:MAX_VALUE,PI

note3

Java报错: 类class 是公共的, 应在名为 .java 的文件中声明
原因:public修饰的class必须与.java的文件名一致

note4

分析以下代码:
short s1 = 120;
short s2 = 8;
byte s3 = (byte)(s1+s2);

输出s3结果为-128(两个short做运算结果是int)。因为s1+s2=128。int(占四个字节,32个2进制位) 128的二进制为00000000 00000000 00000000 10000000,若要转换成byte(1个字节,8个二进制位)则为10000000(-128),因为有符号二进制存储第一个数为1,代表负数,先求10000000的反码为01111111,在加1得到10000000,该数的十进制数为128。则s3对应的数为-128。
同理 byte b = (byte)129;
b的输出值为-127,因为int 129的二进制数为00000000 00000000 00000000 10000001,转换为byte类型,其二进制数为10000001,第一个数字为1表明该二进制数对应的十进制数字为负数,按照负数的转换规则,先求10000001的反码为01111110,再加1,得到01111111,该数为127,则b的值为-127。

note5

byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
byte b4 = 3 + 4;
运行以上的代码,b3会报错,因为b1 + b2默认是int类型,(byte,short,char运算的值默认为int类型),存储范围大的变量不能直接赋值给存储范围小的变量。
b4不会报错,因为3和4是两个常量值,会自动运算为7,与变量不一样,可以直接赋值给b3。

note6

int i = 10;
i = i++;
System.out.println(“i =”+i);
输出结果i = 10,因为i的值一开始为10,先把10这个值取出来找个地方存储,然后i++,i的值变为11,再把10这个值赋给等号左侧的i,所以i的输出值为10。

note7

分析以下代码:
byte b= 127;
b = b + 1;
b += 1;

b = b + 1; 这行代码会报错,因为b + 1的运算结果是int类型,不能赋值给byte类型的b。但是如果运行 b += 1则可以运行,但是输出的结果b = -128。因为 += 操作实际上进行了强制类型转换,但是byte的取值范围为-128到127,强制类型转换为byte就导致128变成了-128。

同理
int i = 1;
i *=0.1;
System.out.println(i);
输出的结果为i = 0,因为i *= 0.1;实际上的操作为i = (int) i * 0.1; 即(int)1 * 0.1 = 0;

note8

右移运算符 :一个数右移n位,结果为这个数除以2的n次幂,除不尽向下取整。
System.out.println(-9>>2);输出的数为-3,因为-9/2^2 = -2.25,向下取整得到的就是-3。
System.out.println(-9>>>2);输出的数为1073741821,因为>>>为无符号右移,最高为补0,结果为正数,该数的求法是通过算补码得到的。
System.out.println(3<<33);输出的数为6,因为int类型4个字节,32位,移动33位相当于移动一位。每超过32位,得到的数相当于3 * 2^(33%32) 。

note9

int x = 5;
int y = 7;
x = x^y;
y = x^y;
x = x^y;
System.out.println(x);
System.out.println(y);
该运算操作相当于交换两个变量的值。

note10

数组的声明:
数据类型[] 数组名;
数组的几种定义方式:

  1. 静态初始化:
    数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
    数据类型[] 数组名 = {元素1,元素2,…};
  2. 动态初始化:
    数据类型[] 数组名 = new 数据类型[长度];

note11

Java虚拟机的内存划分
常用到的三部分:方法区、堆内存、虚拟机栈。
方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
堆内存:存储对象(包括数组对象),new来创建的,都存储在堆内存。
虚拟机栈:用于存储正在执行的每个Java方法的局部变量表等。
局部变量表存放了编译期可知长度的各种基本数据类型、对象引用,方法执行完,自动释放。

-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道