你能接受 String
吗?
如果能,以下内容可进行类比
User
类public class User{ // 用户编号 // int 是一种基础数据类型 // id 是一个实例变量 int id; // 用户名 // String 是一种引用数据类型 // name 是一个实例变量 // name 是一个引用 String name; // 家庭住址 // Address 是一种引用数据类型 // addr 是一种实例变量 // addr 是一个实例变量 Address addr; }
Address
类public class Address{ // 以下也都是是实例变量 // 城市 String city; // 街道 String street; // 邮编 String zipcode; }
public class OOTest02{ public static void main(String[] args){ // 创建一个User对象,或者说是User的实例 // 数据类型 变量名 = new 类(); // u 是一个局部变量 // u 保存的内存地址指向堆内存的User对象,或者说是User的实例 User u = new User(); // 输出User对象中的实例变量的值 System.out.println(u.id); // 0 System.out.println(u.name); // null System.out.println(u.addr); // null // 修改User对象内部实例变量的值 u.no = 110; // "jack" 是一个Java对象,u.name 保存的内存地址指向堆内存的String对象 u.name = "jack"; //u.addr 保存的内存地址指向堆内存的Address对象 u.addr = new Address(); // 目前在main方法当中只能看到一个引用 "u" // 一切都是只能通过u进行访问 System.out.println(u.name + "居住在哪个城市:" + u.addr.city); System.out.println(u.name + "居住在哪个街道:" + u.addr.street); System.out.println(u.name + "的邮编:" + u.addr.zipcode); // 修改类似上面 u.addr.city = "成都"; u.addr.street = "XXX"; } }
另一个测试类
强调:引用时,变量中保存的只是【实例/对象】的内存地址
public class OOtest03{ // u 是引用 // u 是局部变量 User u = new User(); // 在 OOTest 中编写的是 // u.addr = new Address() // a 是引用 // a 是局部变量 Address a = new Address(); // a 保存的内存地址指向堆内存的Address对象 u.addr = a; // 将 a 中保存的 内存地址 赋值给 u.addr // 注意:下面两个 System.out.println(u.addr.city); System.out.println(u.addr.city); // null a.city = "成都"; System.out.println(u.addr.city); }
注意:实例变量不能直接通过类名访问,需要通过实例或者说对象进行访问
// 丈夫类 public class Husband{ // 名字 String name; // 丈夫对象当中含有妻子引用 Wife w; }
// 妻子类 public class Wife{ // 名字 String name; // 妻子对象当中含有丈夫引用 Huband h; }
public class OOTest04{ public static void main(String[] args){ // 创建一个丈夫对象 Husband boy = new Husband(); boy.name = "jock"; // 创建一个妻子对象 Wife girl = new Wife(); girl.name = "rose"; // 建立两个对象的关系【关联关系】:A has a B; A中含有B的引用 boy.w = girl; girl.h = boy; //得到 boy 都妻子名称 //区分以下两句 System.out.println(boy.name + "妻子的名称:" + girl.name); // girl.name 是 girl 的名称,不符合题 System.out.println(boy.name + "妻子的名称:" + boy.w.name); // boy.w.name 是 boy 妻子的名称,符合题 // 如果没有建立两个对象的关系上面两句是 不同的 } }
// 工人类 public class Worker{ // 工号 int id; }
测试程序
public class OOTest05{ public static void main(String[] args){ Worker c = new Wocker(); System.out.println(c.id); // 0 没有赋值,所以是默认值 c = null; // 以下程序可以编译通过,因为符合语法 // 运行会出现空指针异常 // 空引用访问 “实例” 相关的数据 一定会出现空指针异常 // java.lang.NullPointerException System.out.println(c.id); } }