Java 面向对象,对象创建和使用
面向对象描述
优点:耦合度低,扩展力强,更符合人类的思维方式
OOA 面向对象分析; OOD 面向对象设计 ;OOP 面向对象编程
面向对象包括三大特征
封装 、继承、多态
类和对象的概念
什么是类?
类实际上在现实世界当中是不存在的,是一个抽象的概念。
是一个模板。是我们人类大脑进行“思考、总结、抽象”的一个
结果。(主要是因为人类的大脑不一般才有了类的概念。)
类本质上是现实世界当中某些事物具有共同特征,将这些共同
特征提取出来形成的概念就是一个“类”,“类”就是一个模板。
明星是一个类
什么是对象?
对象是实际存在的个体。(真实存在的个体)
宋小宝就是一个对象
在java语言中,要想得到“对象”,必须先定义“类”,“对象”是通过“类”这个模板创造出来的。
类就是一个模板:类中描述的是所有对象的“共同特征信息”对象就是通过类创建出的
这几个术语你需要自己能够阐述出来:
类:不存在的,人类大脑思考总结一个模板(这个模板当中描述了共同特征。)
对象:实际存在的个体。
实例:对象还有另一个名字叫做实例。
实例化:通过类这个模板创建对象的过程,叫做:实例化。
抽象:多个对象具有共同特征,进行思考总结抽取共同特征的过程。
类 --【实例化】--> 对象(实例)
对象 --【抽象】--> 类
类是一个模板,是描述共同特征的一个模板,那么共同特征包括什么呢?
类 = 属性 + 方法
属性来源于:状态
方法来源于:动作
类的定义
1、怎么定义一个类,语法格式是什么?
[修饰符列表] class 类名 {
//类体 = 属性 + 方法
// 属性在代码上以“变量”的形式存在(描述状态)
// 方法描述动作/行为
}
2、为什么属性是“以”变量的形式存在的?
是因为属性对应的是“数据”,数据在程序中只能放到变量中。
对象和引用
画内存图

1 public class User{ 2 // 用户id 3 // 访问id不能这样:User.id (这是错误的,实例变量不能用类名访问。) 4 // id的访问必须先造对象,然后对象有了,才能访问对象的id 5 int id; //成员变量,实例变量(对象变量,一个对象一份。) 6 // 用户名 7 String username; // 成员变量可以不手动赋值,系统赋默认值。 8 // 密码 9 String password; 10 } 11 12 // 第一步:类加载 13 // 第二步:调用UserTest类的main方法(方法调用要压栈。) 14 public class UserTest{ 15 16 // 方法体外声明的变量叫做成员变量。 17 //User u1; //成员变量。(实例变量) 18 19 public static void main(String[] args){ 20 //int i = 100; 21 22 // 方法体当中声明的变量叫做局部变量 23 User u1 = new User(); 24 // 实例变量怎么访问(属性怎么访问)? 25 // 语法是:“引用.属性名” 26 System.out.println(u1.id); //0 27 System.out.println(u1.username); //null 28 System.out.println(u1.password); //null 29 30 u1.id = 11111; 31 u1.username = "zhangsan"; 32 u1.password = "123"; 33 34 System.out.println(u1.id); 35 System.out.println(u1.username); 36 System.out.println(u1.password); 37 38 User u2 = new User(); 39 u2.id = 22222; 40 u2.username = "lisi"; 41 u2.password = "456"; 42 43 System.out.println(u2.id); 44 System.out.println(u2.username); 45 System.out.println(u2.password); 46 } 47 }
第二个

1 // 住址类 2 public class Address{ 3 4 // 一个家庭住址有3个属性。 5 6 // 城市 7 String city; // 实例变量 8 9 // 街道 10 String street; 11 12 // 邮编 13 String zipcode; 14 } 15 16 public class User{ 17 18 // 类=属性+方法 19 // 以下3个都是属性,都是实例变量。(对象变量。) 20 21 // 用户id 22 // int是一种基本数据类型 23 int id; // 实例变量 24 25 // 用户名 26 // String是一种引用数据类型 27 String username; // 实例变量 28 29 // 家庭住址 30 // Address是一种引用数据类型 31 // addr是成员变量并且还是一个实例变量 32 // addr是否是一个引用呢?是。addr是一个引用。 33 Address addr; 34 } 35 36 /* 37 到目前为止,如果什么也没听懂,怎么写代码? 38 记住一个知识点就行,可以后期慢慢学习画图。 39 记住一句话:里面有什么就能“点”什么。 40 41 所有的实例变量(属性)都是通过“引用.”来访问的。 42 43 引用和对象怎么区分? 44 “引用”是啥?是存储对象内存地址的一个变量。 45 “对象”是啥?堆里new出来的。 46 47 通俗一点: 48 只要这个变量中保存的是一个对象的内存地址,那么这个变量就叫做“引用”。 49 50 思考: 51 引用一定是局部变量吗? 52 不一定。 53 */ 54 public class Test{ 55 public static void main(String[] args){ 56 57 //报错了。id是实例变量,必须先创建对象,通过“引用.”的方式访问。 58 /* 59 User u = new User(); 60 u是引用。 61 */ 62 //System.out.println(User.id); 63 64 65 66 /* 67 int i = 100; 68 int j = i; // 原理:会将i中保存的100复制一份,传给j变量。 69 */ 70 71 // 家庭住址对象 72 Address a = new Address(); 73 a.city = "北京"; 74 a.street = "大兴区"; 75 a.zipcode = "121221"; 76 77 // 用户对象 78 User u = new User(); 79 System.out.println(u.id); // 0 80 System.out.println(u.username); // null 81 System.out.println(u.addr); // null 82 83 u.id = 11111; 84 u.username = "zhangsan"; 85 u.addr = a; 86 87 // 思考一个问题: 88 // 我想直到zhangsan他是哪个城市的,代码应该怎么写? 89 System.out.println(u.username + "是"+u.addr.city+"城市的!"); 90 91 // u.addr.city 这行代码可否拆分呢?u.addr.city 节省变量。 92 // 拆分成以下代码和以上效果完全相同,原理完全相同,不同的是以下代码多了两个变量。 93 Address ad = u.addr; 94 String zhuZhi = ad.city; 95 96 System.out.println(zhuZhi); 97 98 //-----------------------是否理解以下代码--------------------------- 99 int x = 100; 100 // = 代表赋值运算,“赋值”中有一个“值” 101 // x变量中的值是100. 将100复制一份给y 102 // 表示:将x变量中保存的值100复制一份给y 103 int y = x; 104 105 //-----------------------是否理解以下代码--------------------------- 106 Address k = new Address(); // Address k = 0x1111; 107 Address m = k; // 这里表示将k变量中保存的0x1111复制了一份传给了m变量。 108 109 } 110 }
需要注意:
// int x = 100 ; -- 在栈里直接保存 100
// = 代表赋值运算,“赋值” 中有个值;
// X 变量中的值是100,将100 复制一份到 y
// int y= x;
//-----------------------
Address k = new Address(); // Address k = 0x1111; -- 这个是 堆中的对象的地址
Address m = k; // 这里表示将k变量中保存的0x1111复制了一份传给了m变量。
空指针异常(NullPointerException)
1 /* 2 空指针异常。(NullPointerException) 3 4 关于垃圾回收器:GC 5 在java语言中,垃圾回收器主要针对的是堆内存。 6 当一个java对象没有任何引用指向该对象的时候, 7 GC会考虑将该垃圾数据释放回收掉。 8 9 出现空指针异常的前提条件是? 10 "空引用"访问实例【对象相关】相关的数据时,都会出现空指针异常。 11 */ 12 public class NullPointerTest{ 13 public static void main(String[] args){ 14 // 创建客户对象 15 Customer c = new Customer(); 16 // 访问这个客户的id 17 System.out.println(c.id); // 0 18 19 // 重新给id赋值 20 c.id = 9521; // 终身代号 21 System.out.println("客户的id是=" + c.id); 22 23 c = null; 24 // NullPointerException 25 // 编译器没问题,因为编译器只检查语法,编译器发现c是Customer类型, 26 // Customer类型中有id属性,所以可以:c.id。语法过了。 27 // 但是运行的时候需要对象的存在,但是对象没了,尴尬了,就只能出现一个异常。 28 System.out.println(c.id); 29 } 30 } 31 32 class Customer{ 33 // 客户id 34 int id; // 成员变量中的实例变量,应该先创建对象,然后通过“引用.”的方式访问。 35 }
方法调用参数传递
java中规定:参数传递的时候,和类型无关,不管是基本数据类型还是引用数据类型
统一都是将盒子中保存的那个“值”复制一份,传递下去。
java中只有一个规定:参数传递的时候,一定是将“盒子”中的东西复制一份传递过去。
内存地址也是值,也是盒子中保存的一个东西。


ps Java中没有指针,通过引用访问堆内存的数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?