Java编程思想(二) —— 初始化与清理

来源:互联网 发布:godaddy和阿里云 编辑:程序博客网 时间:2024/06/05 06:10

(一)操作符一章的int类型数据溢出的问题在Java7的版本中仍然存在,而且溢出的结果千奇百怪。

public class Hello {    public static void main(String[] args) {        int i = Integer.MAX_VALUE;        System.out.println(i);        System.out.println(i*4);        System.out.println(i*5);    }}
结果分别为2147483647,-4,2147483643。

当应用中的数据超过int的最大值时,就不能用int类型了。


(二)控制流程一章值得注意的是For语法(用来遍历数组和容器)和标签。

Java没有goto,先说很少接触到的标签,这标签的功能和goto类似。

public class Hello {    public static void main(String[] args) {        Label1:           for (int i = 1; i < 10; i++) {            for (int j = 1; j < 10; j++) {                System.out.println(j);                if (j == 2) {                    break Label1;                }            }         }    }}

break之后能够break最外层的循环,当j等于2的时候,直接跳出。如果简单的用上一两个比较方便,但是大量用到之后,跳来跳去的东西是让人头疼的。


For遍历的语法。

public class Hello {    public static void main(String[] args) {        int[] i = {1,2,3,4,5,6,7,8,9,0};        for(int k = 0; k< i.length;k++){            System.out.println(i[k]);        }        for(int j:i){            System.out.println(j);        }    }}
明显后者遍历的语法更加简洁,应用于容器的以后会提到。


(三)接下来就是初始化与清理的问题。

(1)首先是方法重载的问题。重载方法同名字,但是参数类型,甚至参数的顺序不同都可以(最后一个不提倡,如果就单单改变顺序的话传参易出错)。

public class TV {    TV(String name){    }        void control(){    }    /*int  control(){     * return 1;    }*/    void control(int page,String name){    }    void control(String name,int page){    }}
如上,重载的方法不能同参数同名不同类型,因为编译器根本就不知道你要用哪个。

此时如果用new出TV对象的话,是会出错的,因为默认是给你一个构造器的TV(){}

但是你此时自己自定义构造器,那么编译器就会觉得你自己弄的,那么默认的构造器你也自己去写。


(2)this关键字

以前博客也有一个问题的答案就是this

Android this与Activity.this的区别 

this在方法内部使用,获得当前对象的引用。

public class TV {    String name;    int price;    void point(String name){        this.name = name;    }    TV(String name){        this.name = name;    }    TV(int price,String name){        this(name);        this.price = price;    }
经常使用的,其实就是将传参的name赋给TV的name。this也可以调用自己的构造器。


(3)垃圾回收


GC回收算法小了解(以前看别人写的文章的一些笔记)
1 引用计数法  堆中的对象各自对应引用计数器,new的时候+1,为0的时候回收。
2 复制算法    两倍的内存空间,垃圾回收的时候遍历其中一个空间,遍历使用的对象
再复制到另外一个空间中。
3 标记清除法  标记使用的对象清除未使用的对象。

按分区对待方式区分
1 增量收集   实时垃圾回收
2 分代收集   年轻代 年老代 持久代

线程区分 
串行 并行 并发


(4)初始化问题

public class TV {    int price; //字段为基本类型时,会自动初始化,int默认为0    TV tv;//引用的话默认为null    void point(){        int p;      //  System.out.println(p);  局部变量需要自己初始化    }}

(5)static关键字

之前一直想不明白那句,static方法内部不能调用非静态方法,昨天看的时候大拍了一下自己的大腿,其实,static可以让你直接用类来访问该方法,但是如果里面可以调用静态方法,那么两者就没什么区别了,可以互相嵌套。


静态数据的初始化,static修饰的静态存储区域会先初始化,而且就初始化一次。这样说的话,其实我们没有写的默认构造器其实也是static方法,最先初始化。


(6)可变数组参数

参数后面加3个点,很奇葩的用法:

public class TV {    static void point(int... price){       for(int i :price){           System.out.println(i);       }    }    public static void main(String[] args) {        TV.point();        TV.point(1);        int[] p = {1,2,3,4,5};        TV.point(p);    }}/*result:112345*/
可变数组参数,可以是空,可以一个,可以多个。

初始化是基础的东西,写程序的时候的低级错误的一些原因在此,经常就是初始化的没初始化。还有static的顺序也是优先的。

2 0