封装/前线修饰符/Idea项目结构/package/impore

目录

1. 封装的情景引入

2. 封装的体现

3. 权限修饰符

 4. Idea 项目结构

5. package 关键字

6. import 关键字

7. 练习


程序设计:高内聚,低耦合;

高内聚:将类的内部操作“隐藏”起来,不需要外界干涉;

低耦合:将方法需要暴露的展示出来,以便于使用即可;

1. 封装的情景引入

体验封装的作用:

class FengZh{String name;//名字int age;//年龄int legs;//腿public void show(){System.out.println("name="+name+","+"age="+age+","+"legs="+legs);}
}
class FZD{public static void main(String[] args) {FengZh f = new FengZh();f.name = "团团";f.age = 1;f.legs = 3;//动物腿为 3 条,不符合逻辑f.show();}
}

 动物的腿为奇数或负数,不符合逻辑,于是我们通过调用方法进而限制 legs 的赋值;

//封装
class FengZh{String name;//名字int age;//年龄int legs;//腿public void show(){System.out.println("name="+name+","+"age="+age+","+"legs="+legs);}public void setLegs(int i){if(i >= 0 && i %2 ==0){legs = i;}else System.out.println("legs 赋值不正确");}
}
class FZD{public static void main(String[] args) {FengZh f = new FengZh();f.name = "团团";f.age = 1;f.legs = 3;//动物腿为 3 条,不符合逻辑f.setLegs(9);//通过调用方法进而限制 legs 的赋值;f.show();}
}

可是,我们仍然可以通过直接调用其属性对 “legs” 属性进行赋值;

class FZD{public static void main(String[] args) {FengZh f = new FengZh();f.name = "团团";f.age = 1;f.setLegs(9);//通过调用方法进而限制 legs 的赋值;f.legs = 3;//仍可以通过直接调用其属性对 “legs” 属性进行赋值;f.show();}
}
legs 赋值不正确
name=团团,age=1,legs=-4

我们仍然通过方法限制属性的赋值,以确保数据的安全性,另一方面,禁止对象直接调用属性进行赋值(声明对象时,加上 private 即可)

class FengZh{String name;//名字int age;//年龄private int legs;//加上权限修饰符public void show(){System.out.println("name="+name+","+"age="+age+","+"legs="+legs);}public void setLegs(int i){if(i >= 0 && i % 2 ==0){legs = i;}else System.out.println("legs 赋值不正确");}
}
class FZD{public static void main(String[] args) {FengZh f = new FengZh();f.name = "团团";f.age = 1;f.setLegs(9);//通过调用方法进而限制 legs 的赋值;f.legs = 3;//这里冒红会报错!!!f.show();}
}

 虽然我们通过一系列方法完成了对属性正确的赋值,但是我们却无法调用属性(如下,仍采用原先调用方法会报错);

 因此,仍需要增加一个方法专门调用属性值;

    public int getLegs( ){return legs;}
}

结合以上情景,可以发现:

当创建一个类后,可以使用类的对象通过“ 对象. 属性”的方式给对象的属性赋值,且赋值除数据类型外没有任何限制;但在实际问题中,还需要对属性的取值进行限制,因此需要添加方法来进行限制;为了避免通过“ 对象. 属性”的方式直接给对象的属性赋值而绕开增加的方法,在属性声明时必须增加权限修饰符“ private ”!

此时,对属性的操作实现了封装;

2. 封装的体现

以上案例中,我们将类的“ legs ”属性增加权限修饰符 private ,禁止通过 对象. 属性 的方式直接赋值和输出,于是又增加 set... 和 get... 方法对赋值进行限制和输出,这就是封装性的很好体现;

3. 权限修饰符

封装需要使用权限修饰符,因此有必要了解他们的作用范围;

4 种权限都可以用来修饰类的属性,方法,构造器,内部类

 

 4. Idea 项目结构

 Idea 的项目结构分为:项目(project),模块(mudle),包(package),类(class);

新建项目:

新建项目的模块;

新建项目模块的包:

包的命名一般为公司域名反写 + 包的作用;

新建项目模块包的类:

Idea 自动保存,自动编译,手动运行;

5. package 关键字

概述:为了便于管理项目中的多个类,提出 包 的概念;

作用:使用 package 在首行声明类或接口所属的包;

命名:package 的命名属于标识符,应遵循标识符命名规范(全小写);

6. import 关键字

作用:在源文件声明包与声明类之间显示使用 import 导入指定包下的类、接口;

使用:Idea 中会自动导包,多个包并列使用;

特殊情况:如果省略的是 java,lang 包与本包下的类或接口,可以省略不写;

若使用该包下的子包,仍需显式声明导包结构;

若 import static xxx:导入指定类或接口中的静态结构:属性,方法(了解即可);

若使用不同包下的同名类:

如下,

46 行用的是本包的类;

48 行用的是不同包下的同名类,只有实用其全类名(包名.类名)才可以继续使用:

 在实际使用中,可能会出现不同包下的类名相同,同时使用时,需要使用全类名的形式;

 

7. 练习

定义:Account 类。

属性:账号 id ,余额 balance ,年利率 interest;

方法:访问器方法(set/get方法),取款方法 withdow() , 存款方法 disposite( );

定义:Couster 类。

属性:firstName , lastName,Account;

方法:访问器方法(set/get方法);

定义测试类:CousterTest

创建 Customer,名称为:Jane Smith,账户为 1000,余额 2000 元,年利率 1.23% 的账户;

对 Jane Smith 存取操作操作 ;

//银行存取钱
class Account{
//    属性private int id;//账号private double balance;//余额private double interest;//利率
//    构造器public Account(){};public Account(int id,double balance,double interest){this.id = id;this.balance = balance;this.interest = interest;}
//    set/get方法public void setId(int id){this.id = id;}public int getId(){return id;}public void setBalance(double balance){this.balance = balance;}public double getBalance(){return balance;}public void setInterest(double interest){this.interest = interest;}public double getInterest(){return interest;}public void withdraw(double amount){//取钱if(amount > balance){System.out.println("余额不足,只剩下"+balance+"元");return;}balance -= amount;System.out.println("账户余额:"+balance);}public void deposit(double amount){//存钱if(amount > 0){balance += amount;System.out.println("" + "成功存入" + amount + ",\n" + "账户余额为:" + balance);}}
}class Customer{private String firstName;private String lastName;private Account account;public Customer(){}public Customer(String firstName,String lastName){this.firstName = firstName;this.lastName = lastName;}public void setFirstName(String firstName){this.firstName = firstName;}public String getFirstName(){return firstName;}public void setLastName(String lastName){this.lastName = lastName;}public String getLastName(){return lastName;}public void setAccount(Account account){this.account = account;}public Account getAccount(){return account;}
}class CustomerTest{public static void main(String[] args) {Customer c = new Customer("Jane","Smith");Account a = new Account(1000,2000.0,0.0123);c.setAccount(a);c.getAccount().deposit(100);c.getAccount().withdraw(3000);}
}

理解:

账户(a)是客户(c)的一个属性,但实质上也是一个类,自身也有属性和方法;

2013 - 2015:客户通过 set方法 将账户的成员赋到客户类中的账号属性中,进而通过 get 方法调用账户的属性和方法;

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

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

相关文章

【生物信息】如何使用 h5py 读取 HDF5 格式文件中的数据并将其转换为 NumPy 数组

data_mat h5py.File(args.data_file) x1 np.array(data_mat[X1]) x2 np.array(data_mat[X2]) if not args.no_labels: y np.array(data_mat[Y]) data_mat.close() 这段代码展示了如何使用 h5py 读取 HDF5 格式文件中的数据并将其转换为 NumPy 数组。以下是代码的详细解释&a…

计算机网络 (23)IP层转发分组的过程

一、IP层的基本功能 IP层(Internet Protocol Layer)是网络通信模型中的关键层,属于OSI模型的第三层,即网络层。它负责在不同网络之间传输数据包,实现网络间的互联。IP层的主要功能包括寻址、路由、分段和重组、错误检测…

【W800】UART 的使用与问题

1.开发环境 OS: Windows 11开发板:海凌科 HLK-W800-KIT-PROSDK: W80X_SDK_v1.00.10IDE: CSKY Development Kit 2.UART 使用 在 SDK 中创建文件 uart_test.h 和 uart_test.c,然后在 CDK 项目中添加这两个文件,CDK 会自动 include 头文件。 …

万界星空科技质量管理QMS系统具体功能介绍

一、什么是QMS系统,有什么价值? 1、QMS 系统即质量管理系统(Quality Management System)。 它是一套用于管理和控制企业产品或服务质量的集成化体系。 2、QMS 系统的价值主要体现在以下几个方面: 确保产品质量一致性…

【C++】B2099 矩阵交换行

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述题目描述输入格式输出格式输入输出样例输入 #1输出 #1 💯题目分析💯不同解法分析我的做法实现步骤:优点:不足&#…

Tableau数据可视化与仪表盘搭建-数据连接

目录 连接本地文件 课程操作 连接方式(实时/数据提取) 保存工作簿 筛选器 数据处理 连接数据有三种类型 第一种,连接到本地文件,例如Excel,csv,JSON等 第二种,连接到数据库,例…

Linux(Centos 7.6)命令详解:cd

1.命令作用 改变当前工作目录(change directory) 2.命令语法 Usage: cd [-L|[-P [-e]]] [dir] 3.参数详解 -L‌,当目标路径是符号链接时,强制使用符号链接,这是一个默认选项。-P‌,使用物理路径代替符号链接。-e‌&#xff0…

创建型模式-生成器模式

生成器模式是创建型模式的一种,生成器模式主要是解决在大类创建对象初始化的复杂的问题。将一个复杂类的创建拆分成几个部分,再根据具体需求创建初始对象,而不必每次都创建所有的部分。在需要创建包含有不同内容的对象的时候,可以…

系统日志优化---自定义springboot-starter日志组件供各个服务使用

在优化项目时发现各个微服务都有各自的接口调用日志逻辑,比如每个服务都定义一个aop类拦截,十分冗余,其实是可以做成starter被各个服务引用使用,前提要先了解一下springboot自动装配原理 创建springboot工程,如果是jdk…

Android V QCOM GPS | APN for LocationService

问题 在高通平台上验证 GPS 功能流程时候,block 在 APN 数据库的查询。经查,发现高通有内部实现的 LocationService(aosp源码和mtk都没有的类) 包含查询 TelephonyProvider 数据库的逻辑,直接原因是查询到 APN Protocol 不符合预期,直接fail。 关于 Android APN 数据列的…

计算机网络之---有线网络的传输介质

1. 双绞线(Twisted Pair Cable) 定义:双绞线是一种由两根绝缘铜线按一定螺旋方式绞合在一起的传输介质。常见的类型包括非屏蔽双绞线(UTP)和屏蔽双绞线(STP)。特点: UTP&#xff1a…

字玩FontPlayer开发笔记9 Tauri2打包应用

字玩FontPlayer开发笔记9 Tauri2打包应用 字玩FontPlayer是笔者开源的一款字体设计工具,使用Vue3 ElementUI开发,源代码:github | gitee 笔记 字玩目前是用Electron进行桌面端应用打包,但是性能体验不太好,一直想替…

spring mvc源码学习笔记之十

前面的文章介绍了用 WebApplicationInitializer 或者 AbstractAnnotationConfigDispatcherServletInitializer 来代替 web.xml 。 我们学 java web 的时候就知道,servlet 容器会自动加载 web.xml。 那么,疑问就来了,WebApplicationInitialize…

基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化

基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化 1. 输出关键信息的代码示例 日志记录方法 使用以下代码记录连接池的关键信息,帮助分析连接池的状态和性能瓶颈: import org.apache.commons.pool2.impl.GenericO…

小程序开发-页面事件之上拉触底实战案例

🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…

STM32-笔记38-I2C-oled实验

一、什么是I2C? I2C总线,全称Inter-Integrated Circuit(互连集成电路),是一种由Philips(现NXP半导体)公司在1980年代初开发的同步 串行 半双工通信总线。 二、有了串口通信为什么要使用I2C&…

《C++11》右值引用深度解析:性能优化的秘密武器

C11引入了一个新的概念——右值引用,这是一个相当深奥且重要的概念。为了理解右值引用,我们需要先理解左值和右值的概念,然后再理解左值引用和右值引用。本文将详细解析这些概念,并通过实例进行说明,以揭示右值引用如何…

libevent定时器的性能测试(与rte_timer对比)

前言 接着上篇文章,rte_timer的性能测试https://blog.csdn.net/jacicson1987/article/details/144997298 进行常用的libevent的定时器测试,看看有什么区别,测试方法还是一样,代码放在下面。 测试方法 100万个定时器&#xff0…

ios越狱脚本巨魔商店安装教程

使用爱思助手安装 安装爱思助手:在电脑上安装 iTunes 和爱思助手,并使用 Apple ID 登录2。 IPA 签名:打开爱思助手,选择工具箱中的 IPA 签名。点击添加 IPA 文件,选择下载的 TrollInstallerX.ipa 文件。选择使用 Apple…

MySQL Windows 11 的 MySQL 配置文件 (my.ini) 路径查找指南

✅ Windows 11 的 MySQL 配置文件 (my.ini) 路径查找指南 在 Windows 11 上,MySQL 的 ini 配置文件(通常是 my.ini 或 my.cnf)的位置取决于 MySQL 的安装方式。下面是一些常见的路径和方法来找到这个配置文件。 🔍 方法 1&#…