-------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是动态语言,数组初始化后,长度依然可变
数组变量只是一个引用,数组对象才是保存在堆内存中的连续内存空间,对数组初始化并不是对数组变量初始化,而是在堆内存中创建数组对象,及分配一块连续的内存空间,这块连续的内存空间长度就是数组长度
代码解释:
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(); } }