引用类型
MyClass myclass = new MyClass();
表示:new
的时候在堆中新建了一个对象,这个对象是这个类MyClass
的实例,myclass是该对象的引用。引用的三种类型:类引用、接口引用、数组引用。 基本类型和引用类型的区别:
基本类型仅表示数据类型,引用类型所引用的实例除了表示复杂数据类型,还能包括操纵这种数据类型的行为,如String类,包含了各种操作字符串的方法。 Java虚拟机处理引用类型变量和基本数据类型变量的方式不一样,Java虚拟机会为其分配数据类型实际占用的内存的大小;对于引用类型变量,仅仅是一个指向堆区的某个类实例(对象)的指针,所以引用变量的取值为类实例的内存地址,那么引用变量位于Java虚拟机的运行时数据区的那个区?
变量的作用域
类的成员变量分为两种:
被static
修饰的静态变量:在内存中位于方法区,只能有一个,被所有的实例共享,可以直接通过类名访问,其生命周期取决于类的生命周期。 没有修饰的实例变量:类的每个实例(对象)都有相应的实例变量,没创建一次对象,Java虚拟机就会为实例变量分配一次内存,实例变量位于堆区,其生命周期取决于对象的生命周期 静态变量可以作为所有实例的共享数据,不依赖于特定的实例;实例变量属于特定的实例,有不同的应用场合。
public class Doll {
private static int number = 0 ;
private int id = 0 ;
private String name;
public Doll ( String name) {
this . name = name;
number++ ;
id = number;
}
public void speak ( String word) {
String showNumber = "目前共有" + number+ "个娃娃" ;
String showId = "我的ID是" + id;
System. out. println ( name+ ":" + showNumber) ;
System. out. println ( name+ ":" + showId) ;
System. out. println ( name+ ":" + word) ;
}
public static void main ( String[ ] agrs) {
Doll doll1 = new Doll ( "贝贝" ) ;
Doll doll2 = new Doll ( "晶晶" ) ;
doll1. speak ( "大家好" ) ;
doll2. speak ( "大家好" ) ;
}
}
在一个类中,可以定义同名的成员变量和局部变量(或者参数),在类的方法中,成员变量会被屏蔽,如果想引入成员变量,需要添加this
指针,this
为当前对象的引用;在类的构造方法中,this
语句还可以调用这个类的其他构造方法。 局部变量的生命周期参照《Java面向对象编程 》P100
参数传递
在参数传递中,如果实参是基本数据类型,那么向形参传递的是值,在被调函数中改变其值不影响他在主调函数中的值;如果实参是对象或者数组,那么实参传递给形参的是引用,一般情况下可以在被调函数中改变主调函数的对象属性或者数组的值,但也有特殊情况,比如函数调用过程中传递对象时,在被调函数中再去创建一个新的对象,那么改变这个新的对象的值不会影响主调函数的对象的值
变量的初始化
对于类的成员变量,不管程序有没有显式的初始化,Java虚拟机会自动初始化为默认值。 局部变量声明之后,Java虚拟机不会自动初始化,因此必须程序员显式初始化,不然会报错。 取值范围小的数据类型允许直接赋值给取值范围大的数据类型,反之,则必须进行强制类型的转换。