学习笔记--区分Java中类与对象

区分Java中类与对象

你能接受 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);
}
}

Java面向对象



posted @   sha0dow  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示