【Java基础篇 | 面向对象】—— 封装详解

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【JavaSE_primary】
本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区讨论💌
在这里插入图片描述

目录

  • 一、封装
    • 1.1什么是封装
    • 1.2访问修饰符
  • 二、封装拓展之包
    • 2.1包的概念
    • 2.2导入包中的类
    • 2.3自定义包
  • 三、static成员
    • 3.1static修饰成员变量
    • 3.2静态成员方法的访问
    • 3.3static成员变量的初始化
  • 四、代码块

一、封装

1.1什么是封装

封装概念将数据和对数据的操作封装在一个类中,对外部的访问只通过类提供的接口进行。

封装目的隐藏类的内部实现细节,只公开必要的方法来操作数据,避免数据被外部直接访问和修改,从而提高代码的安全性和可维护性。

那java是如何控制对数据的访问权限呢,答案是访问修饰符。通过访问修饰符,可以控制对数据的访问权限,以确保代码的安全性和封装性。

1.2访问修饰符

java中主要有以下四种访问修饰符:
加粗样式在这里插入图片描述

  • public:公共访问修饰符,可以被任何其他类或代码访问。
  • protected:受保护的访问修饰符,可以被同一包内的类、子类以及其他包中的子类访问。
  • default(默认):没有显式指定访问修饰符时,默认的访问修饰符,可以被同一包中的类访问。
  • private:私有访问修饰符,只能被所属类的内部访问。

二、封装拓展之包

2.1包的概念

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

2.2导入包中的类

在Java中,你可以使用import关键字来导入其他包中的类。导入包中的类可以让你在当前文件中直接使用这些类而无需使用完整的包名来引用它们。

比如,我们想要导入java.util包中的Date类。即import java.util.Date

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

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

需要注意的是:import java.util.*中的*代表导入‘java.util’包下的所有类,从而使所有类都可以在代码中直接使用。同时这里并不是一次性把java.util包下的所有类都导入进来,而是用到哪个类才导入哪个类(即用到谁导入谁)。

并不是只有 java.util包才有Date类,java.sql包中也是有Date类的。


2.3自定义包

在Java中,我们可以创建自己的包来组织和管理你的类文件。

创建和使用自定义包的一般步骤如下:

1.创建包目录结构:在我们的项目或源代码目录下,创建一个与我们的包名相对应的目录结构。例如,如果我们的包名是com.example.mypackage,那么你应该创建一个目录结构为com/example/mypackage的文件夹

2.编写类文件:在包目录结构下,创建你的类文件。例如,在com/example/mypackage目录下,你可以创建一个名为MyClass.java的文件,并在其中定义你的类。

3.声明包名:在你的类文件的开头,使用package关键字来声明你的包名。例如,在MyClass.java中,你可以添加如下的包声明:package com.example.mypackage;

4.导入和使用包中的类:如果你在另一个Java文件中想要使用你的包中的类,可以使用import语句导入该类。例如,如果你想在Main.java中使用MyClass类:

import com.example.mypackage.MyClass;public class Main {public static void main(String[] args) {MyClass myObject = new MyClass();// 使用myObject进行操作}
}

三、static成员

在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对
象,是所有对象所共享的。

举个例子,我们以学生类进行举例,现在有10个学生,这10个学生中都是在同一个班级,所以我们此时就不需要再学生类中写一个成员变量来保存学生所处的班级,我们可以把班级理解为这些学生的共同属性,即所有学生所共享的一个属性。所以我们当然不需要在每个学生类对象中都要存储一份这样的属性,因为这个班级属性是每个学生所共享的。

3.1static修饰成员变量

static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。

静态成员变量的特性如下:

  • 静态成员变量不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中。
  • 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  • 类变量存储在方法区当中
  • 静态成员变量的生命周期随类的加载而创建,随类的卸载而销毁

如果要为成员变量进行赋值的话,我们如下图可以直接为静态成员变量进行赋值即可。
在这里插入图片描述

3.2静态成员方法的访问

静态成员方法的访问是通过类名来进行访问的。
在这里插入图片描述

下面是静态成员方法的特性:

  • 静态成员方法不属于某个具体的对象,是类方法
  • 静态成员方法通过类名去进行访问,当然如果通过对象去访问也是可以的,只不过更推荐通过类名去进行访问
  • 不能直接访问静态方法中的任何非静态成员变量和非静态成员方法

综上,静态的无论是静态成员变量还是静态成员函数都是不依赖于对象的,它们都是可以通过类名去进行访问的。

3.3static成员变量的初始化

静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性
静态成员变量的初始化分为两种:就地初始化和静态代码块初始化

就地初始化:在定义时直接给出初始值。
请看举例:
在这里插入图片描述

代码块初始化:

四、代码块

使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:
实例代码块、静态代码块、局部代码块、同步代码块

下面来看下述代码:

public class MyStudent {public String name;public int age;public int ID;public static String classes = "classone";{System.out.println("实例代码块");}static {System.out.println("静态代码块");}public MyStudent(){this("李华",18,123456);System.out.println("不带参数的构造函数");}public MyStudent(String name,int age,int ID){System.out.println("带参数的构造函数");this.name = "Daming";this.age = 21;this.ID = 123456;}public static void main(String[] args) {MyStudent s1 = new MyStudent();}
}

在这里插入图片描述

看下图代码的执行结果:
在这里插入图片描述
由此可以看出static修饰的成员变量在对象创建之前就已经创建完成了,所以static修饰的成员变量和成员方法加载的速度比较快。

实例代码块、静态代码块、局部代码块、同步代码块的执行顺序如下:

1.静态代码块:静态代码块首先在类加载时执行,只会执行一次,并在类加载后执行。用于初始化类的静态成员变量或执行其他静态初始化操作

2.实例代码块:实例代码块在每次创建对象时都会被执行。它在构造方法之前执行,并且不管调用哪个构造方法,都会执行实例初始化块。

3.构造方法(Constructor):构造方法用于创建对象并对实例变量进行初始化。构造方法的执行顺序由具体调用的构造方法决定。

4.局部代码块:局部代码块是在方法或条件语句内部定义的代码块。它在程序运行到该代码块时被执行。

5.同步代码块(Synchronized Block):同步代码块使用关键字包裹一段代码,用于实现线程同步。当线程进入同步代码块时,需要获取锁,其它线程需要等待锁释放才能执行。

注意事项如下:
1.静态代码块不管生成多少个对象,其只会执行一次
2.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
3.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
4.实例代码块只有在创建对象时才会执行

总之静态代码块只在类加载时执行一次,而实例代码块(在构造方法之前执行)在每次创建对象时都会执行。局部代码块和同步代码块在程序运行到相应的位置时才会执行。构造方法在创建对象时被调用,并且可以根据具体的构造方法决定执行顺序。

以上就是本文的全部内容。

好了,友友们,本文到这里就结束了,再见啦!!!

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

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

相关文章

rsa加密解密java和C#互通

前言 因为第三方项目是java的案例,但是原来的项目使用的是java,故需要将java代码转化为C#代码,其中核心代码就是RSA加密以及加签和验签,其他的都是api接口请求难度不大。 遇到的问题 java和c#密钥格式不一致,java使…

亿发软件:智慧门店商超系统,2023新零售POS数字运营一体化管理

2023年9月6日,山东济宁一家超市因为酸奶价格标签错误而引发了广泛关注。标签原本显示几十个人为9.9元,但特价销售价却标为10元。这一小小的错误却在社交媒体上引发了轩然大波,让超市一度处于舆论的风口浪尖。超市工作人员回应,表示…

习题练习 C语言(暑期第四弹)

自我小提升! 前言一、数组二、指针运算三、统计每个月兔子的总数四、双指针的应用五、判断指针六、珠玑妙算七、两数之和八、数组下标九、指针十、寻找峰值十一、二级指针十二、大端小端十三、无符号参数十四、数对十五、截取字符串总结 前言 重要的事说三遍&#…

Linux--I/O复用之select

目录 一:概念 二:使用 三:参数介绍: 1.ndfs: 2.fd_set类型: 3.readfds: 4.writefds: 5.exceptfds: 6.timeout: 7.返回值: 四&#xff1…

opencv基础: 视频,摄像头读取与保存的常用方法

当然还可以从视频中抓取截图,所以现在聊一下常用的抓取视频截图的的方法。 VideoCapture 方法 cv2.VideoCapture();cv2.VideoCapture( device);cv2.VideoCapture(filename);上面有三种构造方法, 第一种是无法构造方法。 第二种参数device是一个数字。 …

文件上传之图片马混淆绕过与条件竞争

一、图片马混淆绕过 1.上传gif imagecreatefromxxxx函数把图片内容打散,,但是不会影响图片正常显示 $is_upload false; $msg null; if (isset($_POST[submit])){// 获得上传文件的基本信息,文件名,类型,大小&…

JavaScript-----DOM元素

目录 前言: 1. DOM介绍 2. 获取节点 3. 操作HTML内容 4. 监听事件 案例 5. 操作节点的标签属性 6. 操作样式 7. 创建、添加、删除节点 前言: 在此之前我们要想去操作网页元素一般是去通过CSS选择器实现的,今天我们就学习JavaScript里…

spring的事务隔离级别

一,spring支持的常用数据库事务传播属性和事务隔离级别 事务的传播行为:一个方法在运行了一个开启事务的方法中时,当前方法是使用原来的事务还是开启一个新的事务。 事务传播的行为有传播属性指定,Spring定义了7中类传播行为&…

Azure + React + ASP.NET Core 项目笔记一:项目环境搭建(一)

不重要的目录标题 前提条件第一步:新建文件夹第二步:使用VS/ VS code/cmd 打开该文件夹第三步:安装依赖第四步:试运行react第五步:整理项目结构 前提条件 安装dotnet core sdk 安装Node.js npm 第一步:新…

Tailwind 练手项目

Tailwind 练手项目 用到的技巧 Tailwind CSS 速成 应该都提过了,我不记得这里有什么特别新的知识 整体完成图大概这样: 一个纯静态页面,没有做 JS 之类的特效,不过做了移动端适配,说实话我写到一半的时候改了不少………

软件测试/测试开发丨Linux进阶命令

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27139 一、Linux进阶命令学习 curljq 二、curl简介 curl 是一个发送请求数据给服务器的工具 curl支持的协议有:FTP、FTPS、HTTP、HTTP、SFTP…