【Java SE 】封装 的特性 和 static 详解

news2024/10/20 20:00:59

 🔥博客主页🔥:【 坊钰_CSDN博客 】

欢迎各位点赞👍评论✍收藏⭐

目录

1. 封装的概念

 1.1 一个例子

2. 访问权限控制符

3. 包的概念

3.1 import 导入

3.2 常见的包 

4. static 静态成员 

4.1 static 使用情况

4.2 static 修饰成员变量

4.3 static 修饰成员方法

4.4 static 初始化

4.4.1 就地初始化

4.4.2 静态代码块初始化

5. 代码块

5.1 普通代码块

5.2 构造代码块

 5.3 静态代码块

6. 小结


 

1. 封装的概念

Java 对于面向对象来说,有三大特点 封装继承多态,而本次讲解 封装 的特性

 1.1 一个例子

比如汽车, 提供给驾驶员的只有:油门、刹车、离合等... 驾驶员用这些来操作汽车,但汽车是由很多零件组成的,如:发动机、轮胎、引擎等... 但对于使用者来说,不用担心,这些零件是如何运作的,这就大大提高了效率,所以,汽车在出厂时,只用把一些零件封装在内部即可,只需要驾驶员操作油门、刹车、离合等... 就可以操作汽车了

封装将数据和方法进行有机结合,隐藏对象的属性和细节,仅对外公开接口与对象进行交互 

2. 访问权限控制符

Java 用访问权限控制符来进行封装,Java 提供四种访问权限控制符(访问限定符) 

分别是:

  • private 同一个包的同一个类本类中使用
  • default 同一个包的不同类使用 + private 的范围
  • protected 不同包的子类 + default 的范围
  • public 不同包的非子类 + protect 的范围

  • protected 主要用于继承,后续讲解
  • default 成员属性什么都不写时,自动添加
  • 访问限制符不但可以控制变量,还可以控制类

3. 包的概念

在面向对象编程中,提出了一个包的概念

为更好管理类,把多个类管理成一组,进而形成了包

比如:电脑用文件夹来分类电影的种类

在 Java 也引入了包,包时对类和接口封装机制的体现,相同名字的类只要放在不同的包中就不会报错

3.1 import 导入

Java JDK 中为我们提供了很多现成的类,如:Date类 ,返回一个毫秒级的时间戳

直接使用 java.util.Date 导入 java.util 包中的 Date 类

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

 这时就可以用 import 关键字来导入包了

import java.util.Date;

public class Test {
    public static void main(String[] args) {
        //得到一个毫秒级的时间戳
        Date date = new java.util.Date();    //这边可以直接定义
        System.out.println(date);
    }
}

写成这样也可以

import java.util.*;

public class Test {
    public static void main(String[] args) {
        //得到一个毫秒级的时间戳
        Date date = new java.util.Date();    //这边可以直接定义
        System.out.println(date);
    }
}

 区别:

import java.util.*;      // ‘*’ 表示导入 java.util 中的所有类
import java.util.Date;   // 这个是导入 java.util 的指定类

 有一些情况要用完整的类名

import java.util.*;     
import java.sql.*;    

public class Test {
    public static void main(String[] args) {
        //得到一个毫秒级的时间戳
        java.util.Date date1 = new java.util.Date();   
  
    }
}

因为,两个包中都有 Date 类,要使用时,用哪个就写那个的完整类名

3.2 常见的包 

JDK 自带的有很多包,下面举几个常见的包

  • java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入
  • java.lang.reflect:java 反射编程包
  • java.net:进行网络编程开发包
  • java.sql:进行数据库开发的支持包
  • java.util:是java提供的工具程序包。(集合类等) 非常重要
  • java.io:I/O编程开发包

4. static 静态成员 

4.1 static 使用情况

在 Java 中,关于 static 关键字,被 static 修饰的成员,都从属于类,属于类变量,对于所有的对象来说是共享的

一个班级有三个学生,学生 A ,学生 B ,学生 C ,现建立 3 个对象来表示他们

public class Student {
    
    String name;
    int age;
    String classroom;

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

    public static void main(String[] args) {
        Student student1 = new Student("小明",18,"115班");
        Student student2 = new Student("李华",16,"115班");
        Student student3 = new Student("小红",19,"115班");
    }

}

大家发现,只要是这个班的的同学,都有一个固定的属性,没错是 115 班,这时就可以用 static 关键字了 

4.2 static 修饰成员变量

上面说过,被 static 修饰的变量,称为静态变量(类变量)

静态变量的特性

  • 是从属于类的,不属于任何对象,但是被所有对象共享
  • 可以通过类访问,也能通过对象访问,更推荐类访问
  • 静态变量存储在方法区中
  • 生命周期和类一致,随类创建而创建,销毁而销毁

 上面代码可优化

public class Student {

    String name;
    int age;
    static String classroom = "115班";

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

    public String toString() {
        return "[ " + name +
                " " + age +
                " " + classroom +
                " ]";

    }

    public static void main(String[] args) {
        Student student1 = new Student("小明",18);
        Student student2 = new Student("李华",16);
        Student student3 = new Student("小红",19);
    }

}
  • 被 static 修饰后,为类变量,被所有对象共享

4.3 static 修饰成员方法

与成员变量一样,成员方法被 static 修饰之后,为静态成员方法,是属于类的方法,当然也被对象共享,对象也可以调用

静态成员方法特性

  • 从属于类,被对象共享
  • 通过类和对象都可以调用,更推荐类调用
  • 在静态方法中,不能使用任何非静态成员变量
  • 但是,非静态方法,可以用静态成员变量
  • 静态成员变量中,不能出现 this 关键字,无法传递 this 引用
public class Student {

    private String name;
    private int age;
    static String classroom = "115班";

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

    public static void write() {      //静态成员方法
        System.out.println("写作业......");
    }

    public String toString() {
        return "[ " + name +
                " " + age +
                " " + classroom +
                " ]";

    }

    public static void main(String[] args) {
        Student student = new Student("小明",18);

        student.write();    //通过对象调用
        Student.write();    //直接类调用

    }

}

4.4 static 初始化

静态成员变量的初始化一般不会放在构造方法中初始化,它的初始化有两种

4.4.1 就地初始化

在创建变量时直接初始化

static String classroom = "115班";

4.4.2 静态代码块初始化

什么是代码块呢?

5. 代码块

把使用 { } 定义的代码称为代码块,代码块分为以下 3 种(目前):

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

5.1 普通代码块

直接用 { } 定义代码

public class Main {
    public static void main(String[] args) {
        {
            int a = 10;
            System.out.println(a);
        }
    }
}

5.2 构造代码块

在类中定义的代码块,一般用来初始化成员变量

public class Main {
    
    String name;
    int age;
    String classroom;
    int scroce;

    {
        //构造代码块,也叫实例代码块
        name = "张三";
        age = 18;
        classroom = "115班";
        scroce = 90;
    }
    
    public static void main(String[] args) {
    
    }
}

 5.3 静态代码块

就像名字说的那样,一般用于初始化静态变量

public class Main {

    String name;
    int age;
    int scroce;
    static String classroom;


    {
        //构造代码块,也叫实例代码块
        name = "张三";
        age = 18;
        scroce = 90;
    }

    static {
        //静态代码块
        classroom = "115班";
    }

    public static void main(String[] args) {

    }
}
  • 静态代码最先执行,且只执行一次
  • 静态代码块,{ } 前有 static 修饰

6. 小结

 以上就是对封装和 static 的了解,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持 !

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

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

相关文章

> Invalid revision: 3.22.1-g37088a8-dirty

Android项目使用cmake 3.22.1,编译时报错: > Invalid revision: 3.22.1-g37088a8-dirty解决方法一: 升级Gradle版本和AGP的版本; 建议使用AS推荐的版本: 目前可运行的版本配置: AS:Jel…

champ模型部署指南

一、介绍 champ是由阿里巴巴、复旦大学和南京大学的研究人员共同提出的一种基于3D的将人物图片转换为视频动画的模型,该方法结合了3D参数化模型(特别是SMPL模型)和潜在扩散模型,能够精确地捕捉和再现人体的3D形状和动态,同时保持动画的时间一…

读书读到NOBEL

最近在读陈逸鹤的《程序员的自我修养》这本书,里面有这么一段话: “远古时代的人们只能创造出用于猎捕的长矛,而今天借助来自各行各业人 们的智慧,我们可以制造出高铁、大型飞机,并探索宇宙。但要更进一步解决人类所面…

2024_E_100_连续字母长度

连续字母长度 题目描述 给定一个字符串&#xff0c;只包含大写字母&#xff0c;求在包含同一字母的子串中&#xff0c;长度第 k 长的子串的长度&#xff0c;相同字母只取最长的那个子串。 输入描述 第一行有一个子串(1<长度<100)&#xff0c;只包含大写字母。 第二行为…

GPT-4o canvas不是对cursor的颠覆,而是人与AI交互的新探索

谈一下Openai新发布的canvas。 关于这个产品的介绍不多说了&#xff0c;网上已经有很多&#xff0c;主要谈下我对它以及相似竞品的比较&#xff0c;以及我的一些看法。 1、vs Claude Artifacts&#xff1a;是chatbot编程方面直接竞品&#xff0c;不过现阶段还是有很大的区别。…

二百六十八、Kettle——同步ClickHouse清洗数据到Hive的DWD层静态分区表中(每天一次)

一、目的 实时数仓用的是ClickHouse&#xff0c;为了避免Hive还要清洗数据&#xff0c;因此就直接把ClickHouse中清洗数据同步到Hive中就行 二、所需工具 ClickHouse&#xff1a;clickhouse-client-21.9.5.16 Kettle&#xff1a;kettle9.2 Hadoop&#xff1a;hadoop-3.1.3…

TH-OCR:强大的光学字符识别工具与车牌识别应用

在当今数字化的时代&#xff0c;高效准确地识别文本和图像中的字符变得至关重要。TH-OCR&#xff08;清华 OCR&#xff09;作为一款优秀的光学字符识别软件&#xff0c;以其卓越的性能和广泛的应用场景&#xff0c;受到了众多用户的青睐。其中&#xff0c;车牌识别功能更是在交…

嵌入式入门学习——6Protues点亮数码管,认识位码和段码,分辨共阴还是共阳(数字时钟第一步)

0 系列文章入口 嵌入式入门学习——0快速入门&#xff0c;Let‘s Do It&#xff01; 首先新建基于Arduino UNO的protues工程&#xff0c;见本系列第3篇文章 1 点“P”按钮找器件 2 输入“seg”或“digit”查找数码管器件 3 找到我们想要的6位7段数码管 4如图A、B…DP都是段码…

一、go入门

go入门 Go历史1.1 诞生时间1.2 里程碑1.3 团队核心人员 2. 为什么使用Go3. 安装Go5. 入门案例6. 开发工具 Go历史 1.1 诞生时间 Go 语言起源 2007 年&#xff0c;并于 2009 年正式对外发布。它从 2009 年 9 月 21 日开始作为谷歌公司 20% 兼职项目&#xff0c;即相关员工利用…

MATLAB小波变换图像融合系统

二、应用背景及意义 本课题利用小波变换进行图像的融合&#xff0c;然后对融合的结果进行图像质量的评价。所谓小波变换图像融合就是对多个的信息目标进行一系列的图像提取和合成&#xff0c;进而可以获得对同一个信息目标的更为精确、全面、可靠的高低频图像信息描述。并且也…

Vue2项目-二进制流预览

一、docx文档 软件&#xff1a;docx-preview&#xff1b; 版本&#xff1a;"^0.1.20"&#xff1b; 1、安装docx-preview npm i docx-preview0.1.20 2、组件配置 <template><div ref"wordContainer"></div> </template><s…

java集合进阶篇-《泛型通配符及其练习》

个人主页→VON 收录专栏→java从入门到起飞 目录 一、前言 二、泛型通配符简要概述 基本概念 无界通配符 (?)&#xff1a; 上限通配符 (? extends T)&#xff1a; 下限通配符 (? super T)&#xff1a; 三、思考 四、综合练习 Animal类及其javabeen Cat类 Dog类 H…

04 设计模式-创造型模式-建造者模式

建造者模式是一种创建型设计模式&#xff0c;它允许你创建复杂对象的步骤与表示方式相分离。 建造者模式是一种创建型设计模式&#xff0c;它的主要目的是将一个复杂对象的构建过程与其表示相分离&#xff0c;从而可以创建具有不同表示形式的对象。 设计模式&#xff0c;最近…

1. 安装框架

一、安装 Laravel 11 框架 按照官方文档直接下一步安装即可 1. 安装步骤 2. 执行数据库迁移 在.env文件中提前配置好数据库连接信息 php artisan migrate二、安装 Filament3.2 参考 中文文档 进行安装 1. 安装 拓展包 composer require filament/filament:"^3.2" -W…

操作系统 和 初识进程

目录 操作系统&#xff08;OS&#xff09; 进程 操作系统&#xff08;OS&#xff09; 概念 操作系统即os&#xff0c;是一款软件。 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。 操作系统的本质是一种进行软硬件管理的软件 笼统的理解&#xf…

Linux服务器前后端项目部署vue+springboot—搭建服务器上的运行环境(JDK、Redis、MySQL、Nginx)

Linux服务器前后端项目部署—①搭建服务器上的运行环境 一、系统参数信息和使用工具 1、服务器信息 华为云 CenteOS7.8 64 配置信息&#xff1a;2核4G 2、使用工具 Xshell6 二、环境安装和配置 &#xff08;一&#xff09;JDK的下载和安装 1、创建一个新目录或者进入目…

『Mysql集群』Mysql高可用集群之读写分离(二)

前言 主从复制: 解决了Mysql的单点故障问题以及提高MySQL的整体服务性能. 读写分离: 解决的是数据库的读性能问题,分担主库的压力&#xff0c;提高系统的可用性和稳定性。 分库分表: 数据库分表可以解决单表海量数据的查询性能问题&#xff0c;分库可以解决单台数据库的并发…

Unity Apple Vision Pro 保姆级开发教程-准备阶段

视频教程&#xff1a; Unity PolySpatial 开发Apple Vision Pro教程, 三十分钟快速了解 Unity Vision Pro 中文课堂教程地址&#xff1a; Unity3D Vision Pro 开发教程【保姆级】 | Unity 中文课堂 开发Apple Vision Pro 使用原生开发和unity 开发有什么区别 如果你的项目需要…

IT监控平台可视化:3D机房与设备监控的革新实践

在信息化高速发展的今天&#xff0c;IT运维行业面临着前所未有的挑战。随着数据中心规模的不断扩大和设备复杂度的日益提升&#xff0c;如何高效、准确地监控和管理这些设备&#xff0c;成为了运维团队亟待解决的问题。IT监控平台的可视化功能&#xff0c;尤其是3D机房与设备监…

客户案例 | Ansys与台积电和微软合作加速光子仿真

Ansys与台积电和微软展开合作&#xff0c;将硅光子器件的仿真和分析速度提高10倍以上 主要亮点 借助使用NVIDIA图形处理单元&#xff08;GPU&#xff09;的Microsoft Azure虚拟机&#xff0c;Ansys Lumerical™ FDTD 3D电磁仿真的光子器件仿真速度实现了10倍提升 凭借Azure云…