2.2、类与对象

  1. 2.2、类与对象

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();        //调用方法
     }
 }

11

再看以下的程序

 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();        //调用方法
     }
 }

12

从本程序中得到总结:一个栈内存只能引用另一个堆内存空间,但是一个堆内存中可以被多个栈内存所同时指向。

在Java中不用的内存空间就称为垃圾空间,垃圾空间要等待垃圾收集机制进行空间的释放,垃圾收集机制称为GC。


转载请注明来源