参数顺序改变时,在方法被调用时也能被区分。
但如果只是返回值类型不同,参数列表相同,调用方法时并不能区分。所以返回值类型必须与参数搭配着改变才能构成重载。
int和Integer的区别
1、Integer是int的包装类,int则是java的一种基本数据类型
2、Integer变量必须实例化后才能使用,而int变量不需要
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4、Integer的默认值是null,int的默认值是0
延伸:
关于Integer和int的比较
1、由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。
1
2
3
Integer i =
new
Integer(100);
Integer j =
new
Integer(100);
System.out.
(i == j);
//false
2、Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)
(第二题考察的是这里)
1
2
3
Integer i =
new
Integer(100);
int j = 100;
System.out.
(i == j);
//true
3、非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)
1
2
3
Integer i =
new
Integer(100);
Integer j = 100;
System.out.
(i == j);
//false
4、对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false
(第一题1,3判断考察的是这里)
1
2
3
4
Integer i = 100;Integer j = 100;
System.out.
(i == j);
//trueInteger i = 128;
Integer j = 128;
System.out.
(i == j);
//false
对于第4条的原因:
java在编译Integer i = 100 ;时,会翻译成为Integer i = Integer.valueOf(100);,而java API中对Integer类型的valueOf的定义如下:
1
2
3
4
5
6
7
public
static
Integer valueOf(int i){
assert IntegerCache.high >= 127;
if
(i >= IntegerCache.low && i <= IntegerCache.high){
return
IntegerCache.cache[i + (-IntegerCache.low)];
}
return
new
Integer(i);
}
java对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了
当catch捕获到异常后,模块之外的语句将不再执行。
第一次:foo(0)。没有捕捉到异常,所以不会输出2,而finally是一定要执行的,所以输出3
输出3之后顺序往下执行,遇到output+=”4“,输出4
第二次:foo(1)。捕捉到异常,输出2,同理,而finally是一定要执行的,所以输出3,而捕捉到异常,模块外的语句将不再执行。
所以最终答案是3423,选C。
static方法中是不能访问非静态变量,否则导致编译错误
题中static方法访问的是静态变量,所以不会导致编译错误。正确;
int的默认值是0,integer的默认值是null,此处为int,所以输出0。
子类继承父类后,还可以添加自己的变量和方法,比父类更加具体。
如果else if 中的条件是包含关系,改变之后久可能对程序的执行结果有影响。
C. double d = 0x12345678; (十六进制整数,自动转 双精度浮点数)是正确的。
D. float f = -412; (自动转 -412.0f 单精度 浮点数)是正确的。
E. long test = 012; (八进制整型)是正确的。
A中,如果 true 用大写,int other = (int) TRUE; 便是正确的。
多态可以扩展代码模块。
静态代码块,在jvm加载类的时候就会加载执行,而且只执行一次;
非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次
一个程序可以有多个静态非静态代码区域。
Emmmmmmmmmm.......