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代码。

黑马程序员免费预约咨询

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【qt】一次性学会所有对话框

对话框 一.前言二.文件对话框1.选择一个文件2.选择多个文件3.选择目录4.保存文件 三.颜色对话框1.获取颜色 四.字体对话框1.获取字体 五.输入对话框1.输入文本2.输入整数3.输入小数4.输入条目 六.消息对话框1.问题框2.信息框3.警告框4.危机框5.关于框6.关于qt框七.总结 一.前言…

CSS学习笔记:动画——使用animation添加动画效果

过渡和动画 啥是过渡? 例如transition: all 0.5s; -> 拥有该属性的标签&#xff0c;在样式改变时&#xff0c;将在设定的时间内逐渐过渡到另一个样式 啥是动画&#xff1f; 和过渡有点类似&#xff0c;只不过常常用于实现多个状态间的变化过程&#xff0c;动画过程可控…

基于PHP+MySQL组合开发的720VR全景小程序源码系统 一键生成三维实景 前后端分离带网站的安装代码包以及搭建教程

系统概述 这款源码系统是专门为实现 720VR 全景展示而设计的。它结合了先进的技术和创新的理念&#xff0c;能够将真实场景以全景的形式呈现给用户&#xff0c;让用户仿佛身临其境。该系统采用 PHP 进行后端开发&#xff0c;MySQL 作为数据库管理系统&#xff0c;确保了系统的…

【JAVA |Object类重写实例】Cloneable 接口、Comparable接口、比较器

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…

阿贝云免费虚拟主机及免费云服务器评测

阿贝云是一家提供免费虚拟主机和免费云服务器的公司&#xff0c;其服务质量备受用户好评。用户可以通过阿贝云的网站 https://www.abeiyun.com 进行申请并获得免费服务。首先&#xff0c;我们来看看阿贝云的免费虚拟主机服务。免费虚拟主机提供了足够的存储空间和带宽&#xff…

HackTheBox-Machines--Cronos

文章目录 0x01 信息收集0x02 命令注入漏洞0x03 权限提升 Cronos 测试过程 0x01 信息收集 1.端口扫描 发现 SSH&#xff08;22&#xff09;、DNS&#xff08;53&#xff09;、HTTP&#xff08;80&#xff09;端口 nmap -sC -sV 10.129.227.2112.53端口开启&#xff0c;进行DNS…

靶机Moonraker_1练习报告

Moonraker: 1靶机练习实践报告 一、安装靶机 靶机是.ova文件&#xff0c;需要用VirtualBox打开&#xff0c;但我习惯于使用VMWare,因此修改靶机文件&#xff0c;使其适用于VMWare打开。 解压ova文件&#xff0c;得到.ovf文件和.vmdk文件。 直接用VMWare打开.ovf文件即可。 …

【VTKExamples::Utilities】第四期 CameraModifiedEvent

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例CameraModifiedEvent,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. CameraModifi…

OpenMV的VisionBoard视觉识别开发板学习记录

此篇博客仅用于对VisionBoard的开发板的学习研究记录&#xff0c;没有教学内容。 一、资料来源 开发板资料链接 开发板环境搭建手册 开发板视频教程 板子的资料网站 openmv官方的网站 目录 一、资料来源二、针对 VisionBoard的目标识别和定位总结1. 目标识别功能1.1 物体检测…

react ant 表格实现 拖拽排序和多选

项目背景 : react ant 要实现 : 有多选功能(实现批量删除 , 也可以全选) 可以拖拽(可以复制 , 方便顶部的搜索功能) 要实现效果如下 1 这是最初的拖拽功能实现 , 不能复制表格里的内容 , 不符合要求 2 更改了ROW的内容 , 实现了可以复制表格内容 代码 //控制是否可以选中表格…

Oracle数据库操作问题汇总

一、简介 Oracle Database&#xff0c;又名Oracle RDBMS&#xff0c;或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统&#xff0c;系统可移植性好、使用方便、功能强&…

数据结构--二叉树--顺序存储判断是否二叉搜索树(2022统考真题)

数据结构–二叉树–顺序存储判断是否二叉搜索树(2022统考真题) 题目描述&#xff1a; 思路 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是一种具有以下性质的二叉树&#xff1a; 对于树中的每个节点 N&#xff0c;它的左子树&#xff08;如果…

重学java 49 List接口

但逢良辰&#xff0c;顺颂时宜 —— 24.5.28 一、List接口 1.概述: 是collection接口的子接口 2.常见的实现类: ArrayList LinkedList Vector 二、List集合下的实现类 1.ArrayList集合的使用及源码分析 1.概述 ArrayList是List接口的实现类 2.特点 a.元素有序 —> 按照什么顺…

Oracle中rman的增量备份使用分享

继上次使用RMAN的全量备份和异机还原以后&#xff0c;开始研究一下增量备份和还原的方法。相比于全量RMAN的备份还原&#xff0c;增量的备份还原就相对简单。本实践教程直接上操作&#xff0c;还是回归到一个问题&#xff0c;就是关于两个数据库创建时候&#xff0c;必须保持or…

【职业教育培训机构小程序】教培机构“招生+教学”有效解决方案

教培机构“招生教学”有效解决方案在数字化转型的浪潮中&#xff0c;职业教育培训机构面临着提升教学效率、拓宽招生渠道、增强学员互动等多重挑战。小程序作为一种新兴的移动应用平台&#xff0c;为解决这些痛点提供了有效途径。 一、职业教育培训机构小程序的核心功能 &…

SpringBoot自动装配源码

自动装配&#xff1a; 实际上就是如何将Bean自动化装载到IOC容器中管理&#xff0c;Springboot 的自动装配时通过SPI 的方式来实现的 SPI&#xff1a;SpringBoot 定义的一套接口规范&#xff0c;这套规范规定&#xff1a;Springboot 在启动时会扫描外部引用 jar 包中的META-IN…

栈(从数据结构的三要素出发)

文章目录 逻辑结构物理结构顺序栈链栈共享栈 数据的操作顺序栈的基本操作链栈的基本操作共享栈的基本操作 数据结构的应用栈在括号匹配中的应用栈在表达式求值中的应用栈在递归调用中的应用 逻辑结构 栈是只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表&#xf…

保留两位小数不四舍五入,10000.55变成10000.54的坑

正解 function moneyFormat(num){ let money num "";//隐式转换为字符串和toString()效果一样//没有小数补齐这个0if(money.indexOf(".")"-1"){moneymoney".00";}else{//有小数截取前二位小数moneymoney.substring(0,money.inde…

工业AI的崛起,中国自主创新的新机遇

我们都知道&#xff0c;互联网已经深刻地改变了我们的生活方式&#xff0c;催生了无数的新型商业模式和创新产业&#xff0c;推动了社会的经济变革。中国在互联网领域的发展取得了举世瞩目的成就&#xff0c;建成了全球规模最大、技术领先的5G网络&#xff0c;互联网应用的普及…

vue3 vite title 页面标题设置

效果图&#xff1a; 1. 安装 vite-plugin-html 插件 npm install vite-plugin-html -D2. 修改 vite.config.js import {defineConfig, loadEnv} from vite import { createHtmlPlugin } from "vite-plugin-html" import {resolve} from path import vue from vitej…