Java容易搞错的知识点
?
结果:?
2?
3?
4?
分析:?
少了break;所以2以下的case和default都执行了一遍。?
二、Equals和==运算符?
代码:
?
结果:?
x+y equals z:true?
a == z:false?
x == hello:true?
a == helloworld:true?
a == x+y:false?
分析:?
1.String.equals()方法比较的是字符串的内容,所以(x + y).equals(z)为true.?
2.“==”比较的是 String 实例的引用,很明显 a 和z 并不是同一个 String 实例,所以(a == z)为false.?
3.根据常量池的知识,容易得知(x == "hello")和(a == "hello" + "world")都为true.?
(常量池指的是在编译期被确定并被保存在已编译的.class 文件中的一些数据。它包含了?
关于方法、类、接口等,当然还有字符串常量的信息。也就是所谓的持久代。)?
4.那么(a == (x + y))为什么是false呢?这点暂点有点不大清楚。初步认为是x+y是引用相加,不能放入常量池。?
三、Override覆盖?
代码:
?
结果:?
parent static say?
child say?
分析:?
1.我们创建了一个Parent类的实例。变量 p 的数据类型为 Parent 类 但是它仍旧是 Child 类的一个实例。因为Child类覆盖了Parent类的方法say2(),所以p.say2()调用为子类的方法。?
2.为什么p.say()却是调用父类Parent的方法呢?因为Java中规定“实例方法被覆盖,静态方法被隐藏”.?
关于Override的一些规则:?
用子类的静态方法隐藏父类中同样标识的实例方法是不合法的,编译器将会报错;?
用子类的实例方法覆盖父类中同样标识的静态方法也是不合法的,编译器同样会报错;?
带关键字 final的方法(静态和实例方法)都不能被覆盖;?
实例方法能够被覆盖;?
抽象方法必须在具体类中被覆盖。?
四、Java强类型?
代码:

结果:?7.0?
结果:?
The value of c :0?
分析:?
public void Constructor()并不是一个真正的构造函数,而是一个方法。所以c的值为默认值0.?
六、提前引用?
代码:

结果:?
first = 0?
分析:?
由于在初始化second之前test方法就访问了它,那么方法得到的是second的默认值,即 0。 因此输出结果first= 0,而不是2。假如你使用方法调用来初始化静态变量,那么你必须保证 这些方法并不依赖于在它们之后声明的其它静态变量。静态变量以及静态初始化块是在类被加载进 JVM 时执行初始化操作的。Java 语言规范8.5节指出“静态初始化块和静态变量是按照其在代码中出现的顺序依次执行初始化操作的,而不能在类变量声明出现之前就引用它”。?
七、对象引用?
代码:
?
??
结果:?
AB,B
?
?
?
java中方法传参数确实都是传值?
当参数是对象引用时仅可以改变引用对象的内部状态,但对参数对象重新赋值是没有意义?
所以x.append(y)改变了a指向StringBuffer对象的内容//ok?
y=x,将b重新指向其他地址//failur?
?
原文:http://page.renren.com/600882494/note/751310837
部分个人进行更正修改
?
?