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

news2025/1/8 6:40:04

目录

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.coloradmin.cn/o/2272481.html

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

相关文章

【代码随想录】刷题记录(89)-分发糖果

题目描述: n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0…

Ae:合成设置 - 3D 渲染器

Ae菜单:合成/合成设置 Composition/Composition Settings 快捷键:Ctrl K After Effects “合成设置”对话框中的3D 渲染器 3D Renderer选项卡用于选择和配置合成的 3D 渲染器类型,所选渲染器决定了合成中的 3D 图层可以使用的功能&#xff0…

掌握RabbitMQ:全面知识点汇总与实践指南

前言 RabbitMQ 是基于 AMQP 高级消息队列协议的消息队列技术。 特点:它通过发布/订阅模型,实现了服务间的高度解耦。因为消费者不需要确保提供者的存在。 作用:服务间异步通信;顺序消费;定时任务;请求削…

react构建项目报错 `npm install --no-audit --save @testing-l

这应该是我们想构建 react18 的项目,但是 通过 npx create-react-app my-app进行构建时,给我们安装的依赖是 react 19 下面提供一下我的解决方法: 第一步:在 package.json 中把依赖 react19 改为 react 18 第二步:添…

App窗口创建流程(Android12 )

有关的窗口对象 PhoneWindowActivityThread#performLaunchActivity {Activity.attach}Surface new ViewRootImpl 创建null对象mSurface.transferFrom(getOrCreateBLASTSurface())//填充内容创建native层的SurfaceLayerSurfaceFlinger::createLayerRenderSurfaceSurfaceFlinger…

LLM之Agent(十三)| 使用 PydanticAI 框架构建多代理LLM 系统(保姆教程)

Pydantic 是 Python 生态系统中的强大平台,每月下载量超过 2.85 亿次。现在,Pydantic的创始人也正在通过 Pydantic AI 涉足 AI 的前沿领域,Pydantic AI 是一个专为构建由生成式 AI 提供支持的生产级应用程序的框架。在本文中,我们将深入探讨 Pydantic AI 的独特之处、它的主…

常用的数据结构API概览

List ArrayList 1、在初始化一个ArrayList的时候&#xff0c;如果我想同时set一些值 比如存放int[ ] List<int[]> list new ArrayList(Arrays.asList(new int[]{intervals[0][0],intervals[0][1]}));//或者int[] temp new int[]{intervals[0][0],intervals[0][1]}…

年会游戏大全 完整版见考试宝

企业年会游戏大全&#xff08;35个&#xff09; 1.泡泡糖 游戏准备&#xff1a;主持人召集若干人上台&#xff0c;人数最好是奇数。 游戏规则&#xff1a;当大家准备好时&#xff0c;主持人喊“泡泡糖”大家要回应“粘什么”&#xff0c;主持人随机想到身体的某个部位&#x…

用豆包去除文章Ai味和重复率,实操教程

用AI生成的文章总是有“AI味”或者重复率高的问题&#xff1f; 今天就教你如何使用豆包轻松去除这些问题 让你的文章更自然、更具个人风格&#xff01;✍️✨ 详细版指令教程都整理了&#xff0c;纯粹F享啦~

【论文复现】改进麻雀搜索算法优化冷水机组的最优负载调配问题

目录 1.摘要2.麻雀搜索算法SSA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 为了应对暖通空调&#xff08;HVAC&#xff09;系统由于不当负荷分配导致的高能源消耗问题&#xff0c;本文提出了一种改进麻雀搜索算法&#xff08;ISSA&#xff09;。ISSA算法旨在在满足负…

分布式ID生成-雪花算法实现无状态

雪花算法这里不再赘述&#xff0c;其缺点是有状态&#xff08;多副本隔离时&#xff0c;依赖手动配置workId和datacenterId&#xff09;&#xff0c;代码如下&#xff1a; /*** 雪花算法ID生成器*/ public class SnowflakeIdWorker {/*** 开始时间截 (2017-01-01)*/private st…

四、对象图

对象图 、对象图概述 含义&#xff1a; 对象图显示了某一时刻的一组对象及它们之间的关系。 作用&#xff1a; 对象图可以看做是类图的实例&#xff0c;用来表达各个对象在某一时刻的状态。 组成&#xff1a; 对象图中的建模元素主要有对象和链&#xff0c;对象是类的实…

2025/1/4期末复习 密码学 按老师指点大纲复习

我们都要坚信&#xff0c;道路越是曲折&#xff0c;前途越是光明。 --------------------------------------------------------------------------------------------------------------------------------- 现代密码学 第五版 杨波 第一章 引言 1.1三大主动攻击 1.中断…

【已解决】Django连接mysql报错Did you install mysqlclient?

解决报错&#xff1a;from err django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module. Did you install mysqlclient&#xff1f; 在终端执行python manage.py makemigrations报错问题汇总 错误1&#xff1a;已安装mysqlclient&#xff0c;提示Did yo…

【C语言】可移植性陷阱与缺陷(七): 除法运算时发生的截断

在C语言编程中&#xff0c;除法运算可能会引发一些与可移植性相关的问题&#xff0c;特别是当涉及到整数除法时发生的截断&#xff08;truncation&#xff09;。不同平台对于整数除法的行为和处理方式可能会有所不同&#xff0c;这可能导致代码在不同编译器或硬件平台上的行为不…

有限元分析学习——Anasys Workbanch第一阶段笔记(7)对称问题预备水杯案例分析

目录 1 序言 2 水杯案例 2.1 添加新材料 2.2 水压设置 2.3 约束边界条件设置及其结果 2.3.1 全约束固定(压缩桌面、Fixed support固定水杯底面) 2.3.2 单方面位移约束(压缩桌面、Displacement约束软弹簧) 2.3.3 接触约束(不压缩桌面、Fixed support 固定桌面、Frictional…

Spring Boot(4)使用 IDEA 搭建 Spring Boot+MyBatis 项目全流程实战

文章目录 一、⚡搞个引言二、⚡开始搭建 Spring Boot 项目吧&#xff01;2.1 启动 IDEA 并创建新项目2.2 选择项目依赖2.3 完成项目创建 三、&#x1f4d8;项目结构剖析四、✍配置数据库连接五、✍ 创建 MyBatis 相关组件5.1 实体类&#xff08;Entity&#xff09;5.2 Mapper 接…

[服务器][教程]Ubuntu24.04 Server开机自动挂载硬盘教程

1. 查看硬盘ID ls -l /dev/disk/by-uuid可以看到对应的UUID所对应的分区 2. 创建挂载文件夹 创建好文件夹即可 3. 修改配置文件 sudo vim /etc/fstab把对应的UUID和创建的挂载目录对应即可 其中# Personal mount points下面的是自己新添加的 &#xff1a;分区定位&#xff…

抢先体验:人大金仓数据库管理系统KingbaseES V9 最新版本 CentOS 7.9 部署体验

一、简介 KingbaseES 是中国人大金仓信息技术股份有限公司自主研发的一款通用关系型数据库管理系统&#xff08;RDBMS&#xff09;。 作为国产数据库的杰出代表&#xff0c;它专为中国市场设计&#xff0c;广泛应用于政府、金融、能源、电信等关键行业&#xff0c;以高安全性…

家教老师预约平台小程序系统开发方案

家教老师预约平台小程序系统将连接学生/家长与家教老师&#xff0c;提供一站式的家教服务预约体验。 一、用户需求分析1、家教老师&#xff1a;希望获得更多的学生资源&#xff0c;通过平台展示自己的教学特长和经验&#xff0c;管理个人日程&#xff0c;接收并确认预约请求&a…