Java封装:面向对象的三大特性之一

news2025/1/17 5:59:59

在这里插入图片描述

  • 👑专栏内容:Java
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停

目录

  • 一、封装的概念
  • 二、访问修饰限定符
  • 三、包
    • 1、包的概念
    • 2、导入包中的类
    • 3、常见的包


嗨!前面我们简单的认识了一下什么是面向对象,以及类和对象的关系。

想象一下,假设我们的类就是一个房间,房间里面布置着各种装饰,这些装饰就好比是类中的方法,只能被房间的居住者使用。如果我们的房间没有四面墙来保护,那么房间内的一切都会暴露给外界。有了墙的保护,房间内的布局和装饰可以随意改变,而不会对外部产生影响。然而,如果只有墙而没有门窗,这个房子就失去了与外界互动的可能性,毫无价值。在Java中,这就是面向对象编程的三大特性之一——“封装”。让我们一同深入学习这个重要的概念。

在这里插入图片描述

一、封装的概念

面向对象程序三大特性:封装、继承、多态。

而类和对象阶段,主要研究的就是封装特性。何为封装呢?

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。再简单点来说就是套壳屏蔽细节

如果上面的例子,你没有看明白,那我就再举一个生活中的例子。相信大家都会玩电脑,那么又有多少人知道一台电脑是如何做出来的呢?

对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器,USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

对于电脑的使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此电脑厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可

在这里插入图片描述

二、访问修饰限定符

那如何进行封装呢?
在Java中,封装是通过访问控制符(publicprivateprotected)来实现的。

通常情况下,类的属性都应该使用private修饰符来限制外部访问,而方法则可以使用public修饰符来允许外部访问,从而实现对内部状态的保护和控制。

Java提供了四种主要的访问修饰符,分别是:

  1. Public(公共):

    • 修饰符:public
    • 表示成员对于所有类都是可见的。一个类的public成员可以被其他类访问。
  2. Private(私有):

    • 修饰符:private
    • 表示成员只能在定义它的类中访问。其他类无法直接访问这个类的private成员。
  3. Protected(受保护):

    • 修饰符:protected
    • 表示成员对于定义它的类及其子类是可见的。即使这个类在不同的包中,只要是它的子类就可以访问。
  4. Default(默认,无修饰符):

    • 默认情况下,没有修饰符的成员称为“包私有”或“默认访问级别”。
    • 表示成员只能在同一包内的其他类中访问。在不同包中的类无法访问。

梳理成表格就是如下:

修饰符类内部同一包子类外部包
public
private
protected
默认(无修饰)
  • “✔” 表示有权访问。“✘” 表示无权访问。

在这里插入图片描述
说明

  • protected主要是在继承中使用

  • 默认权限指:什么都不写时的权限

  • 访问权限除了可以限定类中成员的可见性,也可以控制类的可见性

三、包

1、包的概念

在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包

在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式。比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可

简单来说,包就像是一个文件夹,里面存放着相关的Java类。这样,当项目变得庞大时,你可以更轻松地管理和组织你的代码,防止不同类之间的名字发生冲突,使得整个项目结构更加清晰。

2、导入包中的类

Java 中已经提供了很多现成的类供我们使用.

例如Date类:可以使用 java.util.Date 导入 java.util 这个包中的 Date类

public class Test {
    public static void main(String[] args) {
    java.util.Date date = new java.util.Date();
    // 得到一个毫秒级别的时间戳
    System.out.println(date.getTime());
	}
}

但是这种写法比较麻烦一些, 可以使用 import语句导入包

import java.util.Date;
public class Test {
    public static void main(String[] args) {
    Date date = new Date();
    // 得到一个毫秒级别的时间戳
    System.out.println(date.getTime());
    }
}

如果需要使用 java.util 中的其他类, 可以使用 import java.util.*

import java.util.*;		// .*相当于一个通配符,可以充当任何类
public class Test {
    public static void main(String[] args) {
    Date date = new Date();
    // 得到一个毫秒级别的时间戳
    System.out.println(date.getTime());
    }
}

但是更建议显式的指定要导入的类名,否则还是容易出现冲突的情况

import java.util.*;
import java.sql.*;
public class Test {
    public static void main(String[] args) {
    // util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错
    Date date = new Date();
    System.out.println(date.getTime());
    }
    }
// 编译出错
Error:(5, 9) java:Date的引用不明确
java.sql 中的类 java.sql.Date 和 java.util 中的类 java.util.Date 都匹配

在上面这种情况下,则需要使用完整的类名

import java.util.*;
import java.sql.*;
public class Test {
    public static void main(String[] args) {
    java.util.Date date = new java.util.Date();
    System.out.println(date.getTime());
    }
}

可以使用import static导入包中静态的方法和字段。

import static java.lang.Math.*;
public class Test {
    public static void main(String[] args) {
    double x = 30;
    double y = 40;
    // 静态导入的方式写起来更方便一些.
    // double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
    double result = sqrt(pow(x, 2) + pow(y, 2));
    System.out.println(result);
    }
}

注意事项:

  • import 和 C++ 的 #include 差别很大, C++ 必须 #include 来引入其他文件内容, 但是 Java 不需要

  • import 只是为了写代码的时候更方便, import 更类似于 C++ 的 namespaceusing

3、常见的包

  • java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。

  • java.lang.reflflect:java 反射编程包;

  • java.net:进行网络编程开发包。

  • java.sql:进行数据库开发的支持包。

  • java.util:是java提供的工具程序包。(集合类等) 非常重要

  • java.io:I/O编程开发包。

在这里插入图片描述


今天封装就先说到这里了,下一篇我们继续学习面向对象的其他特性。下次再见哦~

在这里插入图片描述

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

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

相关文章

vite+vue3.0 + TypeScript+element-plus环境搭建

1、环境要求:node版本16以上 2、搭建vite项目 npm create vitelatest cmd运行下面命令 cd vite-project npm install npm run dev 谷歌浏览器访问http://127.0.0.1:5173/ 查看效果 3、安装element-plus组件 npm运行以下命令进行安装element-plus npm install elem…

汽车屏类产品(二):360全景环视(SVC)、多分割显示、行车记录

前言 随着新能源汽车的快速发展,带动了车载器件的大发展,大的比如域控,小的创新更是不断涌现。而车载显示屏可以说是一大类产品,产品形态也是愈发多样化,比如:仪表cluster、中控IVI、副驾屏、行车记录仪、流媒体后视镜、透明A柱屏、方向盘屏(替代方向盘按键)、门饰板显…

基因组的Phasing原理

1.Phasing的概念 Phasing,或者说Genotype Phasing,它的中文名有很多:基因定相、基因分型、单倍体分型、单倍体构建等在不同的语境下都有人说过。但不管如何,所谓Phasing就是要把一个二倍体(甚至是多倍体)基…

Vue 网络处理 - axios 异步请求的使用,请求响应拦截器(最佳实践)

目录 一、axiox 1.1、axios 简介 1.2、axios 基本使用 1.2.1、下载核心 js 文件. 1.2.2、发送 GET 异步请求 1.2.3、发送 POST 异步请求 1.2.4、发送 GET、POST 请求最佳实践 1.3、请求响应拦截器 1.3.1、拦截器解释 1.3.2、请求拦截器的使用 1.3.3、响应拦截器的使…

配电房智能化改造在加油站等的应用

随着科技的发展和智能化趋势的推进,对加油站配电房进行智能化改造成为了一个必然的选择。智能化改造不仅可以提高加油站的工作效率,减少事故发生率,还可以实现能源的合理利用,提高经济效益。 力安科技加油站智能化改造升级是一种高…

深度学习——卷积神经网络(CNN)基础三

深度学习——卷积神经网络(CNN)基础三 文章目录 前言五、汇聚层(池化层)5.1. 最大池化和平均池化5.2. 填充和步幅5.3. 多个通道5.3. 小结 六、卷积神经网络(LeNet)6.1. LeNet6.2. 模型训练6.3. 小结 总结 前…

Centos7 安装 MySQL5.7 步骤

Centos7 安装 MySQL5.7 步骤 前言:一 .使用yum源方式安装1、卸载系统自带 mariadb查看并卸载系统自带的 Mariadb 2、下载并安装MySQL官方的 Yum2.1 下载mysql的yum源配置2.2 安装mysql的yum源2.3 使用yum方式安装mysql2.3.1 安装过程中报错解决问题描述解决方案 3、…

JTS-通过Coordinate点截断几何Geometry

背景 通过一堆点,线上的点或者靠近线的点,来截取线段,将线段截取成多段 代码片段 /*** 通过点截取线,点可以是线上的形状点也可以是靠近线的点** 线 ------------------------------------------* 点 . . . …

YOLO目标检测——复杂场景人员数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用:安防监控、人群管理、自动驾驶、城市规划、人机交互等等数据集说明:YOLO目标检测数据集,真实场景的高质量图片数据,数据场景丰富。使用lableimg标注软件标注,标注框质量高,含voc(xml)、coco(j…

C++模版初阶讲解

今日为大家分享C的模版,这里先把模版的初阶讲解一下,以后再讲解模版进阶! 前言:模版的引入 在我们进行学习的编程中,常常会有许多函数的功能相同,有些不同点可能就是其中的数据类型不同!如果我…

Jmeter连接Mysql数据库

一.下载mysql数据驱动 https://dev.mysql.com/downloads/connector/j/ 二、在Jmeter测试计划中添加驱动包 三、jmeter添加配置元件:JDBC Connection Configuration 四、Jmeter发送JDBC请求 五、提取mysql查询结果

工业交换机的应用场景

在选择工业交换机的时候,很多人会疑惑自己的场景是否适用工业交换机,工业交换机广泛应用于以下场景,大家可以参考了解 1. 工业自动化:工业交换机用于连接各种工业设备,如PLC(可编程逻辑控制器)、…

【探索C++】三大特性以及类和对象(包括类的特殊函数成员)

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮&#xff0…

遇到的问题总结

1、在实验室服务器里运行新项目的时候遇到 conda activate pytorch3_7(我的环境名字) conda install -c anaconda tensorboard (失败 一直堵在"Solving environment" ) pip install tensorboard

VS使用Visual Assist添加代码说明信息

写代码时,我们一般需要在代码的最前面添加一些说明信息,作者的联系方式等等。一些高级的 IDE 工具提供修改代码模板的功能,这样就能够在创建新代码时自动加上版权信息。Visual Studio 虽然没有提供这样的操作界面,但是我们可以通过…

Cron表达式每周三周五18点执行

Cron表达式每周三周五18点执行 0 0 18 ? * WED,FRI验证正确性:

C# Winform编程(5)菜单栏和工具栏

菜单和菜单组件 添加菜单编辑菜单菜单栏和工具栏 添加菜单 将MenuStrip控件拖拽到Form窗体顶部添加菜单 编辑菜单 添加菜单项,编辑菜单属性等功能。 右键单击已添加的菜单项可以弹出右键菜单: 可以设置菜单图标,使能菜单,显示…

[Python中常用的回归模型算法大全:从线性回归到XGBoost]

文章目录 概要保序回归:理论与实践多项式回归:探索数据曲线关系多输出回归的示例 概要 在数据科学和机器学习领域,回归分析是一项关键任务,用于预测连续型变量的数值。除了传统的线性回归模型外,Python提供了丰富多样…

每周电子W4——电路与电路模型

文章目录 每周电子W4——电路与电路模型电路电路模型电流和电压的参考方向电流的参考方向电压的参考方向 电功率 每周电子W4——电路与电路模型 电路 实际电路:由电工设备和电气器件按预期目的连接构成的电流的通路。 为完成某种预期的目的而设计、安装、运行的&a…

latex:表格水平宽度调整

解决方案 结果如下: 源代码如下: \documentclass{article} % \usepackage[utf8]{ctex} \usepackage{multirow} \usepackage{graphicx} \usepackage{booktabs} \usepackage{caption}\begin{document}\captionsetup{font{large}}\begin{table}[] \centeri…