Java之封装

news2024/11/13 15:08:20

文章目录

  • 1.封装
    • 1.1 什么是封装
    • 1.2 访问限定符
    • 1.3 包
      • 1.3.1 什么是包
      • 1.3.2 导包
      • 1.3.3 自定义包
  • 2. static
    • 2.1 static 修饰成员变量
    • 2.2 static 修饰成员方法
    • 2.3 static成员变量初始化
  • 3. 代码快
    • 3.1 普通代码块
    • 3.2 实例代码块
    • 3.3 静态代码块
  • 4. 对象的打印

1.封装

1.1 什么是封装

在Java中,面向对象程序三大特性:封装、继承、多态,而封装就是将对象的状态(数据)和行为(方法)打包在一起,并隐藏对象的内部实现细节,只提供公开的接口(getter和setter方法)来与对象进行交互。

1.2 访问限定符

在Java中,主要通过类和访问权限来实现封装,访问限定符用于控制类、变量、方法或其他引用对象的访问级别。Java支持四种访问限定符
在这里插入图片描述

  1. private:私有访问级别。只对定义它的类可见。
  2. default:默认访问级别,同一个包中的类可见。当类没有定义访问限定符时,此时默认访问级别为default。
  3. protected:保护访问级别。对于同一包中的类及其子类是可见的。(介于public和private之间)
  4. public:公共访问级别。对于同一包中的所有类都是可见的。

一般情况下,我们建议:

  1. 成员变量定义为private
  2. 成员方法定义为public

建议不唯一,根据具体场景来使用。

在这里插入图片描述

1.3 包

1.3.1 什么是包

包其实就是一个文件夹,为了更好的管理,我们将类划分,把多个类收集成一组,就是一个包。

例如:我们将D盘中的文件划分,将Java语言相关的文件放到Java包中,将C语言相关的文件放到C语言包中,将下载的软件放到app这个包中……

在Java中,包是一种用来组织和管理类和接口的机制。它为开发者提供了一种逻辑分组的方式,使得代码更加模块化、结构化和易于管理。

1.3.2 导包

Java中提供了许多现成的类供我们使用,例如Date类,可以使用 java.util.Date 导入 java.util 这个包中的 Date
类。

例如:
在这里插入图片描述
在IDEA中会自动导入包,如果使用其他环境,可以去设置。

当我们需要用到 java.util 中的其他类时,可以使用 java.util.*
在这里插入图片描述

1.3.3 自定义包

  1. 包名和代码路径匹配,例如创建一个 com.bit.demo1 的包,那么它对应的路径就是 com/bit/demo1
  2. 包名尽量指定成唯一的名字(公司通常会将公司的域名的颠倒的形式来命名包)
  3. 当我们创建一个Java文件时,最上面的package语句就是,改java文件放到了哪个包中
  4. 如果一个类没有package语句,该类被放到默认包中。

例如,我们创建一个名为 com.bit.demo1 的包

自定义包的步骤:

  1. 右键src -> new -> package
    在这里插入图片描述

  2. 输入包名
    在这里插入图片描述
    在这里插入图片描述

  3. 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了
    在这里插入图片描述

  4. 新建一个java类,我们可以看到顶部出现package语句
    在这里插入图片描述

  5. 如果出现 2 步骤所示的图片,可以更改设置
    在这里插入图片描述
    包教会的
    在这里插入图片描述

2. static

2.1 static 修饰成员变量

static修饰的成员变量,称为静态成员变量
静态成员变量,不属于某个具体的对象,而是所有对象共享的

静态成员变量的特征

  1. 又称为静态属性,不属于某个具体的对象,是类的属性,所有对象共享的
  2. 静态成员变量即可以通过类名直接访问,又可以通过对象访问,但是推荐使用类名来访问,因为这样可以更清楚地表明它是属于类而不是某个对象的。
  3. 存储在方法区。
  4. 生命周期随着类的加载而创建,随着类的卸载而销毁
public class Student {
    public int id;
    public String name;
    public int age;
    public String sex;
    public static String classRoom = "计科一班";

    public Student() {
    }

    public Student(int id, String name, int age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
}

public class Test1 {
    public static void main(String[] args) {
        //可以直接通用类名访问
        System.out.println(Student.classRoom);

        //也可以通过对象访问,但是不建议,这种方法合法不合理
        Student student = new Student(1,"zhangsan",12,"男");
        System.out.println(student.classRoom);
    }
}

在Student类中,成员变量 classRoom 被 static 修饰 ,此时,这个成员变量就不属于这个对象了,所以用类名访问 classRoom

2.2 static 修饰成员方法

在封装中,一般情况下类的成员变量都设置为 private ,而成员方法设置为 public ,当成员变量 classRoom 被设置为 private 后,我们在其他类应该如何访问呢?

在Java中,被 static 修饰的成员方法被称为静态成员方法,是类的方法,而不是某个对象特有的

静态成员变量一般通过静态成员方法来访问

public class Student {
    private static String classRoom = "计科一班";

    public static String getClassRoom(){
        return classRoom;
    }
}


import com.bit.demo1.Student;

public class StudentTest {
    public static void main(String[] args) {
        System.out.println(Student.getClassRoom());
    }
}

与静态成员变量一样,通过类名调用,不推荐使用对象调用。

注意

  1. 静态方法不需要对象调用,所以不能传递 this
  2. 静态方法中不能调用任何非静态成员变量
public class Student {
    private int age;
    private static String classRoom = "计科一班";

    public static String getClassRoom(){
        age = age + 1;
        return classRoom;
    }
}

public class StudentTest {
    public static void main(String[] args) {
        System.out.println(Student.getClassRoom());
    }
}

运行结果:
在这里插入图片描述

  1. 静态方法中不能调用任何非静态方法(因为非静态方法中有 this 参数)
public class Student {
    private int age;
    private static String classRoom = "计科一班";

    public int getAge(){
        return age;
    }

    public static String getClassRoom(){
        age = age + 1;
        return classRoom;
    }
}


public class StudentTest {
    public static void main(String[] args) {
        System.out.println(Student.getAge());
    }
}

运行结果:
在这里插入图片描述

  1. 可以在非静态成员方法中调用静态方法

2.3 static成员变量初始化

静态成员变量一般不会在构造方法中初始化。

静态成员变量的初始化分为两种,分别为:就地初始化静态代码块初始化

  1. 就地初始化:在定义该静态成员变量时就进行初始化。
  2. 静态代码块初始化:等下面理解什么是代码块再进行讲解

好多东西啊,真是烦躁,感觉有人在念紧箍咒
在这里插入图片描述

3. 代码快

3.1 普通代码块

普通代码块,即定义在方法中的代码块。

public class Test1 {
    public static void main(String[] args) {
        {
            int a = 1;
            System.out.println("a = " + a);
        }
        int b = 2;
        System.out.println("b = " + b);
    }
}

//运行结果
a = 1
b = 2

这种用法不常见

你小子,肯定又不记了
在这里插入图片描述

3.2 实例代码块

实例代码块又叫构造代码快,一般用在初始化实例成员变量。
例如:

public class Student {
    private String name;
    private int age;
    private String sex;
    public static String classRoom = "计科一班";
	
	public Student(){
        System.out.println("不带参数的构造方法");
    }
    
    {
        System.out.println("实例代码块");
        this.name = "zhangsan";
    }

    public void show() {
        System.out.println("name = " + name + " age = " + age + " sex = " + sex + " claasRoom = " + classRoom);
    }
}

public class Test1 {
    public static void main(String[] args) {
        Student student = new Student();
        student.show();
    }
}

//运行结果
实例代码块
不带参数的构造方法
name = zhangsan age = 0 sex = null claasRoom = 计科一班

根据执行结果我们可以知道,实例代码块的执行顺序优先于构造方法。

3.3 静态代码块

静态代码快,即被static定义的代码块,一般用于初始化静态成员变量

例如:我们将上述代码改动一下

public class Student {
    private String name;
    private int age;
    private String sex;
    public static String classRoom;

    public Student(){
        System.out.println("不带参数的构造方法");
    }

    {
        System.out.println("实例代码块");
        this.name = "zhangsan";
    }

    static{
        System.out.println("静态代码块");
        classRoom = "计科一班";
    }

    public void show() {
        System.out.println("name = " + name + " age = " + age + " sex = " + sex + " claasRoom = " + classRoom);
    }
}

public class Test1 {
    public static void main(String[] args) {
        Student student1 = new Student();
        System.out.println("===========");
        Student student2 = new Student();
    }
}

//执行结果
静态代码块
实例代码块
不带参数的构造方法
===========
实例代码块
不带参数的构造方法

根据执行结果我们得到结论,静态代码块优先被执行,其次是实例代码块,最后是不带参数的构造方法。
上述代码中我们new了两个Student对象,但是执行结果中只出现了一次静态代码快,所以静态代码块只执行一次

注意

  1. 静态代码块只执行一次
  2. 如果一个类中定义了多个静态代码快,在编译时,编译器会按照定义的先后顺序来执行
  3. 静态成员变量是类的属性,所以是在JVM加载类的时候开辟空间并初始化的
  4. 实例代码块只有在创建对象的时候才会执行,构造方法也是。

这个一定要记住
在这里插入图片描述

4. 对象的打印

public class Student {
    private String name;
    private int age;
    private String sex;
    public static String classRoom;

    public Student() {
    }

    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

}

public class Test1 {
    public static void main(String[] args) {
        Student student1 = new Student("zhangsan",12,"男");
        System.out.println(student1);
    }
}

当我们直接打印对象时,执行结果为
在这里插入图片描述
这个结果的结构为:类所在的包名.类名 + @ + 哈希码值

并不是我们想要实现的打印,如果想要实现打印,我们可以直接调用java自带的 toString 方法(快捷键Alt + Insert ,点击toString 即可),也可以重写toString 方法

public class Student {
    private String name;
    private int age;
    private String sex;
    public static String classRoom = "计科一班";

    public Student() {
    }

    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Override
    public String toString(){
        return "[" + name + "," + age + "," + sex + "," + classRoom + "]";
    }
}

public class Test1 {
    public static void main(String[] args) {
        Student student1 = new Student("zhangsan",12,"男");
        System.out.println(student1);
    }
}

//执行结果
[zhangsan,12,,计科一班]

如果想要了解这个部分的详细内容,我发现了一个博主的博客link
,我认为讲的很详细,点击进去就可以了
在这里插入图片描述
觉得我写的博客对你有用,给我点个赞,嘻嘻
在这里插入图片描述

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

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

相关文章

【JPCS出版】第四届电气工程与计算机技术国际学术会议(ICEECT 2024,9月27-29)

会议信息 会议官网:www.iceect.com 2024 4th International Conference on Electrical Engineering and Computer Technologywww.iceect.com 时间地点:2024年9月27日-29日 | 线上(ZOOM) 最终截稿时间:9月23日 主办…

【GVINS】

【GVINS】 1. GVINS的系统特点2. GVINS的融合导航存在问题3. GVINS的信号的组成4. GVINS的信号的组成 原理推导知乎 1. GVINS的系统特点 概述了一种名为GVINS的系统,它旨在解决视觉-惯性里程计(VIO)在长时间运行时出现的漂移问题。GVINS通过…

neo4j导入csv数据

neo4j数据可视化实践 手动输入数据 - 官方democsv数据导入准备数据数据处理导入步骤① 导入疾病表格② 导入药物表格③导入疾病-药物关系表格 爬虫的csv文件 手动输入数据 - 官方demo 点击之后,按照左边10张图中的代码,复制粘贴熟悉语法 效果如下 csv数据…

(undone) 学习语音学中关于 i-vector 和 x-vector

来源:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber8461375 (这是一篇跟 X-vector 有关的论文) 这里有更适合初学者的两个资料: 1.https://www.youtube.com/watch?vR3rzN6JYm38 (MIT教授的youtube视频) 2.https://people.c…

JavaScript高级——组合继承

1、借用构造函数继承(假的) (1)套路: ① 定义父类型构造函数 ② 定义子类型构造函数 ③ 在子类型构造函数中调用父类型构造 (2)关键:在子类型构造函数中通用 call(&…

VS2019配置C++版本的GDAL

VS2019配置GDAL教程 【特别注意】 vs2019编译好的GDAL库是可以在VS2022上面使用的,我这边做项目已经测试过没有问题,所以vs2022使用vs2019编译的gdal没有问题。 【编译版本介绍】 由于GDAL在vs2019源码流程有点复杂,因此我们在这不做讲解…

CSP-J2024年全真模拟题 阅读程序篇2

因为明天考试,这回给大家准备了超详细的解析~ 22.程序中 n 和 m 只有输入正整数,程序的输出值才可能是 YES A.对B.错 23.程序中用到了递归函数 bool fun(int n) A.对B.错 24.若输入 n 和 m 都是素数,程序的输出值…

vue MVC设计模式与MVVM设计模式

使用Vue框架开发前端项目,最大的优势就是再也不用进行复杂的DOM操作了,我们只要关心数据的变化即可,Vue框架会帮我们把复杂的DOM进行渲染,这背后都要归功于他的设计思想,即MVVM设计模式。 了解MVVM设计模式之前,有必要先了解一下MVC设计模式,MVVM模式是在MVC模式基础上…

【博弈论 斐波那契博弈】 HRPA

HRPA 这道题就是一个斐波那契博弈的经典模型: 有一堆个数为n的石子,第一个人第一次不能全部取完,每次一个人取石子的个数都应当大于0,且小于等于上一个人取的石子个数的两倍。 问是否有先手必胜策略。 如果有,第一个人…

分享一个通用OCR模型GOT-OCR2.0

通用OCR模型GOT-OCR2.0 在信息化快速发展的今天,光学字符识别(OCR)技术的应用越来越广泛。从文档数字化到自动化数据录入,OCR技术都发挥着重要作用。今天,我将为大家介绍一个开源的通用OCR模型——GOT-OCR2.0。 软件…

手把手教你-MAC虚拟环境搭建TensorFlow开发环境

参考如下代码布置,直接运行,即可: 1) 安装virtualenv $ sudo pip install virtualenv 2)创建虚拟环境文件夹 $ virtualenv --system-site-packages -p python2.7 ./EnvPy27 3) 激活环境 $ source EnvPy27/bin/activate 4) 更新pip $ pi…

【动态规划】最大正方形

最大正方形(难度:中等) 该题对应力扣网址 思路 min_valuemin({dp[i-1][j-1],dp[i-1][j],dp[i][j-1]}) dp[i][j]min_value 关键点是正方形的右下角(n>1时),通过画图,可以看出,在基础正方形22中&#x…

安卓13长按电源按键直接关机 andriod13不显示关机对话框直接关机

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 有些设备需要在长按电源键的时候,直接关机。不需要弹出对话框进行询问。 2.问题分析 过滤电源按键,需要在系统里面处理的话,那么我们需要熟悉android的事件分发,然后再…

Unsupervised Deep Representation Learning for Real-Time Tracking

摘要 我们的无监督学习的动机是稳健的跟踪器应该在双向跟踪中有效。具体来说,跟踪器能够在连续帧中前向定位目标对象,并回溯到其在第一帧中的初始位置。基于这样的动机,在训练过程中,我们测量前向和后向轨迹之间的一致性&#xf…

【专题】2024年9月直播、短视频行业报告合集汇总PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p37744 在信息时代的浪潮下,直播短视频行业以其独特的魅力和强大的影响力,迅速成为了大众娱乐、信息传播以及商业营销的重要领域。从微短剧的异军突起,到 TikTok 在海外市场的蓬勃发展;…

音视频入门基础:AAC专题(3)——AAC的ADTS格式简介

音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…

OpenSSH从7.4升级到9.8的过程 亲测--图文详解

一、下载软件 下载openssh 下载地址: Downloads | Library 下载openssl Index of /pub/OpenBSD/OpenSSH/ zlib Home Site 安装的 openssl-3.3.1.tar.gz ,安装3.3.2有问题 安装有问题, 二、安装依赖 yum install -y perl-CPAN perl-ExtUtils-CB…

stm32f411ceu6芯片学习

首先找到对应芯片的数据手册,硬件电路设计参考的是Electrical characteristics这一节,芯片的每一个引脚都会有推荐的电路接线。 基本每个芯片,都可以在数据手册中找到厂家提供的参考电路图,这就是绘制芯片的原理图最基本的依据。 …

【小白向】Google Play日区如何支付?Google Play日区怎么转?Google Play日区账号支付教程

1.引言 在移动应用和游戏的世界里,Google Play(谷歌Play商店)日区一直是许多用户的向往之地。日本作为全球第三大应用市场,拥有大量优质且独特的应用和游戏。本教程将为你详细介绍如何在Google Play商店进行日区支付、Google Pla…

mat工具的几个实用地方

背景 使用mat的过程中,有几个值得关注的注意点,可以帮助我们尽快查找到问题的答案 mat实用的注意点 一.打开直方图后排序,直观查看内存占用大小,如下图所示 二.查看某个对象实例的具体值,点击对象,点击List Object…