首页 > 代码库 > Java编程思想学习笔记

Java编程思想学习笔记

1、类型默认值

对象的默认值是null。boolean 的默认值是false。char的默认值是‘\u0000‘(null)。

byte的默认值(byte) 0。short 默认值 (short)0。int 默认值 0。long 默认值 0L。float 默认值 0.0f。double 默认值0,0d。

所以对于成员字段都会有默认的初始化,但是对于局部变量若没有初始化就是内存的随机值。

2、java 的数据是有符号数。

3、static修饰的字段和方法是属于类的,不是对象!非static 字段和方法是和特定的对象关联在一起的。static在类加载就初始化获得空间,所以静态方法只能访问静态字段!!!(没有对象就没有与对象对应的字段)但是非静态方法可以访问静态字段。(静态字段先于非静态字段创建)。一个类的静态字段被该类的所有对象共享

测试用例:

public class Test {

private static  class MyTest{

private int i=10;
private static final int j=1000;

public void getOne(){

System.out.println("非静态方法访问非静态字段"+i);
System.out.println("非静态方法访问静态字段"+j);
}
public static void getTwo(){

//System.out.println("非静态方法访问非静态字段"+i);
System.out.println("静态方法访问静态字段"+j);
}

}

public static void main(String[] args) {
MyTest.getTwo();
new MyTest().getOne();
MyTest t1= new MyTest();
MyTest t2= new MyTest();
MyTest t3= new MyTest();
System.out.println("对象调用静态方法");
t1.getTwo();//对象调用静态方法
t2.getTwo();//对象调用静态方法
t3.getTwo();//对象调用静态方法
}


}

结果:

静态方法访问静态字段1000
非静态方法访问非静态字段10
非静态方法访问静态字段1000
对象调用静态方法
静态方法访问静态字段1000
静态方法访问静态字段1000
静态方法访问静态字段1000

4、==比较的是地址,eques方法比较的是地址里的值。

测试用例:

public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
System.out.println(n1.equals(n2));
}


结果:

false
true
true

5、左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补 0)。“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入 0;若值为负,则在高位插入 1。Java 也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入 0。

若对 char ,byte 或者 short 进行移位处理,那么在移位进行之前,它们会自动转换成一个 int。

6、字串运算符+

7、注意算术运算中的自动类型转换。利用强制类型确保结果准确。

8、(1) 简单的一个 continue 会退回最内层循环的开头(顶部),并继续执行。
(2) 带有标签的 continue 会到达标签的位置,并重新进入紧接在那个标签后面的循环。
(3) break 会中断当前循环,并移离当前标签的末尾。
(4) 带标签的 break 会中断当前循环,并移离由那个标签指示的循环的末尾。

测试用例:

public static void main(String[] args) {
int i = 0;
outer: while (true) {
prt("Outer while loop");
while (true) {
i++;
prt("i = " + i);
if (i == 1) {
prt("continue");
continue;
}
if (i == 3) {
prt("continue outer");
continue outer;
}
if (i == 5) {
prt("break");
break;
}
if (i == 7) {
prt("break outer");


break outer;
}
}
}
}


static void prt(String s) {
System.out.println(s);
}

测试结果:

Outer while loop
i = 1
continue
i = 2
i = 3
continue outer
Outer while loop
i = 4
i = 5
break
Outer while loop
i = 6
i = 7
break outer

9、垃圾收集器只知道释放那些由 new 分配的内存,所以不知道如何释放对象的“特殊”内存。为解决这个问题,Java 提供了一个名为 finalize()的方法,可为我们的类定义它。在理想情况下,它的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用 finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存。所以如果使用 finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作。

10、final关键字

修饰类:该类是不能被继承的。

修饰字段或变量:说明该变量不能被修改类似const,内部类访问局部变量,局部变量要申明为final且该变量存储在堆上。

修饰方法:该方法是不能被复写的。同时若该方法没有循环,开关语句,则向编译器申请内联。


11、static 内部类

为正确理解 static 在应用于内部类时的含义,必须记住内部类的对象默认持有创建它的那个封装类的一个对
象的句柄。然而,假如我们说一个内部类是 static 的,这种说法却是不成立的。static 内部类意味着:
(1) 为创建一个 static 内部类的对象,我们不需要一个外部类对象。
(2) 不能从 static 内部类的一个对象中访问一个外部类对象。


Java编程思想学习笔记