java初始化与清理,
(一)操作符一章的int类型数据溢出的问题在Java7的版本中仍然存在,而且溢出的结果千奇百怪。
[java] view plaincopy在CODE上查看代码片派生到我的代码片
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类似。
[java] view plaincopy在CODE上查看代码片派生到我的代码片
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遍历的语法。
[java] view plaincopy在CODE上查看代码片派生到我的代码片
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)首先是方法重载的问题。重载方法同名字,但是参数类型,甚至参数的顺序不同都可以(最后一个不提倡,如果就单单改变顺序的话传参易出错)。
[java] view plaincopy在CODE上查看代码片派生到我的代码片
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在方法内部使用,获得当前对象的引用。
[java] view plaincopy在CODE上查看代码片派生到我的代码片
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)初始化问题
[java] view plaincopy在CODE上查看代码片派生到我的代码片
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个点,很奇葩的用法:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
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:
*/
可变数组参数,可以是空,可以一个,可以多个。
初始化是基础的东西,写程序的时候的低级错误的一些原因在此,经常就是初始化的没初始化。还有static的顺序也是优先的。