java解惑――易错知识点归纳总结 (一)

2014-11-24 09:26:36 · 作者: · 浏览: 16

纯粹个人观点,如果有误,欢迎指正!


一. Switch
1.其能接受的数据类型有四个,char , byte, short, int
2.Default 可放在switch中的任何一个地方,但只有给定的条件匹配不到时,才会执行
3.Case,default语句如果执行完要跳出,必须用break, 没的话会向下继续执行(如果碰到case语句则直接进入执行)
实例1:
[java]
int i = 1, j = 0;
switch (i) {
case 2:
j += 6;
case 4:
j += 1;
default:
j += 2;
case 0:
j += 4;
}

int i = 1, j = 0;
switch (i) {
case 2:
j += 6;
case 4:
j += 1;
default:
j += 2;
case 0:
j += 4;
} What is the value of j
A.0
B.1
C.2
D.4

E.6

What is the acceptable type for the variable i
A.byte
B.long
C.float
D.double
E.object
F.A and B
G.C and D


二. String 和 StringBuffer
String 定义的是字符串常量,其 一旦定义就不再改变,如下:
String s = “ABC”;
S = s.subString(2); //会重新生成一个字符串对象
以上两句执行后在内存中会产生“两”个字符串对象 一个”ABC”,另一个是s指向的”AB”(注意s已不再指向”ABC”)
StringBuffer 定义的是字符串变量,其 可以改变,如下:
StringBuffer s1 = new StringBuffer(“ABC”);
S1 = s1.subString(2);
以上两句执行后在内存中只产生“一个”字符串对象: s指向的”AB”;


三. String s = new String(“XYZ”) 产生了几个对象
该语句会产生2个字符串对象:
一个是通过 ” ” 方式在 编译期 产生,存放在常量池中
一个是通过new方式在 运行期 产生,存放在堆内存中
但在运行时只会通过new方式产生一个对象


四. java中的参数只能“按 ”传递,且传递的是 的 copy
如是基本类型,则传递的是基本类型的副本
如是引用类型,则传递的是引用本身的副本


五. 方法重载和覆盖的条件
符合重载的条件:
1.在同一个类中
2.有多个同名的方法,
3.方法参数不同(参数的个数不同 或则 参数的类型不同)
实例:
[java]
public class MethodOver {
public void setVar (int a, int b, float c) {
}
}

public class MethodOver {
public void setVar (int a, int b, float c) {
}
} Which two overload the setVar method (Choose Two)
A.private void setVar (int a, float c, int b) { }
B.protected void setVar (int a, int b, float c) { }
C.public int setVar (int a, float c, int b) (return a;)
D.public int setVar (int a, int b, float c) (return a;)
E.protected float setVar (int a, int b, float c) (return c;)


符合覆盖的条件:
1.在继承中
2.子类中的方法名和父类相同
3.子类中的方法参数和父类相同
4.子类中的方法返回类型和父类一样
5.子类的方法不能比父类抛出更多的异常
6.子类的方法访问范围大于或等于父类
覆盖值得注意的是如果子类中有一个方法名称和父类一样,但参数不同,那不叫覆盖,所以也就不受覆盖的条件限制(注意该方法可以存在)

六. java类中的变量初始化相关的知识
6-1.初始化顺序分三步:
1. 类加载时,初始化静态变量和静态区块,先父类后子类
2. 运行中当new出一个对象时,开始为对象分配空间并初始化实例变量,先父类后子类
3. 调用构造函数时,先执行父类的构造函数,再执行子类的构造函数,具体过程是调用子类的构造函数时,在第一行处会调用父类的构造函数(显式或隐式)

6-2. 初始化时各类型的变量初始化的 :
引用类型: null
基本类型:
[java]
boolean : false
char:\u0000
byte: 0
short: 0
int: 0
long: 0
float: 0.0
double: 0.0

boolean : false
char:\u0000
byte: 0
short: 0
int: 0
long: 0
float: 0.0
double: 0.0 6-3. 数组的初始化
当我们产生某个存储对象的数组时,真正产生的其实是个存储references的数组。此数组建立之后,其中的每一个reference皆会被自动设为某个特殊值。该值以关键字null表示。当Java看到null值,便将这个reference视为“不指向任何对象”。使用任何reference之前,你必须先将某个对象指派给它。如果你使用某个reference而其值为null,便会在执行期发生错误
数组在分配空间时就开始了初始化,初始化规则,基本类型按照6-2的规则进行初始化,引用类型类型全部初始化为null

6-4. java中的所有的实例变量都有系统默认初始化,所有的方法变量由方法本身进行初始化,且方法中的变量一定要初始化后才能应用

七. java中的构造函数
1. 构造函数不能被继承
2. 每一个类都至少有一个构造函数,自己不定义,编译器也会给分配一个默认的不带参数的构造函数
3. 子类的构造函数一定会调用父类的构造函数,通过super()调用,或显式或隐式,显式调用的父类构造函数必须存在; 如果没有显式调用则编译器会自动在子类的构造函数第一行处加上super()这个隐式调用,这时要求父类一定要有不带参数的构造函数存在(如果父类自己定义了构造函数,但带有参数,编译时会报错)
例子:
[java]
class super1{
public int I = 0;
public super1 (String text){
I = 1;
}
}
public class sub1 extends super1{
public sub1(String text){
// super(text);
I= 2;
//隐式超级构造super1()是未定义的。必须明确援引另一个构造
}
public static void main (String args[]){
sub1 sub2 = new sub1("Hello");
System.out.println(sub2.I);
}
}

class super1{
public int I = 0;
public super1 (String text){
I = 1;
}
}
public class sub1 extends super1{
pu