您的位置:首页 > 编程语言

编程细节积累01

2013-08-05 18:03 141 查看
Java程序员的基本修养01
1, 数组使用

Java是静态语言,数组初始化后长度是不可以改变的

a)        数组初始化

                        i.             静态初始化:

String[]  s  =  newString[]{

         “cloud”,”zhangsan”,”lisi”

};

简化形式:

String[]  s  = {“cloud”,”zhangsan”,”lisi”};

                      ii.             动态初始化:

String[]  s  = new String[4];

基本类型数组和引用类型数组在初始化时内存分配机制有什么区别?

         基本类型在初始化时:程序先为数组分配空间,再讲数组元素的值存入对应内存中。

         引用类型:数组初始化时,先为数组在堆内存中分配一段空间,因为数组中存放的是引用类型,所以先创建引用类型的变量,数组中存入的是引用变量的地址,并不是引用变量本身

         JavaScript是动态语言,数组初始化后,长度依然可变

数组变量只是一个引用,数组对象才是保存在堆内存中的连续内存空间,对数组初始化并不是对数组变量初始化,而是在堆内存中创建数组对象,及分配一块连续的内存空间,这块连续的内存空间长度就是数组长度

代码解释:



Java语言不允许直接访问堆内存中的数据,要访问堆内存中的数据只能通过数组引用变量来访问数组。

多维数组其实就是一层层的引用

1, 对象及内存管理

a)        局部变量可分为:

Ⅰ)形参:在方法签名中定义的局部变量,由方法调用者负责为其赋值,随方法的结束而消亡

Ⅱ)方法内的局部变量

Ⅲ)代码块内的局部变量

b)       static关键字不能修饰外部类,局部变量,局部内部类

         因为:static关键字修饰的成员是属于类本身的,外部类不行;局部变量出局部范围后就销毁了,不能是属于类;局部内部类首先也是局部的,所以也不行

 

c)        Java类里定义成员变量的顺序问题



Java内存管理机制:

         内存分配:jvm为 新创建的对象在堆内存中分配内存空间

         内存回收:java对象失去引用,jvm会自动清理该对象

 

实例变量的初始化时机:

         初始化三种方式:

1,  定义实例变量时指定初始值

2,  非静态初始化块中对实例变量指定初始值

3,  构造器中对实例变量指定初始值

class Cat {
private String name;
private int age;

public Cat(String name, int age) {
System.out.println("执行构造函数");
this.name = name;
this.age = age;
}

// 非静态初始化块
{
System.out.println("执行非静态初始化块");
// 当下面定义weight的代码先执行
weight = 2.0;
}
double weight = 2.3;
}

public class InitDemo {
public static void main(String[] args) {
Cat c = new Cat("kitty", 3);
System.out.println(c.weight);
}
}

类变量初始化:

1,  定义时初始化

2,  静态代码块中初始化

执行顺序按程序中代码的顺序

public class InitDemo1 {

private static String name = "Rhythm";
static {
System.out.println("执行静态代码块");
age = 12;
}
private static int age = 22;

public static void main(String[] args) {
System.out.println(InitDemo1.name);
System.out.println(InitDemo1.age);
}
}


为什么java要求内部类访问的局部变量必须使用final修饰?

         因为,对于普通局部变量来说,作用域就是该方法,方法结束后局部变量也会消失,但是内部类可能产生隐式的闭包(Closure)这样就会使得局部变量脱离方法继续存在,如果该变量不被final修饰,可以随便更改,就会照成混乱。

 

public class ClosureTest {

/*
* 如下所示: 如果main方法结束后,执行run方法的线程还在执行,则可以继续访问到main方法的局部变量
*/
public static void main(String[] args) {
// 定义局部变量
final String name = "haha";
// 在内部类中访问局部变量
new Thread(new Runnable() {
public void run() {
System.out.println(name);
}

}).start();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: