黑马程序员--编程细节积累01

-------android培训java培训、期待与您交流! ----------

Java程序员的基本修养01

1, 数组使用

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

a)        数组初始化

                        i.             静态初始化:

String[]  s  =  newString[]{

         “cloud”,”zhangsan”,”lisi”

};

简化形式:

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

                      ii.             动态初始化:

String[]  s  = new String[4];

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

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

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

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

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

代码解释:

黑马程序员--编程细节积累01_第1张图片

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

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

1, 对象及内存管理

a)        局部变量可分为:

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

Ⅱ)方法内的局部变量

Ⅲ)代码块内的局部变量

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

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

 

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

黑马程序员--编程细节积累01_第2张图片

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();
	}

}

------- android培训 java培训 、期待与您交流! ----------

你可能感兴趣的:(数组初始化,内部类访问局部变量)