《Java 简易速速上手小册》第2章:面向对象的 Java(2024 最新版)

在这里插入图片描述

文章目录

  • 2.1 类和对象 - 构建你的小宇宙
    • 2.1.1 基础知识
    • 2.1.2 重点案例:设计一个简单的图书类
    • 2.1.3 拓展案例 1:学生管理系统
    • 2.1.4 拓展案例 2:账户管理系统
  • 2.2 继承与多态 - 让一切变得更有趣
    • 2.2.1 基础知识
    • 2.2.2 重点案例:动物园管理系统
    • 2.2.3 拓展案例 1:图形界面组件
    • 2.2.4 拓展案例 2:支付系统
  • 2.3 封装与抽象 - 保持秘密的艺术
    • 2.3.1 基础知识
    • 2.3.2 重点案例:银行账户管理系统
    • 2.3.3 拓展案例 1:员工管理系统
    • 2.3.4 拓展案例 2:图形界面组件库

2.1 类和对象 - 构建你的小宇宙

在 Java 的宇宙中,一切都围绕着类和对象展开。理解这个概念是迈向 Java 大师之路的关键一步。让我们深入挖掘这个概念,探索如何利用它来构建我们自己的编程宇宙。

2.1.1 基础知识

  • 类(Class):类是一个蓝图,定义了创建对象(实例)时所需的状态和行为。状态由属性(变量)表示,行为由方法(函数)表示。想象你正在设计一个机器人,你需要决定它有哪些功能(方法)和属性(变量)。

  • 对象(Object):对象是根据类的定义创建的实例。如果类是蓝图,那么对象就是根据这个蓝图建造的房子。每个对象都拥有自己的状态,能够执行定义在其类中的操作。

  • 实例化:创建对象的过程称为实例化。通过使用 new 关键字和类的构造器(Constructor)来实现。

  • 构造器(Constructor):构造器是一种特殊的方法,用于在创建对象时初始化对象的状态。构造器的名称必须与类名完全相同。

2.1.2 重点案例:设计一个简单的图书类

假设我们要在一个图书管理系统中管理图书,我们需要创建一个 Book 类来代表每本图书。

class Book {String title;String author;int yearPublished;// 构造器public Book(String title, String author, int yearPublished) {this.title = title;this.author = author;this.yearPublished = yearPublished;}// 显示图书信息的方法public void displayInfo() {System.out.println(title + " by " + author + ", published in " + yearPublished);}
}public class Library {public static void main(String[] args) {// 创建 Book 对象Book myBook = new Book("Effective Java", "Joshua Bloch", 2008);// 调用方法显示图书信息myBook.displayInfo();}
}

2.1.3 拓展案例 1:学生管理系统

在一个学生管理系统中,我们需要处理学生的信息,如姓名、学号和成绩。

class Student {String name;String studentID;double grade;public Student(String name, String studentID, double grade) {this.name = name;this.studentID = studentID;this.grade = grade;}public void displayStudentInfo() {System.out.println("Student: " + name + " (ID: " + studentID + "), Grade: " + grade);}
}public class School {public static void main(String[] args) {Student student1 = new Student("Alice", "S001", 3.5);student1.displayStudentInfo();}
}

2.1.4 拓展案例 2:账户管理系统

在一个账户管理系统中,我们可能需要管理用户的账户,包括账户名、余额和密码。

class Account {String accountName;double balance;String password;public Account(String accountName, double balance, String password) {this.accountName = accountName;this.balance = balance;this.password = password;}public void deposit(double amount) {balance += amount;System.out.println("Deposit successful. New balance: " + balance);}public void withdraw(double amount, String password) {if (this.password.equals(password)) {if (balance >= amount) {balance -= amount;System.out.println("Withdrawal successful. New balance: " + balance);} else {System.out.println("Insufficient funds.");}} else {System.out.println("Invalid password.");}}
}public class Bank {public static void main(String[] args) {Account myAccount = new Account("JohnDoe", 1000, "password123");myAccount.deposit(500);myAccount.withdraw(200, "password123");}
}

通过这些案例,我们可以看到类和对象如何成为构建 Java 应用程序的基础。每个案例都展示了如何定义类,创建对象,以及如何使用对象的状态和行为来执行具体的任务。随着你对这些概念的深入了解,你将能够创建更复杂、功能更强大的 Java 程序。

在这里插入图片描述


2.2 继承与多态 - 让一切变得更有趣

在 Java 的奇妙世界里,继承和多态是两个让编程变得更加有趣和强大的概念。通过这两个特性,你可以编写出更简洁、更灵活且易于维护的代码。让我们深入探讨这些概念,并通过一些实际案例来展示它们的威力。

2.2.1 基础知识

  • 继承(Inheritance):继承允许一个类(子类)继承另一个类(父类)的属性和方法。这意味着你可以创建一个通用的类,然后通过继承来扩展或修改这个类的功能,而不需要从头开始编写。

  • 多态(Polymorphism):多态允许你使用一个统一的接口来操作不同类型的对象。在运行时,Java 虚拟机(JVM)会确定对象的实际类型,调用相应类的方法。这使得你可以编写更通用和灵活的代码。

2.2.2 重点案例:动物园管理系统

假设我们正在为一个动物园创建一个管理系统。在这个系统中,我们需要处理各种类型的动物,比如狮子、老虎和鹦鹉。

基类:Animal

abstract class Animal {String name;public Animal(String name) {this.name = name;}abstract void makeSound();
}

子类:Lion

class Lion extends Animal {public Lion(String name) {super(name);}@Overridevoid makeSound() {System.out.println(name + " says: Roar");}
}

子类:Parrot

class Parrot extends Animal {public Parrot(String name) {super(name);}@Overridevoid makeSound() {System.out.println(name + " says: Squawk");}
}

演示多态

public class Zoo {public static void main(String[] args) {Animal myLion = new Lion("Leo");Animal myParrot = new Parrot("Polly");myLion.makeSound();myParrot.makeSound();}
}

在这个案例中,Animal 类是一个抽象基类,定义了一个抽象方法 makeSound()LionParrot 类继承自 Animal 类,并提供了 makeSound() 方法的具体实现。这个例子展示了如何通过继承和多态来处理不同类型的动物,同时保持代码的简洁和灵活性。

2.2.3 拓展案例 1:图形界面组件

在创建图形用户界面(GUI)时,我们可能需要处理各种类型的组件,比如按钮、文本框和复选框。我们可以定义一个通用的 Component 类,然后让所有具体的组件类继承自这个类。

abstract class Component {abstract void draw();
}class Button extends Component {@Overridevoid draw() {System.out.println("Drawing a button");}
}class TextBox extends Component {@Overridevoid draw() {System.out.println("Drawing a text box");}
}

使用多态来处理不同的组件:

public class GUI {public static void main(String[] args) {Component button = new Button();Component textBox = new TextBox();button.draw();textBox.draw();}
}

2.2.4 拓展案例 2:支付系统

在一个电子商务平台的支付系统中,我们需要处理不同类型的支付方式,比如信用卡支付、PayPal 支付和银行转账。

abstract class PaymentMethod {abstract void pay(double amount);
}class CreditCard extends PaymentMethod {@Overridevoid pay(double amount) {System.out.println("Paying $" + amount+ " with credit card");}
}class PayPal extends PaymentMethod {@Overridevoid pay(double amount) {System.out.println("Paying $" + amount + " with PayPal");}
}

使用多态进行支付:

public class ECommerce {public static void main(String[] args) {PaymentMethod myCreditCard = new CreditCard();PaymentMethod myPayPal = new PayPal();myCreditCard.pay(100.0);myPayPal.pay(75.0);}
}

通过这些案例,我们可以看到继承和多态如何使得 Java 编程变得更加灵活和强大。通过使用这些特性,你可以编写出既简洁又易于维护的代码,轻松应对各种编程挑战。

在这里插入图片描述


2.3 封装与抽象 - 保持秘密的艺术

在 Java 的世界中,封装和抽象是保持代码整洁、安全和灵活的两个基石。通过这两种机制,我们可以隐藏实现细节,只暴露必要的接口给外界使用。这不仅可以防止数据被不当访问,还能使得代码更易于理解和维护。

2.3.1 基础知识

  • 封装(Encapsulation):封装是通过将数据(属性)和操作数据的方法捆绑在一起的编程技术。在 Java 中,通过将类的成员变量设为 private,然后通过 public 方法(getter 和 setter)来访问和修改这些变量,实现封装。

  • 抽象(Abstraction):抽象是一种将复杂性隐藏起来,只显示最关键的信息的方法。在 Java 中,抽象类和接口是实现抽象的两种主要方式。抽象类可以包含抽象方法(没有实现的方法),而接口则可以定义一组方法规范,由其他类来实现。

2.3.2 重点案例:银行账户管理系统

假设我们要设计一个银行账户管理系统,这个系统需要处理各种类型的账户,如储蓄账户和支票账户,同时保护账户信息并提供账户操作。

抽象类:Account

abstract class Account {private String accountNumber;private double balance;public Account(String accountNumber, double balance) {this.accountNumber = accountNumber;this.balance = balance;}public String getAccountNumber() {return accountNumber;}public double getBalance() {return balance;}public void deposit(double amount) {balance += amount;}abstract void withdraw(double amount); // 抽象方法@Overridepublic String toString() {return "Account{" +"accountNumber='" + accountNumber + '\'' +", balance=" + balance +'}';}
}

具体类:SavingsAccount 和 CheckingAccount

class SavingsAccount extends Account {private double interestRate;public SavingsAccount(String accountNumber, double balance, double interestRate) {super(accountNumber, balance);this.interestRate = interestRate;}@Overridevoid withdraw(double amount) {if (getBalance() >= amount) {System.out.println("Withdrawing from Savings Account");}}
}class CheckingAccount extends Account {private double overdraftLimit;public CheckingAccount(String accountNumber, double balance, double overdraftLimit) {super(accountNumber, balance);this.overdraftLimit = overdraftLimit;}@Overridevoid withdraw(double amount) {if (getBalance() + overdraftLimit >= amount) {System.out.println("Withdrawing from Checking Account");}}
}

2.3.3 拓展案例 1:员工管理系统

在一个公司的员工管理系统中,我们需要处理不同种类的员工,如正式员工和临时员工,同时管理他们的基本信息和薪资。

抽象类:Employee

abstract class Employee {private String id;private String name;public Employee(String id, String name) {this.id = id;this.name = name;}public String getId() {return id;}public String getName() {return name;}abstract double calculateSalary(); // 计算薪资的抽象方法
}

具体类:RegularEmployee 和 TemporaryEmployee

class RegularEmployee extends Employee {private double annualSalary;public RegularEmployee(String id, String name, double annualSalary) {super(id, name);this.annualSalary = annualSalary;}@Overridedouble calculateSalary() {return annualSalary / 12;}
}class TemporaryEmployee extends Employee {private double hourlyRate;private int hoursWorked;public TemporaryEmployee(String id, String name, double hourlyRate, int hoursWorked) {super(id, name);this.hourlyRate = hourlyRate;this.hoursWorked = hoursWorked;}@Overridedouble calculateSalary() {return hourlyRate * hoursWorked;}
}

2.3.4 拓展案例 2:图形界面组件库

在开发图形用户界面(GUI)时,我们可能需要创建一套组件库,如按钮、文本框等,同时保证这些组件的接口一致,以便于使用和扩展。

接口:Component

interface Component {void draw();void resize();
}

具体实现:Button 和 TextBox

class Button implements Component {@Overridepublic void draw() {System.out.println("Drawing a Button");}@Overridepublic void resize() {System.out.println("Resizing a Button");}
}class TextBox implements Component {@Overridepublic void draw() {System.out.println("Drawing a TextBox");}@Overridepublic void resize() {System.out.println("Resizing a TextBox");}
}

通过这些案例,我们可以看到封装和抽象如何使得代码更加安全、清晰和易于维护。封装保护了数据和实现细节,而抽象则提供了一种高层次的方式来操作对象,使得我们可以轻松地扩展和修改系统,而不会影响到使用这些系统的代码。

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

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

相关文章

【51单片机】蜂鸣器(江科大)

11.1蜂鸣器 1.蜂鸣器介绍 蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定 无源蜂鸣器:内部不带振荡源,需…

C语言strlen和sizeof的区别

strlen和sizeof没有联系 前者是库函数,统计长度的标志是是否有\0 后者是操作符。计算长度的标志是字节数量。

Linux_线程

线程与进程 多级页表 线程控制 线程互斥 线程同步 生产者消费者模型 常见概念 下面选取32位系统举例。 一.线程与进程 上图是曾经我们认为进程所占用的资源的集合。 1.1 线程概念 线程是一个执行分支,执行粒度比进程细,调度成本比进程低线程是cpu…

本地部署 Stable Cascade

本地部署 Stable Cascade 0. 引言1. 事前准备2. 本地部署 Stable Cascade3. 使用 Stable Cascade 生成图片4. Stable Cascade Github 地址 0. 引言 Stable Cascade 模型建立在 Wrstchen 架构之上,它与 Stable Diffusion 等其他模型的主要区别在于它的工作潜在空间要…

软考27-上午题-查找

一、基本概念 1-1、查找表: 同一类型的数据元素构成的集合。 对查找表常用的操作: 从查找表中查询某个特定的元素;检索某个特定的元素的各种属性。 通常只进行这两种操作的查找表:静态查找表 1-1-2、静态查找表: 顺…

B2科目二考试项目笔记

B2科目二考试项目笔记 1 桩考1.1 右起点倒库1.2 移库(左→右)1.3 驶向左起点1.4 左起点倒库1.5 驶向右起点 2 侧方停车考试阶段(从路边开始): 3 直角转弯4 坡道定点停车和起步5 单边桥6 通过限速限宽门7 曲线行驶8 连续…

[OPEN SQL] 删除数据

DELETE语句用于删除数据库表中的数据 本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 需要删除以下数据 1.删除单条数据 语法格式 DELETE <dbtab> FROM <wa>. DELETE <dbtab> FROM TABLE <itab>. DELETE FROM &…

Linux makefile 大型多文件的处理

最简单的例子是 main.cpp test.cpp test.h 首先将这三个写好 然后的话 test.cpp 上面输出 helloworld 首先我们在同一个目录下创建一个makefile 文件 然后用vim 编辑它 如下图&#xff08;使用的c&#xff09; mybin 是我们的可执行程序 gcc是编译的命令 gcc 前面必…

人形机器人专题:准直驱执行器深度:人形机器人执行器技术的前沿

今天分享的是人形机器人系列深度研究报告&#xff1a;《人形机器人专题&#xff1a;准直驱执行器深度&#xff1a;人形机器人执行器技术的前沿》。 &#xff08;报告出品方&#xff1a;招商证券&#xff09; 报告共计&#xff1a;34页 准直驱执行器具备独特优势 刚性执行器…

ArcgisForJS基础

文章目录 0.引言1.第一个ArcgisForJS应用程序1.1.安装部署ArcgisForJS1.2.实现ArcgisForJS应用程序 2.开发与调试工具2.1.集成开发环境2.2.调试工具2.3.Firebug 0.引言 ArcGIS API for JavaScript是一款由Esri公司开发的用于创建WebGIS应用的JavaScript库。它允许开发者通过调…

UI文件原理

使用UI文件创建界面很轻松很便捷&#xff0c;他的原理就是每次我们保存UI文件的时候&#xff0c;QtCreator就自动帮我们将UI文件翻译成C的图形界面创建代码。可以通过以下步骤查看代码 到工程编译目录&#xff0c;一般就是工程同级目录下会生成另一个编译目录&#xff0c;会找到…

Stable Diffusion主流UI详细介绍

Stable Diffusion目前主流的操作界面有WebUI、ComfyUI以及Fooocus 这里webui和fooocus在人机交互上的逻辑是一样的&#xff0c;fooocus界面更加简洁。 comfyui是在人机交互上是采用流程节点的交互逻辑&#xff0c;和上面略有区别。 界面分别如下&#xff1a; WebUI界面如下 we…

Spring 用法学习总结(二)之基于注解注入属性

Spring学习 5 基于注解方式创建对象6 基于注解注入属性 5 基于注解方式创建对象 注解是代码的特殊标记&#xff0c;可以简化xml配置&#xff0c;格式&#xff1a;注解名称(属性名称属性值&#xff09;&#xff0c;可以作用在类、方法、属性上 以下注解都可以创建bean实例 Com…

LeetCode 每日一题 Day 62 - 75

1686. 石子游戏 VI Alice 和 Bob 轮流玩一个游戏&#xff0c;Alice 先手。 一堆石子里总共有 n 个石子&#xff0c;轮到某个玩家时&#xff0c;他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道对方的评判标准。 给你…

提前部署游戏业务防护,为何如此重要?

现在做网络游戏的企业都知道服务器的安全对于我们来说很重要&#xff01;互联网上面的DDoS攻击和CC攻击等等无处不在&#xff0c;而游戏服务器对服务器的防御能力和处理能力要求更高&#xff0c;普通的服务器则是比较注重各方面能力的均衡。 随着游戏行业的壮大&#xff0c;网络…

Shell 学习笔记(一)-Shell脚本编程简介

一 什么是shell&#xff1f; shell是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内…

【学网攻】 第(28)节 -- OSPF虚链路

系列文章目录 目录 系列文章目录 文章目录 前言 一、什么是OSPF虚链路&#xff1f; 二、实验 1.引入 实验目标 实验背景 技术原理 实验步骤 实验设备 实验拓扑图 实验配置 扩展 实验拓扑图 实验配置 实验验证 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻…

winprop二次开发

winprop二次开发 前言工具1——整合多个天线结果用途代码实现 工具2——wallman辅助工具需求代码实现 前言 工作需求&#xff0c;对该软件进行简单地二次开发&#xff0c;都是一些挺简单的代码&#xff0c;单纯是为了上传之后将其从本地删除 工具1——整合多个天线结果 用途…

鲁南制药“健康幸福中国年”主题航班,开启探寻健康与幸福的旅程

“小年&#xff0c;小年&#xff0c;过了今天就是年。”提到过年&#xff0c;北方人的“过年”是从腊月二十三的“小年”开始的&#xff0c;而南方地区是在明天。虽然时间不同&#xff0c;但是浓浓的年味是一样的&#xff0c;红彤彤是主色调&#xff0c;喜洋洋是主乐曲&#xf…

C语言:内存分配---栈区、堆区、全局区、常量区和代码区

一、C语言内存分区 C语言内存分区示意图如下&#xff1a; 1. 栈区 栈区介绍 栈区由编译器自动分配释放&#xff0c;由操作系统自动管理&#xff0c;无须手动管理。栈区上的内容只在函数范围内存在&#xff0c;当函数运行结束&#xff0c;这些内容也会自动被销毁。栈区按内存…