2.2、类与对象
对象的产生:
- 对象的产生步骤实际上是分为两步完成的:
- 声明对象:类名称 对象名称 = null:
- 实例化对象:对象名称 = new 类名称();
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:" + name + "年龄:" +age);
}
}
public class OODemo01 {
public static void main(String args[]) {
Person per = null; //声明对象
per.name = "张三"; //为名字赋值
per.age = 30; //为年龄赋值
per.tell(); //调用方法
}
}
此时出现了以下的错误:
Exception in thread "main" java.lang.NullPointerException
at OODemo01.main(OODemo01.java:12)
这个错误的根本原因:是由于对象未被实例化,所以出现了空指向异常。
实际上,对象的产生,与数组一样,需要划分堆 - 栈空间的
- 对象实际上是保存在栈内存的:Person per = null:
- 实例化之后对象会开辟对应的堆内存空间:per = new Person();
- 在堆内存中实际上存放的是对象的各个属性,因为对象中只能依靠属性的不同来区分
已经知道类中的属性全部保存在堆内存中,那么全部的方法呢?
- 全部的方法保存在全局代码块之中。
既然可以产生一个对象,那么就可以产生多个,多个对象之间会相互影响吗?
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:" + name + "年龄:" +age);
}
}
public class OODemo02 {
public static void main(String args[]) {
Person per1 = null;
Person per2 = null; //声明对象
per1 = new Person();
per2 = new Person();
per1.name = "张三"; //为名字赋值
per1.age = 30; //为年龄赋值
per1.tell(); //调用方法
per2.name = "李四"; //为名字赋值
per2.age = 33; //为年龄赋值
per2.tell(); //调用方法
}
}
因为声明了两个对象 ,所以在栈内存中开辟两个空间,保存两个对象,之后此两个对象分别实例化,只要一出现关键字new就表示要开辟新的内存空间。那么这两个对象之间就不会互相影响到。
在对象的操作中实际上是存在引用传递的。所谓的引用传递,就是将一个堆内存空间的使用权交给了其他的对象,就相当于为一个堆内存空间起了一个别名。
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:" + name + "年龄:" +age);
}
}
public class OODemo02 {
public static void main(String args[]) {
Person per1 = null;
Person per2 = null; //声明对象
per1 = new Person();
per2 = per1; //引用传递
per1.name = "张三"; //为名字赋值
per1.age = 30; //为年龄赋值
per2.age = 33; //为年龄赋值
per1.tell(); //调用方法
per2.tell(); //调用方法
}
}
再看以下的程序
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:" + name + "年龄:" +age);
}
}
public class OODemo02 {
public static void main(String args[]) {
Person per1 = null;
Person per2 = null; //声明对象
per1 = new Person();
per2 = new Person();
per2.name = "李四"; //为名字赋值
per2 = per1;
per1.name = "张三"; //为名字赋值
per1.age = 30; //为年龄赋值
per2.age = 33; //为年龄赋值
per1.tell();
per2.tell(); //调用方法
}
}
从本程序中得到总结:一个栈内存只能引用另一个堆内存空间,但是一个堆内存中可以被多个栈内存所同时指向。
在Java中不用的内存空间就称为垃圾空间,垃圾空间要等待垃圾收集机制进行空间的释放,垃圾收集机制称为GC。
转载请注明来源