Java 面向对象编程(OOP)

面向对象编程(Object-Oriented Programming,OOP)是Java编程语言的核心思想之一。通过OOP,Java提供了一种结构化的编程方式,使代码更易于维护和扩展。

一、类和对象

1. 类的定义

类是对象的蓝图或模板,定义了对象的属性和行为。一个类通常包含字段(变量)和方法(函数)。下面是一个简单的Java类示例:

public class Person {// 字段String name;int age;// 构造方法public Person(String name, int age) {this.name = name;this.age = age;}// 方法public void display() {System.out.println("Name: " + name + ", Age: " + age);}
}

2. 对象的创建

对象是类的实例,通过类的构造方法来创建对象。使用 new 关键字可以创建一个新的对象:

Person person = new Person("Alice", 30);
person.display();  // 输出:Name: Alice, Age: 30

3. 对象的属性和方法

对象的属性是通过类中的字段定义的,对象的行为是通过类中的方法定义的。可以通过对象访问其属性和方法:

Person person = new Person("Bob", 25);
person.name = "Bob";
person.age = 25;
person.display();  // 输出:Name: Bob, Age: 25

二、继承

继承是OOP的一个重要特性,允许一个类继承另一个类的属性和方法,从而实现代码的重用。被继承的类称为父类(或基类),继承的类称为子类(或派生类)。

1. 继承的实现

在Java中,使用 extends 关键字来实现继承:

public class Employee extends Person {// 新增字段String company;// 构造方法public Employee(String name, int age, String company) {super(name, age);  // 调用父类的构造方法this.company = company;}// 新增方法public void display() {super.display();  // 调用父类的方法System.out.println("Company: " + company);}
}

2. 方法重写

子类可以重写(Override)父类的方法,以提供特定的实现。重写的方法必须具有相同的方法签名(方法名、参数类型和返回类型):

public void display() {super.display();  // 调用父类的方法System.out.println("Company: " + company);
}

3. 多层继承

Java支持单继承,即一个类只能有一个直接父类,但可以通过多层继承实现复杂的继承关系:

public class Manager extends Employee {String department;public Manager(String name, int age, String company, String department) {super(name, age, company);this.department = department;}public void display() {super.display();System.out.println("Department: " + department);}
}

三、多态

多态性是OOP的核心概念之一,指同一个方法调用由于对象不同会表现出不同的行为。多态性主要通过方法重写和接口实现。

1. 方法重写

方法重写是实现多态性的一个方式,子类重写父类的方法,使得相同的方法调用在不同的对象上表现出不同的行为:

Person person = new Employee("Charlie", 28, "Tech Corp");
person.display();  // 调用的是 Employee 类的 display 方法

2. 接口实现

接口定义了一组方法,任何类都可以实现这些接口,从而保证一定的行为。接口的多态性通过接口引用来实现:

interface Printable {void print();
}class Document implements Printable {public void print() {System.out.println("Printing document...");}
}class Photo implements Printable {public void print() {System.out.println("Printing photo...");}
}public class Main {public static void main(String[] args) {Printable p1 = new Document();Printable p2 = new Photo();p1.print();  // 输出:Printing document...p2.print();  // 输出:Printing photo...}
}

四、封装

封装是指将对象的属性和方法私有化,通过公共的访问方法(getter 和 setter)来访问和修改属性。封装提高了代码的安全性和可维护性。

1. 封装的实现

通过将字段声明为 private,并提供 public 的 getter 和 setter 方法来实现封装:

public class BankAccount {// 私有字段private double balance;// 构造方法public BankAccount(double balance) {this.balance = balance;}// Getter 方法public double getBalance() {return balance;}// Setter 方法public void deposit(double amount) {if (amount > 0) {balance += amount;}}public void withdraw(double amount) {if (amount > 0 && amount <= balance) {balance -= amount;}}
}

2. 访问和修改属性

通过 getter 和 setter 方法来访问和修改私有属性:

BankAccount account = new BankAccount(1000);
account.deposit(500);
account.withdraw(200);
System.out.println("Balance: " + account.getBalance());  // 输出:Balance: 1300

五、抽象

抽象是OOP的另一重要特性,通过抽象类和接口来实现。抽象类不能实例化,只能被继承;接口定义一组方法,任何类都可以实现这些方法。

1. 抽象类

抽象类可以包含抽象方法(没有实现的方法)和具体方法。抽象类不能实例化,只能被继承:

abstract class Animal {// 抽象方法public abstract void makeSound();// 具体方法public void sleep() {System.out.println("Sleeping...");}
}class Dog extends Animal {public void makeSound() {System.out.println("Woof");}
}

2. 抽象方法的实现

子类必须实现抽象类中的所有抽象方法:

Dog dog = new Dog();
dog.makeSound();  // 输出:Woof
dog.sleep();  // 输出:Sleeping...

3. 接口

接口是一组方法的声明,任何类都可以实现接口,并提供接口方法的具体实现:

interface Flyable {void fly();
}class Bird implements Flyable {public void fly() {System.out.println("Bird is flying");}
}class Plane implements Flyable {public void fly() {System.out.println("Plane is flying");}
}

4. 接口实现的多态性

接口的多态性通过接口引用来实现:

Flyable f1 = new Bird();
Flyable f2 = new Plane();f1.fly();  // 输出:Bird is flying
f2.fly();  // 输出:Plane is flying

六、组合与聚合

组合和聚合是面向对象设计中的两个重要概念,表示对象之间的关系。

1. 组合

组合表示一个对象由多个部分组成,是一种强依赖关系。如果整体被销毁,部分也会被销毁:

class Engine {// 引擎的实现
}class Car {private Engine engine;public Car() {engine = new Engine();  // 组合关系,Car 创建时创建 Engine}
}

2. 聚合

聚合表示一个对象包含另一个对象,是一种弱依赖关系。如果整体被销毁,部分可以独立存在:

class Library {private List<Book> books;public Library(List<Book> books) {this.books = books;  // 聚合关系,Library 包含 Book}
}

Java的面向对象编程通过类和对象、继承、多态、封装和抽象等概念,使得代码更加模块化、可维护和可扩展。理解和掌握这些概念是成为一名优秀Java开发者的关键。通过实践和项目经验,能够更好地应用这些OOP原则,编写出高质量的Java代码。

黑马程序员免费预约咨询

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

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

相关文章

File name ‘xxxx‘ differs from already included file name ‘xxxx‘ only in casing.

一、报错信息 VSCode报错如下&#xff1a; File name ‘d:/object/oral-data-management/src/components/VisitLogPopup/Info.vue’ differs from already included file name ‘d:/object/oral-data-management/src/components/VisitLogPopup/INfo.vue’ only in casing. The…

【PostgreSQL17新特性之-事务级别超时参数transaction_timeout】

PostgreSQL数据库里有多个和会话相关的参数&#xff0c;PostgreSQL17-beta1版本新增了一个transaction_timeout参数&#xff0c;来限制事务的持续时间。 当前的一些和会话相关的超时参数如下 -----------------------------------------------------------------------------…

备忘录模式具体的例子(含代码)

学习目标&#xff1a; 了解备忘录模式 学习内容&#xff1a; 备忘录模式在现实生活中的一个具体例子是文字处理软件&#xff08;如Microsoft Word&#xff09;中的“撤销”功能。这个功能允许用户在编辑文档时撤销之前的操作&#xff0c;并恢复到之前的状态。让我们更详细地看…

第一讲:单片机STC89C52+RA8889驱动控制彩屏(源码公开)

51单片机驱动控制彩屏系列讲座 第一讲&#xff1a;单片机STC89C52RA8889驱动控制彩屏&#xff08;源码公开&#xff09; 单片机通过SPI与RA8889进行通信&#xff0c;由于单片机是5V&#xff0c;RA8889是3.3V,故需要进行电平转换&#xff0c;有现成的模组TXS0108E等可以采用。…

linux开放某一个端口具体步骤

场景&#xff1a;当服务器防火墙不能直接关闭&#xff0c;但是客户端必须要访问服务器某一个端口时。 处理&#xff1a;对服务器端进行处理&#xff0c;只将该端口开放出来让客户端访问 本地使用vm安装了一个centos服务器&#xff0c;ip地址是 192.168.200.130。在这里充当服…

Kafka原生API使用Java代码-生产者-异步发送消息回调

文章目录 1、异步发送消息&回调1.1、pom.xml1.2、KafkaProducer1.java 1、异步发送消息&回调 回调就是接收kafka的响应 1.1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0&q…

Spring的依赖注入DI

直接使用构造器注入: 需要有对应匹配的构造器 不然出现异常No matching constructor Spring构造器注入有三种不同方式 name :按照参数名称 <bean id"stu" class"com.xja.bean.Student"> <constructor-arg name"name" value"rk&…

idea2021版以上开启Dashboard功能

idea2021版以上开启Dashboard功能 1 在.idea/workspace.xml 文件中找2 增加option 1 在.idea/workspace.xml 文件中找 2 增加option ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/22a809700e3643d18e80dc37e5afe014.png)

Android Studio无法改变Button背景颜色解决办法

大家好&#xff0c;我是咕噜铁蛋&#xff01;今天我来和大家探讨一个在Android开发中常见但可能让初学者感到困惑的问题——如何在Android Studio中改变Button的背景颜色。这个问题看似简单&#xff0c;但实际操作中可能会遇到一些意想不到的挑战。接下来&#xff0c;我将从多个…

Facebook:社交世界的接口

在当今数字时代&#xff0c;社交媒体已经成为了人们生活中不可或缺的一部分&#xff0c;而Facebook作为其中的巨头之一&#xff0c;扮演着至关重要的角色。本文将带您深入探索Facebook这张社交世界的画卷&#xff0c;全面了解这个令人着迷的平台。 起源与历程 Facebook的故事始…

AI虚拟试穿革命:I2VEdit技术引领电商视频内容创新

在当今快速迭代的电子商务领域,用户体验与内容创新是企业竞争力的核心要素。随着AI技术的飞速进步,AI虚拟试穿已不再局限于静态图像,而是迈向了动态视频的新纪元。本文将深入解析一项革新性技术——I2VEdit,如何以其独到之处,为电商尤其是服装零售行业带来一场内容创作与产…

2024-05-29 问AI: 在深度学习中,什么是数据集扩增,data augmentation?

文心一言 在深度学习中&#xff0c;数据集扩增&#xff08;Data Augmentation&#xff09;是一种用于增加模型训练数据量的技术&#xff0c;通过对原始数据集进行一系列随机变换来生成新的、人工合成的样本。这些变换通常是针对图像、音频或文本等数据类型设计的&#xff0c;旨…

未来已来:Flutter引领的安卓与跨平台开发奇幻之旅

引言 随着移动开发技术的飞速发展&#xff0c;跨平台开发框架如Flutter正逐渐改变着传统的安卓和iOS开发格局。作为一名资深的安卓开发工程师&#xff0c;我深刻感受到了Flutter带来的变革和机遇。今天&#xff0c;我想与大家分享Flutter在跨平台开发中的奇幻之旅&#xff0c;…

JVM学习-字节码指令集(二)

对象的创建与访问指令 创建指令 虽然类实例和数组都是对象&#xff0c;但Java虚拟机对类实例和数组的创建和操作使用了不同的字节码指令创建类实例指令&#xff1a;new 它接收一个操作数&#xff0c;指向常量池的索引&#xff0c;表示要创建的类型&#xff0c;执行完成后&am…

重磅发布,2024精选《制造业商业智能BI最佳实践合集 》

在数字时代&#xff0c;中国制造业正面临着前所未有的深刻变革。 商业环境的复杂性与多变性、全球化竞争的激烈程度、消费需求的快速演变&#xff0c;以及新技术的持续进步等多种因素共同推动着制造企业积极加入数字化转型的潮流。 在这个转型的过程中&#xff0c;转型的速度…

【Utils-实用工具】1 - 根据字节限制输入长度

文章目录 1. el-input输入框【根据字节限制输入长度】1.1 【封装方法】到utils中1.2 main.js中把【方法注入到原型】1.3 在vue总使用 1. el-input输入框【根据字节限制输入长度】 需求&#xff1a;某个字段需要限制输出长度为字符长度小于64个VARCHAR2(64)分析&#xff1a; –…

企业内网自建yum源 仓库 | nginx 反向代理方案

文章目录 1.背景概述 方案二 Nginx代理法1. 安装ngnix1.1 安装nginx并启用1.2 修改ngnix配置文件 2. 客户端修改repo文件3.客户端测试 1.背景概述 yum源是一个软件仓库&#xff0c;centos7 停更后&#xff0c;建议企业在内网自建软自己的软件仓库&#xff0c;一般有下列步骤&am…

Java设计模式 _行为型模式_备忘录模式

一、备忘录模式 1、备忘录模式 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型模式。通过保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象。 2、实现思路 &#xff08;1&#xff09;、定义记录数据的格式规范。 &#xff08;2&#xff09;、编…

pyqt Qtreeview分层控件

pyqt Qtreeview分层控件 介绍效果代码 介绍 QTreeView 是 PyQt中的一个控件&#xff0c;它用于展示分层数据&#xff0c;如目录结构、文件系统等。QTreeView 通常与模型&#xff08;如 QStandardItemModel、QFileSystemModel 或自定义模型&#xff09;一起使用&#xff0c;以管…

前端最新面试题(Javascript模块篇)

目录 1 数据类型基础 1.1 JS内置类型 1.2 null和undefined区别 1.3 null是对象吗?为什么? 1.4 1.toString()为什么可以调用? 1.5 0.1+0.2为什么不等于0.3?如何让其相等 1.6 如何理解BigInt 1.7 JS 整数是怎么表示的 1.8 Number() 的存储空间是多大?如果后台发送了…