类是面向对象语言中最为重要的一种数据类型,类声明的变量称为对象。类是创建对象的模板,当使用一个类创建一个对象时,也称给出了这个类的一个实例。
创建对象
创建对象包括对象的声明
和为声明的对象分配内存
两个步骤:
对象的声明
类的名字 对象名字; //声明之后,就可以分配内存了
为声明的对象分配内存
使用new运算符和类的构造方法为声明的对象分配内存,即调用构造方法为其分配内存。如果类中没有构造方法,系统会调用默认的构造方法(默认构造方法:无参无语句)。如果类中定义了一个或多个构造方法,那么Java不提供默认的构造方法。
举个栗子:
class xiyoujiRenwu{
float height,weight;
String head,ear,hand,foot,mouth;
void speak(String s){
System.out.println(s);
}
}
public class Example4_1{
public static void main(String argv[]){
xiyoujiRenwu zhubajie; //声明对象
zhubajie = new xiyoujiRenwu(); //为对象分配内存,默认构造方法
}
}
//自建构造方法此处不再给出,在以后的讲述中会有提到。
Notice: 如果类中定义了一个或者多个构造方法,那么Java不提供默认的构造方法!!!
对象的内存模型
接上面的代码给大家介绍一下对象的内存模型,以便于更好的理解对象这一概念:
- 声明对象zhubajie后,zhubajie的内存中还没有任何数据,也就是空对象。空对象不能使用,因为它还没有得到任何“实体”,必须再进行为**为对象分配内存的步骤,即为对象分配实体。
- 当系统见到:
时,就会做两件事。zhubajie = new xiyoujiRenwu();
- 为xiyoujiRenwu类中的成员变量height, weight, head, ear, mouth, hand, foot分配内存,即类中的成员变量被分配内存空间,然后执行构造方法进行数据的初始化。(如果成员变量在声明时没有指定初值,并且所使用的构造方法也没有对成员变量进行初始化,那么,整型变量默认初值为0,浮点型变量默认初值0.0,boolean型变量默认false,引用型变量默认初值为NULL)。
- 给出一个信号,保证这些变量是属于对象zhubajie的。即new运算符为这些变量分配完内存后,会返回一个引用给zhubajie对象。(这样也就不难理解一个类使用new创建不同的对象(实例变量等)不会相互影响了,因为他们被分配不同的内存)。如下图所示:
使用对象
抽象的目的时产生类,而类的目的是创建具有属性和行为的对象。对象不仅可以操作自己的变量改变状态,而且还能调用类中的方法产生一定的行为。
对象.变量; //调用变量
对象.方法; //调用方法
体现封装: 当对象调用方法时,方法中出现的成员变量就是分配给该对象的变量。当对象调用方法时,方法中的局部变量被分配内存空间,方法执行完毕,局部变量即可释放内存。
Notice: 局部变量在声明时如果没有初始化,那么它就没有默认值。
对象的引用和实体
当用类创建一个对象时,类中的成员变量在堆(一种运行时的数据结构,支持动态内存管理) 中分配内存空间,这些内存空间成为该对象的实体或对象的变量,而上文所提到的对象中存放的引用在栈中分配内存,以确保实体由该对象使用。
由上面的解释大家可以知道,引用 和 实体 是分开的,即大家可以改变引用来相应改变它所能调用的实体。
这么说大家可能还是不清楚,举个栗子给大家:
class x1aoPoint{
public int a,b; //public表示权限,后面会提到
x1aoPoint(int a,int b){ //自定义构造方法(又复习了一下)
this.a = a;
this.b = b; //关于this会在后面的博客中提到哦
}
}
public class Lin{
public static void main(String args[]){
x1aoPoint p1,p2;
p1 = new x1aoPoint(1,2);
p2 = new x1aoPoint(4,3);
//下面是重点!!!
System.out.println("("+p1.a+","+p1.b+")");
System.out.println(p1+"\n"+p2);
p1 = p2; //改变引用,使p1也指向此前为p2分配的变量
System.out.println("("+p1.a+","+p1.b+")");
System.out.println(p1+"\n"+p2);
}
}
运行结果如下,其余请自己体会:
x1aolin@x1aolin-E402NA:~/桌面/javaExample$ vim Lin.java
x1aolin@x1aolin-E402NA:~/桌面/javaExample$ javac Lin.java
x1aolin@x1aolin-E402NA:~/桌面/javaExample$ java Lin
(1,2)
x1aoPoint@233c0b17
x1aoPoint@61a52fbd
(4,3)
x1aoPoint@61a52fbd
x1aoPoint@61a52fbd
最后补充一点: Java有所谓的“垃圾回收”机制:周期性的检测某个实体是否已经不再被任何对象所拥有,如果发现这样的实体,就会自动释放掉实体所占有的内存。所以,上面代码中,当p2的引用赋给p1时,最初分配给p1的实体就会被释放掉。