阿里Java学习路线:阶段 1:Java语言基础-Java面向对象编程:第1章:类与对象:课时5:对象内存分析
程序员文章站
2024-02-26 18:49:28
...
java之中类属于引用数据类型,引用数据类型最大的困难之处在于要进行内存的管理,同时在进行操作的时候也会发生有内存关系的变化,所以本次针对之前的程序的内存关系进行一些简单分析。
范例:以下面的程序为主进行分析
class Person { //定义一个类
String name ; //人员的姓名
int age ; //人的年龄
public void tell() {
System.out.println("姓名: " + name + "、年龄: " + age) ;
}
}
public class JavaDemo {
public static void main(String args[]) {
Person per = new Person() ; //声明并实例化对象
per.name = "张三";
per.age = 18 ;
per.tell(); //进行方法的调用
}
}
如果要进行内在分析,那么首先给出现场最为常用的内存空间:
堆内存:保存的是对象的具体信息,在程序之中堆内存空间的开辟是通过new完成的;
栈内存:保存的是一块堆内存的地址,即:通过地址找到堆内存,而后找到对象内容,但是为了分析简化起见,可以简单的理解为:对象名称保存在了栈内存之中。
清楚了以上的对应关系之后,那么下面就针对于之前的程序进行分析。
在之前进行分析的时候可以发现对象的实例化有两种语法,一种是之前使用的声明并实例化对象,另外一种就是分步完成,所以下面针对分步的内存操作进行分析。
范例:定义程序代码
public class JavaDemo {
public static void main(String args[]) {
Person per = null ; //声明对象
per = new Person() ; //实例化对象
per.name = "张三";
per.age = 18 ;
per.tell(); //进行方法的调用
}
}
下面通过内存分析来进行解释。
需要特别引起注意的是,所有的对象在调用类中的属性或方法的时候必须要实例化完成后才可以执行。
范例:错误的代码
public class JavaDemo {
public static void main(String args[]) {
Person per = null ; //声明对象
per.name = "张三";
per.age = 18 ;
per.tell(); //进行方法的调用
}
}
Exception in thread “main” java.lang.NullPointerException
at JavaDemo.main(JavaDemo.java:13)
代码之中只是声明了对象,但是并没有为对象进行实例化,所以此时无法调用。而此时程序中出现的NullPointerException(空指向异常)就是没有在堆内存开辟后时所产生的问题,并且只有引用数据类型存在有此问题。
推荐阅读
-
阿里Java学习路线:阶段 1:Java语言基础-Java面向对象编程:第20章:接口的定义与使用:课时91:代理设计模式
-
阿里Java学习路线:阶段 1:Java语言基础-Java面向对象编程:第7章:数组的定义与使用:课时29:数组与方法
-
阿里Java学习路线:阶段 1:Java语言基础-Java面向对象编程:第7章:数组的定义与使用:课时26:数组引用传递分析
-
阿里Java学习路线:阶段 1:Java语言基础-Java面向对象编程:第1章:类与对象:课时5:对象内存分析
-
阿里Java学习路线:阶段 1:Java语言基础-Java面向对象编程:第7章:数组的定义与使用:课时34:对象数组
-
阿里Java学习路线:阶段 1:Java语言基础-Java面向对象编程:第1章:类与对象:课时6:对象引用分析
-
阿里Java学习路线:阶段 1:Java语言基础-Java面向对象编程:第30章:链表的定义与使用:课时139:根据索引取得数据
-
阿里Java学习路线:阶段 1:Java语言基础-Java面向对象编程:第27章:异常的捕获及处理:课时119:异常处理流程
-
阿里Java学习路线:阶段 1:Java语言基础-Java面向对象编程:第23章:包的定义及使用:课时104:生成jar文件
-
阿里Java学习路线:阶段 1:Java语言基础-Java语言高级特性:第22章:反射应用案例:课时101:反射实例化对象