Java自定义类创建对象数组并赋值
一、起因
采用下面的代码为对象数组里面的每个元素的字段赋值时报错。
public class StudentArray {public static void main(String[] args){Student[] stuArr = new Student[5]; //创建对象数组,stuArr存储地址for(int i = 0; i < stuArr.length; ++i){System.out.println(stuArr[i]); //nullstuArr[i].number = i + 1; //报错stuArr[i].state = (int)Math.round(Math.random() * 3);stuArr[i].score = (int)Math.round(Math.random() * 100);System.out.println(stuArr[i]);}}
}class Student{int number;int state;int score;@Overridepublic String toString() {return "Student{" +"number=" + number +", state=" + state +", score=" + score +'}';}
}
错误信息如下:自定义对象数组的元素的值为null,报空指针异常。
null
Exception in thread "main" java.lang.NullPointerException: Cannot assign field "number" because "stuArr[i]" is nullat com.zhangqu.java.method.StudentArray.main(StudentArray.java:19)
原因分析:因为Student[] stuArr = new Student[5];
创建对象数组时,返回系统为该对象数组在堆区分配的空间的地址,并将地址值存储到引用变量stuArr
,stuArr
的数据类型为类数组Student[]
,是引用类型;而该数组的每一个元素都是类Student
的对象(本质是引用,存储null或地址值),数组的每一个元素的数据类型为类Student
,也是引用类型,由于没有继续使用new
为这些引用类型的Student
类对象分配空间,所有数组的元素默认被初始化为null
。
不较真的情况下,可以把Student[] stuArr = new Student[5];
看做如下形式:
Student stu1 = null;
Student stu2 = null;
......
Student stu5 = null;
Student[] stuArr = {stu1, stu2, ..., stu5}
二、正确代码
public class StudentArray {public static void main(String[] args){Student[] stuArr = new Student[5]; //创建对象数组,stuArr存储地址, 初始化变量stuArrint num = 0;for (Student stu : stuArr) {System.out.println(stu); //nullstu = new Student(); //用new分配空间,显式的为数组的每一个元素赋值,stu存储地址System.out.println(stu);System.out.println(stu.getClass().toString()); //获取数据类型stu.number = ++num;stu.state = (int)Math.round(Math.random() * 3);stu.score = (int)Math.round(Math.random() * 100);System.out.println(stu);}}
}class Student{int number;int state;int score;@Overridepublic String toString() {return "Student{" +"number=" + number +", state=" + state +", score=" + score +'}';}
}
运行结果:
null
Student{number=0, state=0, score=0}
class com.zhangqu.java.method.Student
Student{number=1, state=1, score=10}
null
Student{number=0, state=0, score=0}
class com.zhangqu.java.method.Student
Student{number=2, state=0, score=42}
......
内存分析概要图如下:
由于是自定义的类,所以创建对象数组时,第一步是用new
为数组对象本身分配空间(初始化),第二步是用new
为数组对象的元素分配空间(赋值)。
public class StudentArray {public static void main(String[] args){}@Testvoid testObjArr(){StuObjArr[] stuObjArrs = new StuObjArr[2]; //第一步,为对象数组分配空间,初始化stuObjArrsfor(int i = 0; i < stuObjArrs.length; i++){stuObjArrs[i] = new StuObjArr(); //第二步,为数组元素分配空间,为stuObjArrs[i]赋值System.out.println(stuObjArrs[i]); //打印数组元素在堆区的地址}}
}class StuObjArr{int id;String name;
}
运行结果:
com.zhangqu.java.method.StuObjArr@2a70a3d8
com.zhangqu.java.method.StuObjArr@289d1c02
最后附上一张数据类型图,基础真的很重要。
引用类型的变量,只能存储两类值,null
或地址值(含变量的数据类型)
Java自定义类创建对象数组并赋值相关推荐
- java自定义类创建数组_java 创建自定义数组
1.java创建自定义类数组方法: student []stu = new student[3]; for(int i = 0; i < 3; i ++) { stu[i] = new stud ...
- 理解Java自定义类作为数据类型——引用数据类型
目录 说在前面的话 复现问题 引用数据类型的理解 总结 说在前面的话 前言:Java的数据类型按照类型可分为基本数据类型(byte.short.int.long.double.float.char.b ...
- Java 自定义类数组的初始化
1 简介 若初始化不到位,常遇到"空指针异常"(java.lang.NullPointerException)的问题. 此类解决方案是:在声明自定义类数组后,必须再对每一个数组元素 ...
- Java自定义类数组的创建和使用
目录 一.数组核心概念 1.数组是什么? 2.数组优点 3.数组缺点 4.数组用处 二.封装一个自定义数组类MyList 1.数组属性定义 2.数组初始化方法 3.数组扩容方法 4.增加元素方法 5. ...
- java自定义类序列化_【java】面试官问我,如何实现一个自定义序列化
通常离开内存的东西,如果需要存储或传输是需要序列化的,在java中要序列化是要实现Serializable的(或其子类),那不实现Serializable,如何实现一个自定义的序列化呢,我首先想到的是 ...
- java自定义类怎么比大小_实战:Java 扑克牌比较游戏
一.目的 通过实现一个简单的扑克牌比大小的游戏,体会面向对象编程的思想. 二.技术 1.常量类 2.类的创建,封装 3.单例模式 4.自定义异常类 三.如何使用 1.常量类 对于程序运行过程中,一直不 ...
- Java——Arrays类操作数组的工具类
JDK中提供了一个专门用于操作数组的工具类,即 Arrays 类,位于 Java.util 包中.该类提供了一系列方法来操作数组,如排序.复制.比较.填充等,用户直接调用这些方法即可,不需要自己编码实 ...
- 实现JNI的另一种方法:使用RegisterNatives方法传递和使用Java自定义类 (转)
原帖地址:http://blog.csdn.net/qiuxiaolong007/article/details/7860610 除了使用传统方法实现JNI外,也可以使用RegisterNatives ...
- 自学C++之自定义数据类型与自定义类之数组使用4例
2014年05月26日→星座:双子座 二〇一四年四月廿八 甲午[马],己巳月,丁酉日,戊申时 今属:火:五行:木火土金:缺:水. 纳音五行:沙中金. 药王菩萨圣诞纪念日 都是百度知道的答复. 之 ...
- java实现报表_修改带 JAVA 自定义类的报表还要重启应用,咋解决?
这是 JAVA 编译型语言特性决定的,修改 JAVA 程序重启应用也正常.只不过改报表就要重启整个应用就有点夸张了,报表变动比较频繁,每次都重启应用会影响业务的. 这个问题的根本原因是耦合性问题,报表 ...
最新文章
- 《中国式方案秘籍(上部)》
- 华为推CPU Turbo,荣耀Note10突破3000档
- acwing1086||HDU4507数位dp[恨7不成妻]
- 《自然》发布最新科研指数:中美差距缩小,中科院居全球机构首位
- “另一个程序正在使用此文件,进程无法访问”的解决方法
- iOS ffmpeg 之编译ffmpeg
- 企业实战(Jenkins+GitLab+SonarQube)_12_Jenkins+soanr服务器搭建和代码检查
- 面试题:InnoDB 中一棵 B+ 树能存多少行数据?【面试不翻车,翻车就跑路】
- java Web程序使用wro4j合并、压缩js、css等静态资源
- 【大数据部落】基于ARIMA、SVM、随机森林销售的时间序列预测
- linux编辑复制多行命令,linux下文本编辑器vim的使用,复制-粘贴-替换-行号-撤销-多文件操作...
- 《Smynes游戏模拟器官方版》
- 百度EasyDL图像分类的使用
- Region Proposal Network
- 新型冠状病毒数据可视化分析
- python链家二手房_python采集链家二手房信息
- Android系统开发
- EDK II工程文档官方网址
- 目标规划之问题数学化(建模)
- 晶振电路的PCB设计