Java日常
程序员文章站
2024-03-14 20:20:53
...
1. 一个".java" 源文件中是否可 以包括多个类(不是内部类)?有什么限制?
- 可以包括多个类,但只能有一个
public
修饰的类,而且此类的类名必须与文件名一样。
2 、Java 有没有 goto?
-
goto
是Java中的保留字,没有定义用途,保留备用。
3 、& 和&&的区别。
-
&
和&&
都可以用作逻辑与运算符,表示逻辑与(and
),当运算符两边的表达式结果都为true
时,整个运算结果为true
,否则,只要有一个false
,整个运算结果为false
。 -
&&
还具有短路功能,即如果第一个表达式的结果为false
,则不再计算第二个表达式。 -
&
还可以用作位运算符,当&
操作符两边的表达式不是boolean
类型时,&
表示按位与操作,我们通常使用0x0f
与一个整数进行&
操作,来获取整数的最低4个bit位。
4 、switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
-
switch(express)
中,express
只能是整数表达式或者枚举常量,整数表达式可以是int
基本类型或Integer
包装类型。由于byte,short,char
都可以隐式转换为int
,所以,这些类型以及其包装类型都可以。long和String
类型都不符合switch的语法规定,并且不能被隐式转换为int类型,所以,不能作用于switch语句中。 - 备注拓展:
java中的数据类型及类型转换:
*boolean
类型不能转换成任何其它数据类型。
*自动类型转换:容量小的类型自动转换成容量大的数据类型。
*强制类型转换:容量大的类型转换成容量小的数据类型时,要加上强制转换符,有可能造成精度降低或数据溢出,使用时要小心。
5 、short s1 = 1; s1 = s1 + 1; 有什么错? short s1 = 1; s1 += 1; 有什么错?
- 对于
short s1 = 1; s1 = s1 + 1;
由于s1 = s1 + 1
在计算时会自动提升表达式的类型,所以结果是int型,在赋值给short类型时,编译器会报需要强制类型转换的错误。 - 对于
short s1 = 1; s1 += 1;
由于+=
是java语言规定的运算符,编译器会对其进行特殊处理,因此可以正常编译。
6 、char 型变量中能不能存贮一个中文汉字? 为什么?
-
char
型变量是用来存储Unicode编码的字符,Unicode编码字符集包含汉字,所以,char
型变量可以存储汉字。Unicode编码使用两个字节,所以,char类型变量也是占用两个字节。
7 、用最有效率的方法算出 2 乘以 8 等于几?
-
2<<3
。因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以 8 只要将其左移 3位即可,而位运算 cpu 直接支持的,效率最高,所以,2 乘以 8 等於几的最效率的方法是 2 << 3。
8 、使用 final 关键字修饰 一个变量时,是引用不能变,还是引用的对象不能变?
- 使用
final
关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");
有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
public void method(final StringBuffer param){
}
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
param.append("a");
9 、"=="和 和 equals 方法究竟有什么区别?
-
"=="
操作符专门比较 两个变量的值是否相等,也就是比较变量多对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用"=="
操作符。
*如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();
变量 obj 是一个内存,newObject()是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变应的内存中的数值是否相等,这时候就需要用此操作符进行比较。 -
equals
方法时用来比较两个独立对象的内容是否相同,就好比比较两个人的长相是否相同两个对象是独立的。
*例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条 new 语句创建了两个对象,然后用 a,b 这两个变量分别指向了其中一个对象,这是两个
不同的对象,它们的首地址是不同的,即 a 和 b 中存储的数值是不相同的,所以,表达式 a==b将返回false,而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回 true。
3. 字符串的比较基本上都是使用equals 方法。
如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法,Object 类的equals 方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义 equals
方法,它默认的 equals
方法(从 Object
类继承的)就是使用==
操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用 equals
和使用==
会得到同样的结果,如果比较的是两个独立的对象则总返回 false
。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖 equals
方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
10 、静态变量和实例变量的区别?
- 在语法定义上的区别:静态变量前要加
static
关键字,而实例变量前则不加。 - 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
上一篇: Java11新特性