探索面向对象编程的核心:类、对象与封装

news2024/11/25 12:45:52

探索面向对象编程的核心:类、对象与封装

在学习Java编程时,面向对象编程(OOP)是一个非常重要的核心概念。今天我们将深入探讨其中最基本、但却非常重要的组成部分:对象,以及它们是如何通过封装来实现数据保护和行为封装的。

1. 类与对象:基础概念与理解

在Java中,是对现实世界中一类具有相同属性和行为的事物的抽象,而对象是类的具体实例。这可以类比为一个蓝图(类)与建筑物(对象)的关系。

  • :描述了一类事物的属性和行为。比如,"手机"类可以定义品牌、价格等属性,以及打电话、发短信等行为。
  • 对象:是类的具体实例化对象。假设有一台小米手机,那么这台手机便是手机类的一个对象,它具备手机的所有属性和行为。
1.1 类的组成

类由属性(成员变量)和行为(成员方法)组成。

  • 属性:描述对象的特征。例如,手机的品牌、价格就是属性。
  • 行为:描述对象的功能或操作。例如,手机可以打电话、发短信。
代码示例:创建一个手机类
public class Phone {
    // 成员变量
    String brand;  // 品牌
    int price;     // 价格

    // 成员方法
    public void call() {
        System.out.println("打电话");
    }

    public void sendMessage() {
        System.out.println("发短信");
    }
}
1.2 对象的创建与使用

在Java中,使用new关键字创建对象,并通过对象名来访问类中的属性和方法。

Phone myPhone = new Phone();  // 创建Phone对象
myPhone.brand = "小米";  // 设置属性
myPhone.price = 2999;

System.out.println(myPhone.brand);  // 输出:小米
myPhone.call();  // 输出:打电话

通过创建对象,我们可以实例化类中的抽象概念,并操作这些对象的属性和行为。

1.3 类与对象的关系

类是对事物的描述,描述了事物的共性,而对象则是类的具体实例,具备类的所有属性和行为。

1.4 对象内存图
1.4.1 单个对象内存图
  • 成员变量使用过程

  • 成员方法调用过程

1.4.2 多个对象内存图
  • 成员变量使用过程

  • 成员方法调用过程


2. 封装:提高安全性与可维护性

封装是面向对象编程中的重要思想之一,它指的是将类的属性私有化(即private),通过公共的gettersetter方法提供对这些属性的访问。

封装的目的是保护数据的安全性,避免数据在不经意间被篡改。通过提供必要的接口,外部代码只能通过特定的方式修改对象的状态,从而增加了代码的健壮性和可维护性。

2.1 为什么需要封装?
  • 数据安全:防止属性被任意修改或访问。
  • 代码简洁:通过封装可以隐藏类的内部实现细节,外部只需要关心类的接口。
  • 提高灵活性:可以根据需要调整接口实现,而不影响外部代码。
代码示例:封装学生类
class Student {
    // 私有属性
    private String name;
    private int age;

    // 构造方法
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 提供访问和修改属性的方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age > 0 && age < 120) {
            this.age = age;
        } else {
            System.out.println("输入年龄不合法");
        }
    }

    // 展示学生信息的方法
    public void displayInfo() {
        System.out.println("学生姓名:" + name + ",年龄:" + age);
    }
}

在这个例子中,我们将nameage属性封装成私有变量,并通过gettersetter方法控制外部对这些变量的访问。这样可以确保age的赋值不会出现负值或者过大的错误情况。


3. 构造方法:对象的初始化方式

构造方法是一种特殊的方法,用于在创建对象时对其进行初始化。它与类名相同,并且没有返回值。构造方法可以重载,我们可以根据需求定义多个构造方法,以实现不同的初始化方式。

代码示例:构造方法与重载
class Student {
    private String name;
    private int age;

    // 无参构造方法
    public Student() {
        System.out.println("调用了无参构造方法");
    }

    // 带参构造方法
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void displayInfo() {
        System.out.println("学生姓名:" + name + ",年龄:" + age);
    }
}

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student();  // 调用无参构造方法
        Student s2 = new Student("张三", 18);  // 调用带参构造方法
        s2.displayInfo();  // 输出:学生姓名:张三,年龄:18
    }
}

构造方法的主要作用是帮助对象在创建时设置初始状态,从而确保对象始终处于有效的状态。


4. 成员变量和局部变量的区别

在Java中,变量可以分为成员变量局部变量,它们之间存在一些显著的区别:

特性成员变量局部变量
定义位置类中方法外方法内部
内存位置堆内存栈内存
生命周期随对象创建,随对象销毁随方法执行开始,结束销毁
初始化值有默认初始化值无默认初始化值

成员变量与局部变量的主要区别在于它们的生命周期和作用范围,这些特性决定了它们在程序中的使用场景。


5. 标准类的构造

在实际开发中,类通常包含以下几部分:

  1. 私有的成员变量
  2. 至少两个构造方法(无参和带参)
  3. gettersetter 方法
  4. 其他必要的功能方法

标准类的设计有助于提高代码的可维护性和可复用性,遵循这个模式能够更好地管理和控制对象的行为。

代码示例:标准类的制作
class User {
    private String username;
    private String password;
    private int age;

    // 无参构造方法
    public User() {}

    // 带参构造方法
    public User(String username, String password, int age) {
        this.username = username;
        this.password = password;
        this.age = age;
    }

    // getter 和 setter 方法
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }

    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }

    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }

    // 打印用户信息的方法
    public void displayInfo() {
        System.out.println("用户名:" + username + ",年龄:" + age);
    }
}

public class Test {
    public static void main(String[] args) {
        User user1 = new User("zhangsan", "123456", 30);
        user1.displayInfo();  // 输出:用户名:zhangsan,年龄:30
    }
}

结语

在面向对象编程中,对象封装构造方法等概念是编写健壮、可维护代码的基石。通过合理的类设计、封装数据和行为,我们可以提高代码的可读性和安全性。希望通过本文的讲解,大家对这些核心概念有了更加深入的理解。在后续的学习中,我们还会探讨更多关于面向对象编程的高级特性,比如继承和多态,敬请期待!

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

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

相关文章

全网免费的文献调研方法以及获取外网最新论文、代码和翻译pdf论文的方法(适用于硕士、博士、科研)

1. 文献调研 学术搜索引擎(十分推荐前三个&#xff0c;超有用)&#xff1a;使用 Google Scholar(https://scholar.google.com/)(https://scholar.google.com.tw/)(巨人学术搜索‬‬)、&#xff08;三个都可以&#xff0c;镜像网站&#xff09; arXiv(https://arxiv.org/)、&am…

企业架构系列(21)ArchiMate建模ADM阶段A:架构愿景

从本篇开始&#xff0c;将通过6篇文章逐一介绍如何使用 ArchiMate 的特定视角来创建与 TOGAF 架构开发方法相关的图形化模型或图表&#xff08;即&#xff0c;ADM中的图形制品&#xff0c;Graphical Artifacts&#xff09;。这些制品让利益相关者以可视化的方式来理解架构内容&…

vscode中每个打开的文件都显示在一个单独的标签页中

版本&#xff1a;1.94 实现步骤&#xff1a; 1、打开设置 File-》Preferences-》Settings 2、具体设置 2.1、在配置中搜索 workbench.editor.showTabs 设置为multiple。 2.2、在配置中搜索 workbench.editor.enablePreview 取消勾选。 根据这个功能的说明&#xff0c;在…

Java项目-基于springcloud框架的分布式架构网上商城系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

背包九讲——完全背包问题

目录 完全背包问题 问题定义 动态规划解法 状态转移方程 初始化 遍历顺序 三种解法&#xff1a; 朴素版——枚举k 进阶版——dp正推&#xff08;一维滚动数组&#xff09; 背包问题第三讲——完全背包问题 背包问题是一类经典的组合优化问题&#xff0c;通常涉及在限定…

PCB走线线径与电流关系

转载自一个实验搞明白PCB走线应该画多宽_哔哩哔哩_bilibili

2011年国赛高教杯数学建模A题城市表层土壤重金属污染分析解题全过程文档及程序

2011年国赛高教杯数学建模 A题 城市表层土壤重金属污染分析 随着城市经济的快速发展和城市人口的不断增加&#xff0c;人类活动对城市环境质量的影响日显突出。对城市土壤地质环境异常的查证&#xff0c;以及如何应用查证获得的海量数据资料开展城市环境质量评价&#xff0c;研…

什么是智能电网?

智能电网&#xff08;Smart Grid&#xff09;被认为是当今电力行业发展的重要方向之一。它是传统电网与现代信息技术、通信技术和自动化技术深度融合的产物&#xff0c;旨在提高电力系统的效率、可靠性和可持续性。智能电网不仅仅是一个技术创新的名词&#xff0c;更是一个系统…

全域推广什么意思?如何搭建高效优质的全域推广服务商系统?

当前&#xff0c;全域推广一词的热度日渐升高&#xff0c;越来越多的人开始关注和计划入局这一全新项目&#xff0c;希望能够吃到第一波红利。不过&#xff0c;由于这一项目刚刚兴起&#xff0c;相关资料尚不完善&#xff0c;因此&#xff0c;绝大多数有意向入局的人都对该项目…

创客项目秀 | 基于使用 XIAO BLE Sense 和 Edge Impulse 的宠物活动跟踪器

今天为大家带来的是来自美国的创作者米顿-达斯的作品:宠物活动跟踪器.这个装置主要是为宠物主人提供关于宠物日常活动量的详尽数据&#xff0c;还能够根据宠物的独特需求&#xff0c;提供个性化的健康建议和活动指导。 项目背景 为了全面促进宠物的健康与活力&#xff0c;采用…

来可电子CAN数据记录仪通过智诊小助手TF卡记录文件导出

若想将TF卡中记录的数据文件导出可按以下的流程进行配置&#xff1a; 点击主界面中的导出选项即可进入到下图中TF卡应用界面 点击TF卡应用界面中“查看记录文件”的选项&#xff0c;进入导出文件界面。 点击“选择”进入勾选文件的界面 点击“导出”后&#xff0c;点击“确定”…

Vulnhub打靶-napping

基本信息 靶机下载&#xff1a;https://download.vulnhub.com/napping/napping-1.0.1.ova 攻击机器&#xff1a;192.168.20.128&#xff08;Windows操作系统&#xff09;& 192.168.20.138&#xff08;kali&#xff09; 提示信息&#xff1a;甚至管理员也可以在工作中睡…

统信UOS与Windows11传输数据

原文连接&#xff1a;统信UOS与Windows11相互传输数据 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇统信UOS与Windows11之间通过共享文件夹传输数据的方法&#xff0c;首先在Windows11上创建共享文件夹&#xff0c;然后通过smb协议在UOS上进行连接访问&#xff0c…

彻底解决IDEA SpringBoot项目yml文件没有小树叶,读取配置文件失败问题

报错说没有配置dubbo:application:name,其实是配置了的&#xff0c;就是读不到&#xff0c;那有没有可能是yml文件不是绿叶的问题&#xff1f;网上查了很多文章配置小绿叶&#xff0c;最后还是报这个错&#xff0c;而且网上的文章配置小绿叶也太过于繁琐&#xff0c;其实就一招…

【Java后端】之 ThreadLocal 详解

想象一下&#xff0c;你有一个工具箱&#xff0c;里面放着各种工具。在多人共用这个工具箱的时候&#xff0c;很容易出现混乱&#xff0c;比如有人拿走了你的锤子&#xff0c;或者你找不到合适的螺丝刀。为了避免这种情况&#xff0c;最好的办法就是每个人都有自己独立的工具箱…

Wasm解析入口分析

直接postman请求&#xff0c;发现返回了一个wasm&#xff0c;需要解析这个wasm获取到参数。下面找到页面入口&#xff0c;如下&#xff1a; 也是个VM解析&#xff0c;VM太多了&#xff0c;扣出来就行&#xff0c;不难&#xff0c;就是麻烦的很。

6个最佳核心应用仪表盘构建工具

核心应用仪表盘&#xff08;Core App Dashboard&#xff09;的概念或许你不太熟悉&#xff0c;但仪表盘你一定不陌生。 从汽车的仪表盘显示速度和油量&#xff0c;到运动手环仪表盘追踪步数和心率&#xff0c;再到金融投资仪表盘监控股票和基金的实时行情&#xff0c;它们通过…

Flink窗口分配器WindowAssigner

前言 Flink 数据流经过 keyBy 分组后&#xff0c;下一步就是 WindowAssigner。 WindowAssigner 定义了 stream 中的元素如何被分发到各个窗口&#xff0c;元素可以被分发到一个或多个窗口中&#xff0c;Flink 内置了常用的窗口分配器&#xff0c;包括&#xff1a;tumbling wi…

JAVA线程的多种状态

线程的状态图 new状态&#xff08;新建状态&#xff09;&#xff1a; 创建了一个线程的对象&#xff0c;但是这个线程没有启动start,那么此时这个线程的状态就是NEW也就是新建状态 此时线程对象就是一个普通的JAVA对象&#xff0c;CPU还没有给其分配资源 public class Main16 {…