Java 面向对象基础初步

面向对象的核心概念概览

面向对象的核心目标是 把数据和操作封装在一起(对象),并通过抽象、继承与多态组织程序。简而言之,我们总是没法回避程序设计的四个话题:

  • 封装(Encapsulation):隐藏内部状态,仅通过方法暴露行为。
  • 继承(Inheritance):子类复用父类代码并扩展行为。
  • 多态(Polymorphism):通过父类型引用调用子类实现,实现运行时多种行为。
  • 抽象(Abstraction):只暴露必要接口,忽略实现细节。

类与对象:声明、字段、方法、构造器

最基本的类

public class Person {// 字段(成员变量)private String name;private int age;// 构造器public Person(String name, int age) {this.name = name;this.age = age;}// 方法(行为)public String getName() { return name; }public int getAge() { return age; }public void setAge(int age) {if (age < 0) throw new IllegalArgumentException("age must be >= 0");this.age = age;}public void sayHello() {System.out.println("Hi, I'm " + name + ", " + age + " years old.");}
}

创建对象(实例化)

Person p = new Person("Alice", 30);
p.sayHello(); // Hi, I'm Alice, 30 years old.

字段类型

  • 实例字段(每个对象一份)
  • 类字段(static,类共享一份)
  • 局部变量(方法内部)

​ 上述讨论内容,我们基本上就确定了一个类。

封装与访问控制

封装的实践主要靠访问修饰符与方法(getter/setter)来实现。

访问修饰符

  • private:仅类内可见(最严格)
  • (package-private)(默认): 同包可见
  • protected:同包或子类可见
  • public:全局可见

最佳实践:默认 private,只对外暴露必要的 public/protected API。保留最小可见性以降低耦合与错误使用风险。

不可变对象

不可变类(immutable)能降低并发复杂度和调试难度。常见做法:

  • 所有字段 private final
  • 不提供 setter
  • 若包含可变对象,返回防御性拷贝或不可变视图

示例不可变类:

public final class Point {private final int x;private final int y;public Point(int x, int y) { this.x = x; this.y = y; }public int getX() { return x; }public int getY() { return y; }
}

继承与 extends

继承让子类获得父类(超类)的字段和方法。Java 支持单继承(一个类只能有一个直接父类),但允许实现多个接口。

public class Employee extends Person {private String id;public Employee(String name, int age, String id) {super(name, age); // 调用父类构造器this.id = id;}public String getId() { return id; }
}

方法重写(Override)

@Override 注解明确你在重写:

@Override
public void sayHello() {System.out.println("Employee " + getName() + " (id=" + id + ")");
}

super 关键字

  • super(...) 调用父类构造器(必须放在构造器首行)
  • super.method() 调用父类方法实现

小心滥用继承

继承表示“is-a”关系(例如 Employee is-a Person)。如果只是为了代码复用而继承往往是错误的,优先考虑组合(has-a)。


多态与动态绑定

多态允许你用父类型引用指向子类型对象,并在运行时调用子类实现。

Person p = new Employee("Bob", 28, "E001");
p.sayHello(); // 调用 Employee 中的覆盖版本(动态绑定)

关键点:

  • 决定调用哪个方法的,是运行时对象的实际类型,而不是引用类型(动态绑定)。
  • 编译时只能访问引用类型可见的方法/字段;不能访问子类特有的方法除非进行类型转换(cast)。

类型转换示例:

if (p instanceof Employee) {Employee e = (Employee) p;System.out.println(e.getId());
}

抽象类与接口

抽象类 (abstract)
  • 可以包含抽象方法(没有实现)和具体方法(有实现)。
  • 适合需要共享实现与状态的场景。
public abstract class Animal {public abstract void sound();public void breathe() { System.out.println("breathing..."); }
}
接口 (interface)
  • 定义行为契约。Java 8+ 接口可以包含 default 方法与 static 方法,Java 9+ 有私有方法。
  • 接口更倾向于描述能力(capability),支持多重实现(多态性更强)。
public interface Flyable {void fly();default void land() { System.out.println("landing"); }
}
何时用抽象类 vs 接口
  • 需要字段或构造器时用抽象类。
  • 希望多个不相关类实现同一行为时用接口。
  • 优先接口(更灵活),必要时用抽象类提供共享实现。

组合(Composition)与委托(Delegation)

组合优先于继承(composition over inheritance)。将功能拆成小组件并组合能降低耦合。

public class Engine { void start() { System.out.println("engine on"); } }public class Car {private final Engine engine;public Car(Engine engine) { this.engine = engine; }public void start() { engine.start(); } // 委托给 Engine
}

组合的优点:

  • 更灵活(运行时替换组件)
  • 避免子类层次膨胀
  • 更易单元测试(mock 组件)

static, final, 常量与工具类

static

  • 静态字段/方法属于类,不属于实例。
  • 常用于工具方法(Math)、单例模式中的单例引用或缓存。
public class Utils {public static int max(int a, int b) { return a > b ? a : b; }
}

final

  • 修饰变量:值不可变(对于引用类型,引用不可变但对象可变)。
  • 修饰方法:禁止子类重写。
  • 修饰类:禁止继承(如 String)。

equals, hashCode, toString 的正确实现

规范摘要
  • equals 应满足自反、对称、传递、一致性和对 null 返回 false
  • 若重写 equals,必须同时重写 hashCode(相等对象必须有相同的 hashCode)。
  • toString 用于调试输出,应简洁明了。
使用示例:IDE / Objects 帮助生成
public class Point {private final int x, y;public Point(int x, int y) { this.x = x; this.y = y; }@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Point)) return false;Point p = (Point) o;return x == p.x && y == p.y;}@Overridepublic int hashCode() {return 31 * x + y; // 简单组合}@Overridepublic String toString() {return "Point(" + x + "," + y + ")";}
}
常见错误
  • equals 中用 getClass() 校验时会阻止子类与父类比较(这可能是期望行为,也可能不是)。使用 instanceof 更通用,但需注意 LSP(里氏替换)。
  • 把可变字段用于 hashCode:若对象作为 HashSet key,修改这些字段会破坏 HashMap 的语义。

对象创建、初始化顺序与垃圾回收简介

创建与初始化顺序(类/实例)
  • 类加载时静态字段和静态初始化块按出现顺序执行。
  • 每次创建实例时:父类构造器先被调用,字段初始化与实例初始化块然后按顺序执行,最后子类构造器体执行。

示例顺序(伪):

  1. 父类静态初始化(类第一次加载)
  2. 子类静态初始化
  3. 创建实例:父类实例字段初始化 -> 父类构造器 -> 子类实例字段初始化 -> 子类构造器
垃圾回收(GC)

Java 使用自动垃圾回收(JVM 实现多样)。要点:

  • 不要依赖 finalizer (finalize() 已被废弃,不推荐使用)。
  • 优先控制对象生命周期、减少临时分配以降低 GC 压力。
  • 使用内存分析工具(VisualVM、jmap、jstat、YourKit)诊断内存泄漏/对象分配热点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96091.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96091.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/96091.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

反向代理技术

一、核心比喻&#xff1a;公司的总机前台 想象一下一家大公司&#xff1a; 客户&#xff1a;想联系公司里的某位员工&#xff08;比如技术部的张三&#xff09;。公司的总机号码&#xff08;唯一公开的号码&#xff09;&#xff1a;比如 400-123-4567。前台&#xff1a;接听总机…

数据整理器(Data Collators)(90)

数据整理器(Data Collators) 数据整理器(Data Collators) 导致问题的“罪魁祸首”,往往是长度不一的序列。 指令格式 关键术语说明 数据整理器(Data Collators) 数据整理器负责将多个数据样本拼接成一个迷你批次(mini-batch)。它通常处于“隐形”状态——每次使用PyT…

PySpark EDA 完整案例介绍,附代码(三)

本篇文章Why Most Data Scientists Are Wrong About PySpark EDA — And How to Do It Right适合希望高效处理大数据的从业者。文章的亮点在于强调了使用PySpark进行探索性数据分析&#xff08;EDA&#xff09;的重要性&#xff0c;避免了将Spark数据框转换为Pandas的低效做法。…

leetcode18(无重复字符的最长子串)

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。示例 1:输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。思路&#xff1a;对于长度为0的数组单独处理其他数组最小的可能…

计算机毕设 java 高校家教平台 基于 SSM 框架的高校家教服务平台 Java+MySQL 的家教预约与课程管理系统

计算机毕设java高校家教平台75snd9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联xi 可分享在高校家教需求增长的背景下&#xff0c;传统家教对接依赖线下中介、信息分散&#xff0c;存在沟通成本高、课…

【自记】Python 的 SQLAlchemy 完整实践教程

目录 SQLAlchemy 介绍环境准备与安装数据库连接数据模型定义基本数据操作复杂查询操作高级特性实战项目示例性能优化与最佳实践常见问题与解决方案 1. SQLAlchemy 介绍 1.1 什么是SQLAlchemy SQLAlchemy 是一个用于 Python 的 SQL 工具和对象关系映射&#xff08;ORM&#x…

springboot rabbitmq 延时队列消息确认收货订单已完成

供应商后台-点击发货-默认3天自动收货确认&#xff0c;更新订单状态已完成。1 pom.xml 引入依赖&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>2 …

Linux内核TCP输出引擎:深入解析数据传输的核心机制

引言 传输控制协议(TCP)作为互联网最重要的基础协议之一,其实现质量直接关系到网络性能和应用体验。在Linux内核中,TCP协议的输出引擎是实现可靠数据传输的核心组件,负责将应用层数据高效、可靠地传输到网络对端。本文将深入分析Linux内核中TCP输出引擎的关键机制和实现原…

数据仓库详解

数据仓库详解第一节 数据仓库构建方法论和实践一、数据仓库与数据库的区别二、数据仓库对于企业的价值三、数据仓库的模型构建1、数据仓库构建需要考虑的问题2、什么是数仓的数据模型3、如何构建数仓的数据模型&#xff08;1&#xff09;概念模型设计&#xff08;2&#xff09;…

单身杯1(web)

web签到<?php# -*- coding: utf-8 -*- # Author: h1xa # Date: 2022-03-19 12:10:55 # Last Modified by: h1xa # Last Modified time: 2022-03-19 13:27:18 # email: h1xactfer.com # link: https://ctfer.comerror_reporting(0); highlight_file(__FILE__);$file $_…

RNN/LSTM/GRU/Transformer

RNN的局限1&#xff1a;长期依赖&#xff08;Long-TermDependencies&#xff09;问题但是同样会有一些更加复杂的场景。比如我们试着去预测“I grew up in France...I speak fluent French”最后的词“French”。当前的信息建议下一个词可能是一种语言的名字&#xff0c;但是如…

浏览器开发CEFSharp+X86 (十六)网页读取电子秤数据——仙盟创梦IDE

一、东方仙盟智能浏览器&#xff1a;跨平台&#xff0c;畅连百种硬件&#xff0c;速启现场编译东方仙盟 VOS 智能浏览器在网页调用硬件 SDK 领域堪称卓越典范。它全面兼容多平台&#xff0c;无论是电脑、手机还是各类移动终端&#xff0c;都能完美适配&#xff0c;无缝对接。令…

腾讯云EdgeOne免费套餐:零成本开启网站加速与安全防护

腾讯云EdgeOne免费套餐&#xff1a;零成本开启网站加速与安全防护 ​一键解锁全球3200节点&#xff0c;让网站速度提升53%&#xff0c;同时获得企业级安全防护作为一名站长或个人开发者&#xff0c;你是否曾为网站加载速度缓慢而苦恼&#xff1f;是否担心网站遭遇DDoS攻击或恶意…

服务器数据恢复—Raid6阵列崩溃导致上层分区无法访问的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台infortrend某型号存储&#xff0c;存储设备上有12块硬盘&#xff0c;组建一组raid6磁盘阵列。阵列上层有一个lun&#xff0c;映射到WINDOWS系统上使用。WINDOWS系统划分了一个GUID Partition Table分区。服务器存储故障&#xff1a; 存…

【生产故事会】Kafka 生产环境参数优化实战案例

Kafka 3.9.1 生产环境参数优化实战案例(8核32G HDD场景) 一、背景与硬件/业务配置 某企业级全链路日志采集平台需构建高稳定Kafka集群,承担核心业务日志流转(涵盖用户行为、系统监控、交易链路日志),单集群3节点部署,硬件与业务特征如下: 维度 具体配置 硬件配置 C…

推荐 Eclipse Temurin 的 OpenJDK

推荐 Eclipse Temurin 的 OpenJDK 发行版 https://adoptium.net/zh-CN/temurin/releases&#xff0c;是基于其在技术可靠性、生态中立性、许可友好性和社区支持等多个维度的综合优势。 以下是详细的原因&#xff0c;解释了为什么 Eclipse Temurin 通常是基于 OpenJDK 构建的 J…

分布式3PC理论

目录 为什么需要 3PC&#xff1f; 核心结论 3PC的优缺点 3PC与 Paxos / Raft 对比 本篇文章内容的前置知识为 分布式2PC理论&#xff0c;如果不了解&#xff0c;可点击链接学习 分布式2PC理论-CSDN博客 为什么需要 3PC&#xff1f; 1) 2PC 的根本问题&#xff1a;阻塞 不…

Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析

在前端开发领域&#xff0c;“可视化”已经成为提升效率和降低门槛的重要方向。从 低代码平台 到 前端可视化编辑器&#xff0c;再到 在线可视化开发环境&#xff0c;这些工具都在改变前端的开发方式。 本文将结合真实项目&#xff0c;分析常见的 Web 前端可视化开发工具&#…

单例模式(C++)(错误日志实现)

单例模式一、核心原理二、常见的单例模式实现方式1. 懒汉式&#xff08;Lazy Initialization&#xff09;2. 饿汉式&#xff08;Eager Initialization&#xff09;三、关键实现细节解析四、单例模式的适用场景与特点使用场景日志工具&#xff08;确保日志写入的唯一性&#xff…

stm32 链接脚本没有 .gcc_except_table 段也能支持 C++ 异常

stm32 使用 cubemx 生成的 gnu ld 链接脚本没有 .gcc_except_table 段。如下所示 /* ****************************************************************************** ** ** file : LinkerScript.ld ** ** author : Auto-generated by STM32CubeIDE ** ** Abst…