Java 编程旅程(二)
在前一篇博客中,我们介绍了 Java 编程的基础知识和入门步骤。现在,我们将继续深入探讨 Java 的一些高级特性,以帮助你进一步提升编程技能。通过这篇博客,你将学习到更复杂的概念和技术,比如面向对象编程(OOP)的深入应用、异常处理、集合框架以及多线程编程等内容。
1. 面向对象编程进阶
Java 是一种面向对象的编程语言。要真正掌握 Java,理解并灵活运用面向对象的特性至关重要。我们将深入探讨类、对象、继承、多态和封装等关键概念。
1.1 继承与方法重写
继承是 OOP 中的一项重要特性,它允许一个类继承另一个类的属性和方法,从而实现代码重用。在 Java 中,所有类都默认继承自 Object 类。
示例:继承和方法重写
// 父类 Animal
class Animal {public void speak() {System.out.println("Animal speaks");}
}// 子类 Dog 继承自 Animal
class Dog extends Animal {// 重写父类的 speak 方法@Overridepublic void speak() {System.out.println("Dog barks");}
}public class Main {public static void main(String[] args) {Animal animal = new Animal();animal.speak(); // 输出: Animal speaksDog dog = new Dog();dog.speak(); // 输出: Dog barks}
}
解释:
Dog类继承了Animal类,因此它拥有了Animal类的所有属性和方法。speak()方法在Dog类中被重写,实现了多态。
1.2 多态
多态是指不同类的对象对同一消息做出不同响应的能力。Java 中通过方法重写来实现多态。关键点在于:方法重写是运行时多态,即根据对象的实际类型来调用相应的方法。
class Animal {public void speak() {System.out.println("Animal speaks");}
}class Dog extends Animal {@Overridepublic void speak() {System.out.println("Dog barks");}
}class Cat extends Animal {@Overridepublic void speak() {System.out.println("Cat meows");}
}public class Main {public static void main(String[] args) {Animal myAnimal = new Dog();myAnimal.speak(); // 输出: Dog barksmyAnimal = new Cat();myAnimal.speak(); // 输出: Cat meows}
}
解释:
myAnimal变量的类型是Animal,但是它指向的实际对象可以是Dog或Cat。- 通过这种方式,Java 可以根据实际对象的类型来调用正确的方法,体现了多态的特性。
1.3 抽象类和接口
- 抽象类:抽象类是不能实例化的类,它可以包含抽象方法(没有实现的方法)和普通方法。它通常作为其他类的基类。
- 接口:接口是抽象方法的集合,任何实现接口的类必须提供这些方法的具体实现。
示例:抽象类与接口
// 抽象类
abstract class Animal {abstract void sound(); // 抽象方法,必须在子类中实现public void sleep() {System.out.println("Animal is sleeping");}
}// 接口
interface Movable {void move(); // 接口方法,不需要实现
}// Dog 类继承抽象类并实现接口
class Dog extends Animal implements Movable {@Overridevoid sound() {System.out.println("Dog barks");}@Overridepublic void move() {System.out.println("Dog moves");}
}public class Main {public static void main(String[] args) {Dog dog = new Dog();dog.sound(); // 输出: Dog barksdog.sleep(); // 输出: Animal is sleepingdog.move(); // 输出: Dog moves}
}
2. 异常处理与错误处理
异常处理是编写健壮程序的重要部分。Java 提供了强大的异常处理机制,允许你捕获并处理程序运行时出现的错误,避免程序崩溃。
2.1 异常类型
- 检查型异常(Checked Exception):必须显式处理的异常,如
IOException。 - 非检查型异常(Unchecked Exception):运行时可能出现的异常,如
NullPointerException和ArrayIndexOutOfBoundsException。
2.2 捕获和处理异常
示例:使用 try-catch 进行异常处理
public class ExceptionExample {public static void main(String[] args) {try {int result = 10 / 0; // 可能发生除以零的异常} catch (ArithmeticException e) {System.out.println("Error: " + e.getMessage());} finally {System.out.println("This will always run.");}}
}
解释:
try块包含可能抛出异常的代码。catch块捕获特定的异常类型,并进行处理。finally块无论是否发生异常都会执行,用于释放资源等清理工作。
3. Java 集合框架
集合框架提供了多种容器类,用于存储和操作数据。它包括 List、Set、Map 等接口及其常见实现类。
3.1 List 接口及其实现
List 接口允许按顺序存储元素,可以包含重复元素。
示例:使用 ArrayList
import java.util.ArrayList;
import java.util.List;public class ListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");for (String item : list) {System.out.println(item); // 输出列表中的元素}}
}
3.2 Set 接口及其实现
Set 接口不允许重复元素。常用的实现类有 HashSet 和 TreeSet。
示例:使用 HashSet
import java.util.HashSet;
import java.util.Set;public class SetExample {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("Apple");set.add("Banana");set.add("Apple"); // 重复元素将被忽略for (String item : set) {System.out.println(item); // 输出: Apple, Banana}}
}
3.3 Map 接口及其实现
Map 接口用于存储键值对,常见的实现类有 HashMap 和 TreeMap。
示例:使用 HashMap
import java.util.HashMap;
import java.util.Map;public class MapExample {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("Alice", 25);map.put("Bob", 30);for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}}
}
4. 多线程编程
多线程是 Java 的强大特性之一,它允许程序同时执行多个任务。在现代应用程序中,线程广泛应用于并发处理任务。
4.1 创建线程
在 Java 中,线程有两种常见的创建方式:
- 继承
Thread类。 - 实现
Runnable接口。
示例:使用 Thread 类创建线程
class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread is running");}
}public class ThreadExample {public static void main(String[] args) {MyThread thread = new MyThread();thread.start(); // 启动线程}
}
示例:使用 Runnable 接口创建线程
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Runnable is running");}
}public class RunnableExample {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start(); // 启动线程}
}
5. 总结与进一步学习
通过本篇博客,我们深入探讨了 Java 中的一些重要概念和技术,如面向对象编程、异常处理、集合框架和多线程编程等。这些是每个 Java 开发者必须掌握的知识点。
接下来,可以继续探索:
- Java I/O 和文件操作
- Lambda 表达式与函数式编程
- Java 8 新特性(Stream API、Optional 类等)
- 数据库编程(JDBC)
持续实践和学习是提升编程能力的关键。希望你在 Java 编程的道路上越走越远!
相关文章:
Java 编程旅程(二)
在前一篇博客中,我们介绍了 Java 编程的基础知识和入门步骤。现在,我们将继续深入探讨 Java 的一些高级特性,以帮助你进一步提升编程技能。通过这篇博客,你将学习到更复杂的概念和技术,比如面向对象编程(OO…...
一、springcloud 入门——笔记
1. 学习之前要知道的 springcloud 应用的技术 2. springboot 和 springcloud 的版本选型 官网介绍:https://spring.io/projects/spring-cloud/#overview 生成新的Spring Cloud项目 最简单的入门方法是访问start.spring.io,选择您的Spring Boot版本和要使…...
思考:VSCode 的宏观工作原理 快速入门 VSCodium (****)
23个常用的VSCode快捷键(动图演示)> https://www.php.cn/faq/441696.html VSCodium AppImage 版 使用记录 https://blog.csdn.net/ken2232/article/details/143591323 **** 初步比较:VSCode > pk < VSCodium << 在下…...
C++ day8——模版
笔记脑图 作业 template <class T> class mylist{ public:// 这是一个链表的节点struct Link{T val;Link* next; } 增 :insert(T val) 在链表中创建新节点,节点上保存的数据为 val删:remove(T val) 移除链表中数据为 val 的节点改…...
【CSS in Depth 2 精译_080】 13.1:CSS 渐变效果(中)——不同色彩空间的颜色插值算法在 CSS 渐变中的应用
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 13 章 渐变、阴影与混合模式】 ✔️ 13.1 渐变 ✔️ 13.1.1 使用多个颜色节点(上)13.1.2 颜色插值方法(中) ✔️13.1…...
红日靶场1(搭建打靶)
搭建 靶场下载: http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ (13G,需要百度网盘会员) 下载好靶场文件后直接解压 直接用虚拟机打开靶场 更改网络ip 需要模拟内网和外网两个网段, Win7 虚拟机相当于网关服务器,所以需要…...
LivePortrait 部署笔记
LivePortrait 开源地址: https://github.com/KwaiVGI/LivePortrait 模型下载: export HF_ENDPOINThttps://hf-mirror.com huggingface-cli download --resume-download KwaiVGI/LivePortrait --local-dir models--KwaiVGI--LivePortrait...
Greenhills Lib操作-查看Lib信息与将lib中的data段link到指定区域
文章目录 前言Greenhillls中gsize的用法修改ld文件将lib中的data段指定区域示例定义与链接总结 前言 项目开发过程中,遇到客户开发ASW,提供Lib进行集成,但ASW中的标定量没有定义对应的data段,导致无法将标定量指定到特定的内存。…...
【十进制整数转换为其他进制数——短除形式的贪心算法】
之前写过一篇用贪心算法计算十进制转换二进制的方法,详见:用贪心算法计算十进制数转二进制数(整数部分)_短除法求二进制-CSDN博客 经过一段时间的研究,本人又发现两个规律: 1、不仅仅十进制整数转二进制可…...
【JavaEE】网络(2)
一、网络编程套接字 1.1 基础概念 【网络编程】指网络上的主机,通过不同的进程,以编程的方式实现网络通信;当然,我们只要满足进程不同就行,所以即便是同一个主机,只要是不同进程,基于网络来传…...
AI for Science 的完美实践——科研文献的智慧化提取获得“综述性文摘”的软件开发
实践是检验真理的唯一标准!show your codes! 1 综述性文摘的需求 再简单不过了。 甲方(综述性文摘)需求:针对项目特征或描述,从几百篇相关的科研论文(PDF)中智能提取相关内容,包括…...
前端使用xlsx.js实现 Excel 文件的导入与导出功能
前端使用xlsx.js实现 Excel 文件的导入与导出功能 在现代的 Web 开发中,处理文件上传和导出功能已经变得越来越常见,尤其是 Excel 文件的导入与导出。 我们将使用 Vue.js 和 XLSX.js 库来处理 Excel 文件的读取和生成。XLSX.js 是一个强大的 JavaScrip…...
React简单了解
原理简化了解 import React from "react" import { createRoot } form "react-dom/client"const element React.createElement(p,{id: hello},Hello World! )const container document.querySelector(#root) const root createRoot(container) root.r…...
backbone 和Run-Length Encoding (RLE)含义
在深度学习中,特别是在图像分割任务中,backbone(主干网络)是指用于特征提取的预训练神经网络模型。Backbone 的主要作用是从输入图像中提取有用的特征,这些特征随后会被用于更高层次的任务,如分类、检测或分…...
在Centos7上安装MySQL数据库 How to install MySQL on Centos 7
执行以下命令,下载并安装MySQL。 wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm && yum -y install mysql57-community-release-el7-10.noarch.rpm && yum install -y mysql-community-server --nogpgcheck执行以下…...
Linux docker-20.10.9安装
Linux Docker20.10.9安装 解压文件 tar -xvf docker-20.10.9.tgz 给docker执行文件赋予可执行权限 chmod 755 -R docker/复制docker到/usr/bin/目录下,使docker命令可以执行 cp docker/* /usr/bin/将Docker注册为service,创建docker.service文件 vim /etc/syst…...
操作系统(13)虚拟存储器
前言 操作系统中的虚拟存储器是一项关键技术,它为用户提供了一个远大于实际物理内存容量的逻辑内存空间。 一、定义与原理 虚拟存储器是具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的存储器系统。其逻辑容量由内存容量与外存容量之和决定&…...
《面向对象综合训练01~05》
《面向对象综合训练01~05》 训练01:文字版格斗游戏 第一步:创建游戏角色的javabean类 public class Role {private String name;private int blood;private char gender;private String face;//长相是随机的//创建男女长相的随机数组String[] boyfaces…...
电脑为什么会提示“msvcr120.dll缺失”?“找不到msvcr120.dll文件”要怎么解决?
电脑故障排查指南:揭秘“msvcr120.dll缺失”的真相与解决方案 在软件开发与日常维护的广阔天地里,遇到系统报错或文件缺失的情况可谓家常便饭。今天,我将带领大家深入探讨一个常见的系统提示——“msvcr120.dll缺失”,并揭秘其背…...
huggingface NLP-微调一个预训练模型
微调一个预训练模型 1 预处理数据 1.1 处理数据 1.1.1 fine-tune 使用tokenizer后的token 进行训练 batch tokenizer(sequences, paddingTrue, truncationTrue, return_tensors"pt")# This is new batch["labels"] torch.tensor([1, 1])optimizer A…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
