当前位置: 首页 > news >正文

JavaSE面向对象(上)

面向过程 vs 面向对象

对比维度面向过程(POP)面向对象(OOP)
编程思维按步骤执行程序逻辑把问题抽象成“对象”,通过对象之间交互解决问题
示例自己动手做小碗汤(一步步流程)去饭店点小碗汤(调用对象的功能)
优缺点简单直接,但难维护、复用性低模块化、可复用、可扩展,更贴近现实世界

OOP(Object Oriented Programming)在底层仍是面向过程,只是做了封装与抽象,让代码更易用、更结构化。

类(Class)

类是对象的模板,描述对象的属性(字段)与行为(方法)

组成部分

  1. 字段(Field):描述对象的状态,如 nameagesex
  2. 方法(Method):描述对象的行为,如 eat()sleep()
  3. 构造方法(Constructor):用于创建对象时初始化数据

示例代码:

public class Person {private String name;private int age;private int sex;private void eat() {}private void sleep() {}private void dadoudou() {}
}

Java 默认会自动生成一个无参构造方法public Person() {},即使代码里没写。

创建对象(new 关键字)

Person person = new Person();
  • 使用 new 时,会在堆内存中为对象分配空间。

  • 程序必须通过 main() 方法启动,可以放在当前类或另一个类中。

  • 实际开发中通常使用独立的测试类,例如:

    public class PersonTest {public static void main(String[] args) {Person person = new Person();}
    }
    

对象初始化的3种方式

方式示例特点
1. 直接赋值person.name = "一成";简单但破坏封装性
2. 方法初始化person.initialize("一成", 21, 1);方法传参赋值,更灵活
3. 构造方法初始化new Person("一成", 21, 1);最常见方式,简洁高效

面向过程注重“怎么做”;
面向对象注重“谁来做”。
类是模板,对象是实例;
创建对象用 new
初始化对象最优方式是——构造方法传参

Object类

对象比较

1️⃣ hashCode()

  • 作用:返回对象的哈希码(hash code),用于散列结构(如 HashMapHashSet

  • 默认实现:基于对象内存地址计算

    如果两个对象通过 equals() 比较相等,则它们的 hashCode() 必须相等;反过来不一定成立。

  • 自定义实现(推荐使用 Objects.hash()):

2️⃣ equals(Object obj)

  • 默认实现:比较两个对象的内存地址是否相同

  • 自定义比较(按值比较也就是重写之后的比较方法):

    public boolean equals(Object obj) {if (this == obj) return true;if (obj instanceof Person1) {Person1 p = (Person1) obj;return this.name.equals(p.getName()) && this.age == p.getAge();}return false;
    }
    
  • 注意:重写 equals() 时,必须同时重写 hashCode(),否则相等的对象进了不同的桶。

方法作用与集合的关系
equals()比较内容是否相同判断桶内元素是否重复
hashCode()决定对象放在哪个桶里决定存储位置

对象拷贝

3️⃣ clone()

返回对象的一个副本(浅拷贝),类必须实现 Cloneable 接口,否则会抛出 CloneNotSupportedException

  • 默认只做浅拷贝(引用对象不复制)。
  • 可通过重写实现深拷贝

对象转字符串

4️⃣ toString()

  • 默认实现:返回 "类名@哈希码的十六进制"

    public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    
  • 自定义实现

    public String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';
    }
    
  • IDE可自动生成。
  • 使用 Lombok 的 @Data 注解可自动生成 toString()

打印数组时看到如 [I@1b6d3586,代表数组对象的类型和哈希码。

多线程调度(等待/通知机制)

每个对象都可以作为线程同步锁(监视器),并可使用以下方法协调线程通信。

5️⃣ 核心方法

方法作用
wait()当前线程进入等待状态,直到被 notify()notifyAll() 唤醒
notify()唤醒一个正在等待该对象锁的线程
notifyAll()唤醒所有等待该对象锁的线程
wait(long timeout)等待指定时间(毫秒),超时自动唤醒
wait(long timeout, int nanos)精确等待到毫秒 + 纳秒级别

示例代码(wait/notify 机制)

public class WaitNotifyDemo {public static void main(String[] args) {Object lock = new Object();new Thread(() -> {synchronized (lock) {System.out.println("线程1:我要等待");try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程1:我被唤醒了");}}).start();new Thread(() -> {synchronized (lock) {System.out.println("线程2:我要唤醒");lock.notify();System.out.println("线程2:我已经唤醒了");}}).start();}
}

执行过程:

  1. 线程1 进入等待(wait())。
  2. 线程2 调用 notify() 唤醒线程1。
  3. 线程1 重新获得锁后继续执行。

小结

功能方法说明
对象比较equals() / hashCode()比较对象内容与生成哈希值
对象复制clone()实现对象副本(浅拷贝)
对象描述toString()输出对象信息
线程通信wait() / notify() / notifyAll()控制线程同步与调度
http://www.dtcms.com/a/470626.html

相关文章:

  • 光的礼赞:探索自然界中的神奇之光
  • 一个企业网站的建设流程微信小程序商城收费吗
  • C++核心语法精要指南
  • 网站中弹出广告怎么做的腾讯官方网站做书签
  • 国外优秀的设计网站公司要做seo
  • 丰台体育馆网站建设WordPress批量修改文章
  • 计算机操作系统:进程同步
  • 怎么制作网站封面建设网站的视频
  • 为什么做网站要有自己的服务器做网站自己租服务器还是网络公司
  • DeepSeek vs ChatGPT 技术架构、成本与场景全解析
  • java开发三层架构下的分层解耦
  • 缔客网络上海响应式网站建设如何建平台网站
  • 学习Java第三十七天——黑马点评61~68
  • 网站 运营 外包 每个月多少钱h5制作易企秀
  • 基础算法:滑动窗口
  • 数据比例与尺度:如何避免让图“放大”差异
  • 《动手学深度学习v2》学习笔记 | 3.4-3.7 softmax 回归
  • Python驱动的无人机多光谱-点云融合技术在生态三维建模与碳储量、生物量、LULC估算中的全流程实战
  • 哪些网站收录排名好wordpress 获取title
  • 大语言模型核心技术解析:从 Transformer 架构到下词预测的完整工作原理与编码器、解码器及注意力机制的运作流程
  • 企业网站模板建站怎么用上海平台公司
  • Android Maven私服搭建(Windows)
  • Webpack 模块联邦(Module Federation)
  • 河南锦源建设有限公司网站重庆建站网站建设平台
  • JZ39 数组中出现次数超过一半的数字
  • 网站开发智能化方向门户网站建设原则
  • 【React】动态SVG连接线实现:图片与按钮的可视化映射​
  • 专门做油站数据的网站游戏网页版入口
  • 【碎片化学习】SpringBoot数据库驱动介绍配置方法和代码
  • 设计模式篇之 适配器模式 Adapter