【JAVA】十、基础知识“类和对象”干货分享~(三)

news2025/4/15 22:27:15

目录

1. 封装

1.1 封装的概念

1.2 访问限定符

public(公开访问)

 private(私有访问)

1.3 包

1.3.1 包的概念

1.3.2 导入包中的类

1.3.3 自定义包

 2. static成员

2.1 static变量(类变量)

2.1.1 static修饰成员变量

2.2 static方法(类方法)

2.2.1 static修饰成员方法

2.3 static成员变量初始化

3. 代码块

 3.1 代码块概念以及分类

3.1.1 普通代码块(少用)

3.1.2 构造代码块(实例代码块)

3.1.3 静态代码块


1. 封装


1.1 封装的概念

        在 Java 中,面向对象程序三大特征:封装,继承,多态。而封装是面向对象编程(OOP)的核心概念之一,它的核心思想是将数据(属性)和操作数据的方法(行为)捆绑在一起,并隐藏对象的内部实现细节,仅对外公开可控的访问接口来和对象进行交互。简单来说就是套壳屏蔽细节啦~

        并且封装通过限制对对象内部状态的直接访问,提高了代码的安全性、可维护性和灵活性。


1.2 访问限定符

        Java 中的访问限定符用于控制类、成员变量、方法和构造方法的可见性,是实现封装的重要机制。共有四种访问修饰符:public、protected、默认、private。在这里博主先介绍public修饰符,再介绍private修饰符,剩下两个修饰符不做过多描述~

  • public(公开访问)

作用范围:所有类均可访问。

使用的场景:

对外暴露的接口或工具类(如 public class Main)。

常量(如 public static final)。

public class Animal {
    public String name; // 任何类都可以访问
}
  •  private(私有访问)

封装性:优先使用 private,通过公共方法控制访问。

作用范围:仅限于声明它的类内部。

使用场景:

封装类的内部状态(如私有字段)。

单例模式的私有构造方法。

public class Student {
    private String id; // 仅本类可以访问

    public String getId() { // 通过公共方法暴露出来
        return id;
    }
}

1.3 包

1.3.1 包的概念

        在 Java 中,是一种用于组织类和接口的命名空间机制。它类似于文件系统中的文件夹,里面存有很多文件主要目的是避免命名冲突、控制访问权限。

        为了更好的管理,把多个类收集在一起成为一组,称为软件包。

        包有一个很重要的作用:不同包中可以存在相同名称的类,避免类名的冲突。

1.3.2 导入包中的类

下面这一段代码是输出数组的内容,我们通过这段代码来进行导入包中的类的讲解:

// 导入Arrays类(位于java.util包中)
import java.util.Arrays;

public class Test3 {  // 类名建议首字母大写
    public static void main(String[] args) {
        // 创建并初始化一个int数组
        int[] array = {1, 2, 3};
        
        // 使用Arrays类的静态方法toString()转换数组为字符串
        // 注意:Arrays是类名,Array是Java中的数组关键字,不要混淆
        System.out.println(Arrays.toString(array));// 输出 [1, 2, 3]
    }
}
  •  导入包

使用 Arrays 类前需导入包:可以使用import语句导入包:

import java.util.Arrays; // 必须添加在代码开头
  • Arrays.toString(array)
  1. Arrays 是 Java 提供的工具类(位于 java.util 包),用于操作数组。
  2. toString() 是它的静态方法,功能是将数组元素转换为可读的字符串格式。

        System.out.println(Arrays.toString(array)) 这行Java代码的作用是将数组 array 的内容转换为字符串并输出到控制台

        如果直接打印数组对象 System.out.println(array),输出的是数组的哈希值(如 [I@1b6d3586),这时候没办法看到实际内容。

        使用 Arrays.toString() 后,输出的是直观的数组元素[1, 2, 3]

        我们也可以使用import static导入包中的静态的方法和字段,后续代码中可以直接使用静态成员,无需通过类名调用

// 使用静态导入:导入Arrays类中的toString方法
// 使得可以直接调用toString()而无需写类名Arrays
import static java.util.Arrays.toString;

public class test3 {
    public static void main(String[] args) {
        // 定义一个int数组
        int[] array = {1, 2, 3};
        
        // 直接调用静态导入的toString方法,等价于Arrays.toString(array)
        System.out.println(toString(array));//输出[1, 2, 3]
    }
}

1.3.3 自定义包

        选中src,右键点击 src 目录,点击New(新建),再点击Package(软件包),创名字(名字全小写),最后就创建好了包。

 


 2. static成员

        在之前的博客中我们举了学生类来进行相关知识点讲解,现在同样我们再用学生类举例:

        上述三者都是成员变量。成员变量定义在方法的外部,类的内部。其中schoolName用static修饰之后,就不存在于对象当中了,而存在于方法区当中。

        所有学生共享学校名称:每个学生对象都有自己的 name 和 age,但 schoolName 是所有学生共享的。修改一次,所有对象看到的都会变化。

        直接通过类名访问:例如 Student.schoolName

2.1 static变量(类变量)

2.1.1 static修饰成员变量

  • static修饰的成员属于类本身(schoolName被static修饰)

  • 所有对象共享同一个static变量

  • 示例中的schoolName被所有Student对象共享

  • 静态成员变量访问方式:类名.变量名(而非静态成员变量属于对象,访问方式是:引用.变量名)

  • 静态成员变量不依赖于对象,不用实例化都可以


2.2 static方法(类方法)

2.2.1 static修饰成员方法

  • 静态成员方法中,使用时也是不依赖于对象
  • 静态成员方法无需实例化:可通过类名.方法名()直接调用

  • changeSchool() 通过类名调用(如 Student.changeSchool("希望中学")),修改所有学生共享的 schoolName

  • 在②静态成员方法里面,不能 直接 调用①非静态成员方法或成员变量在 changeSchool() 中尝试访问 name 或 age 会报错,因为static 方法中没有 this 引用

若是一定要在静态成员方法里调用的话,一定要通过对象的引用来调用!即:

完整代码如下:

public class Student {
    // 实例变量 - 每个学生对象独有的属性
    String name;    // 学生姓名
    int age;        // 学生年龄
    
    // static成员 - 属于类本身的属性(所有对象共享)
    static String schoolName = "阳光中学"; // 学校名称(所有学生相同)
    
    // 构造方法
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 实例方法 - 需要创建对象后才能调用
    void showInfo() {
        System.out.println(name + "," + age + "岁,就读于" + schoolName);
    }
    
    // static方法 - 通过类名直接调用
    static void changeSchool(String newName) {
        schoolName = newName; // 修改所有学生共享的学校名称
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        // 访问static变量(不需要创建对象)
        System.out.println("当前学校:" + Student.schoolName);
        
        // 创建两个学生对象
        Student s1 = new Student("张三", 15);
        Student s2 = new Student("李四", 16);
        
        // 调用实例方法
        s1.showInfo(); // 张三,15岁,就读于阳光中学
        s2.showInfo(); // 李四,16岁,就读于阳光中学
        
        // 通过类名调用static方法修改学校名称
        Student.changeSchool("希望中学");
        
        System.out.println("\n修改后的学校信息:");
        s1.showInfo(); // 张三,15岁,就读于希望中学
        s2.showInfo(); // 李四,16岁,就读于希望中学
        
        // 再次直接访问static变量
        System.out.println("当前学校:" + Student.schoolName);
    }
}

2.3 static成员变量初始化

        静态成员变量一般不会放在构造方法中初始化,构造方法里面初始化的是与对象相关的实例属性。

        初始化方式分为两种:就地初始化和静态代码块初始化

就地初始化在定义时直接给出初始值:

static String schoolName = "阳光中学"; // 最常用的初始化方式

静态初始化我们在后面进行介绍


3. 代码块

 3.1 代码块概念以及分类

        如图,使用{ }定义的一段代码称为代码块。 可以分为四类:

  • 普通代码块     构造块      静态块     同步代码块

3.1.1 普通代码块(少用)

  • 在方法内部用{ }包裹的代码块
void showInfo() {
    { // 普通代码块开始
        int temp = 10;
        System.out.println("变量是:" + temp);
    } // temp变量在这里被销毁
    
    // System.out.println(temp); // 这里会报错,temp已经不可用啦
}

3.1.2 构造代码块(实例代码块)

  • 类中直接使用{ }包裹的代码块(不加修饰符)。也叫做实例代码块,构造代码块一般用于初始化实例成员变量,这个代码块在方法的外面,类的里面
  • 每次创建对象时自动执行,且在构造方法之前
public class Student {
    // 实例变量
    String name;
    int age;
    
    // ---------- 构造代码块 ----------
    {
        // 这个代码块会在每次创建对象的时候执行
        System.out.println("执行构造代码块");
        age = 10; // 为所有学生设置默认年龄10
    }
    // -----------------------------
    
    // 构造方法
    public Student(String name, int age) {
        System.out.println("执行构造方法");
        this.name = name;
        this.age = age; // 会覆盖构造代码块中的默认值
    }
}

3.1.3 静态代码块

  • 使用static { }包裹的代码块称为静态代码块。一般用于初始化静态成员变量。
  • 类首次加载时执行,且仅仅执行一次
public class Student {
    static String schoolName;
    
    // 静态代码块
    static {
        System.out.println("静态代码块啦~");
        schoolName = "希望中学";
    }

}

        静态代码块只会执行一次,只要类被加载,就会被执行,而实例代码块一定是实例化对象的时候被执行。 

        若是三者都存在时,执行顺序:静态代码块 实例代码块 不带参数的构造方法。

希望能帮到友友们的学习~


制作不易,更多内容加载中~感谢友友们的点赞收藏关注~~

如有问题欢迎批评指正,祝友友们生活愉快,学习工作顺顺利利!

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

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

相关文章

DeepSeek+SpringAI家庭AI医生

文章目录 项目架构项目开发内容项目用户用例图项目地址开发环境大模型使用本地:Ollama部署DeepSeek离线与在线api大模型客户端使用 数据库脚本代码deepseek创建定制医生模型 内网互通原则云服务器类型 项目架构 项目开发内容 项目用户用例图 项目地址 FamilyAIDoct…

PyTorch:解锁AI新时代的钥匙

(前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站)。 揭开PyTorch面纱 对于许多刚开始接触人工智能领域的朋友来说,PyTorch这个名字或许既熟悉又陌生。…

C++第14届蓝桥杯b组学习笔记

1. 日期统计 小蓝现在有一个长度为 100100 的数组,数组中的每个元素的值都在 00 到 99 的范围之内。数组中的元素从左至右如下所示: 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4…

解锁工业通信:Profibus DP到ModbusTCP网关指南!

解锁工业通信:Profibus DP到ModbusTCP网关指南! 在工业自动化领域,随着技术的不断进步和应用场景的日益复杂,不同设备和系统之间的通讯协议兼容性问题成为了工程师们面临的一大挑战。尤其是在Profibus DP和Modbus/TCP这两种广泛应…

每日一题(小白)字符串娱乐篇16

分析题意可以了解到本题要求在一串字符串中找到所有组合起来排序递增的字符串。我们可以默认所有字符在字符串中的上升序列是1,从第一个字符开始找,如果后面的字符大于前面的字符就说明这是一个上序列那么后面字符所在的数组加一,如果连接不上…

如何深刻理解Reactor和Proactor

前言: 网络框架的设计离不开 I/O 线程模型,线程模型的优劣直接决定了系统的吞吐量、可扩展性、安全性等。目前主流的网络框架,在网络 IO 处理层面几乎都采用了I/O 多路复用方案(又以epoll为主),这是服务端应对高并发的性能利器。 …

java基础 数组Array的介绍

Array 数组定义一维数组多维数组动态数组常见方法Arrays排序1.sort() 排序 2.parallelSort() 排序 查找:binarySearch()填充:fill()比较:equals() 和 deepEquals()复制:copyOf() 和 copyOfRange()转换为列表:asList()转…

我的NISP二级之路-02

目录 一.数据库 二.TCP/IP协议 分层结构 三.STRIDE模型 四.检查评估与自评估 检查评估 自评估 五.信息安全应急响应过程 六.系统工程 七.SSE-CMM 八.CC标准 九.九项重点工作 记背: 一.数据库 关于数据库恢复技术,下列说法不正确的是&#xff1a…

常见的微信个人号二次开发功能

一、常见开发功能 1. 好友管理 好友列表维护 添加/删除好友 修改好友信息(备注、标签等) 分组管理 创建/编辑/删除标签 好友分类与筛选 2. 消息管理 信息发送 支持多类型内容:文本、图片、视频、文件、小程序、名片、URL链接等 附加功…

unity的dots中instantiate克隆对象后,对象会在原位置闪现的原因和解决

原因 在Entity中有两个位置信息,一个是local transform。一个是local to world 其中local transform负责具体位置,local to world 负责渲染位置,即图像的渲染的位置是根据local to world的。 local to world 的更新是引擎自己控制的&#x…

R语言——绘制生命曲线图(细胞因子IL5)

绘制生命曲线图&#xff08;根据细胞因子&#xff09; 说明流程代码加载包读取Excel文件清理数据重命名列名处理IL-5中的"<"符号 - 替换为检测下限的一半首先找出所有包含"<"的值检查缺失移除缺失值根据IL-5中位数将患者分为高低两组 创建生存对象拟…

神马系统8.5搭建过程,附源码数据库

项目介绍 神马系统是多年来流行的一款电视端应用&#xff0c;历经多年的发展&#xff0c;在稳定性和易用性方面都比较友好。 十多年前当家里的第一台智能电视买回家&#xff0c;就泡在某论坛&#xff0c;找了很多APP安装在电视上&#xff0c;其中这个神马系统就是用得很久的一…

大模型论文:Improving Language Understanding by Generative Pre-Training

大模型论文&#xff1a;Improving Language Understanding by Generative Pre-Training OpenAI2018 文章地址&#xff1a;https://www.mikecaptain.com/resources/pdf/GPT-1.pdf 摘要 自然语言理解包括各种各样的任务&#xff0c;如文本蕴涵、问题回答、语义相似性评估和文…

[ctfshow web入门] web18

前置知识 js(javascript)语言用于前台控制&#xff0c;不需要知道他的语法是什么&#xff0c;以高级语言的阅读方式也能看懂个大概。 在JavaScript中&#xff0c;confirm()是一个用于显示确认对话框的内置函数&#xff0c;不用知道怎么使用。 信息收集 提示&#xff1a;不要…

`uia.WindowControl` 是什么:获取窗口文字是基于系统的 UI 自动化接口,而非 OCR 方式

uia.WindowControl 是什么:获取窗口文字是基于系统的 UI 自动化接口,而非 OCR 方式 uia.WindowControl 通常是基于 Windows 系统的 UI 自动化框架(如 pywinauto 中的 uia 模块)里用于表示窗口控件的类。在 Windows 操作系统中,每个应用程序的窗口都可以看作是一个控件,ui…

vue3 处理文字 根据文字单独添加class

下面写的是根据后端返回的html 提取我需要的标签和字 将他们单独添加样式 后端返回的数据 大概类似于<h1>2024年“双11”购物节网络零售监测报告</h1><p>表1 “双11” 期间网络零售热销品类TOP10</p> function checkfun(newList){if (newList) {let …

Jupyter Notebook不能自动打开默认浏览器怎么办?

在安装anaconda的过程中,部分用户可能会遇到,打开Jupyter Notebook的时候,不会弹出默认浏览器。本章教程给出解决办法。 一、生成一个jupyter默认配置文件 打开cmd,运行以下命令,会生成一个jupyter_notebook配置文件。 jupyter notebook --generate-config二、编辑jupyter_…

Spring Boot 工程创建详解

2025/4/2 向全栈工程师迈进&#xff01; 一、SpingBoot工程文件的创建 点击Project Structure 然后按着如下点击 最后选择Spring Boot &#xff0c;同时记得选择是Maven和jar&#xff0c;而不是war。因为Boot工程内置了Tomcat&#xff0c;所以不需要war。 紧接着选择Spring We…

Spring Boot + MyBatis + Maven论坛内容管理系统源码

项目描述 xxxForum是一个基于Spring Boot MyBatis Maven开发的一个论坛内容管理系统&#xff0c;主要实现了的功能有&#xff1a; 前台页面展示数据、广告展示内容模块&#xff1a;发帖、评论、帖子分类、分页、回帖统计、访问统计、表单验证用户模块&#xff1a;权限、资料…

国网B接口协议资源上报流程详解以及上报失败原因(电网B接口)

文章目录 一、B接口协议资源上报接口介绍B.2.1 接口描述B.2.2 接口流程B.2.3 接口参数B.2.3.1 SIP头字段B.2.3.2 SIP响应码B.2.3.3 XML Schema参数定义 B.2.4 消息示例B.2.4.1 上报前端系统的资源B.2.4.2 响应消息 二、B接口资源上报失败常见问题&#xff08;一&#xff09;证书…