Java类和对象(二)—— 封装,static 关键字与代码块

news2024/12/24 10:12:55

前言

       在面向对象的编程语言中,有三大特性:封装、继承和多态~~
       今天我们就来学习封装的知识

封装

什么是封装

       在现实生活中,我们经常使用手机来进行沟通与交流,实际上我们拿到的手机是被封装好的,精美的屏幕,还有一些接口等等,但是手机内部的结构我们是看不到的,除非你强行拆解~~

手机的内部结构:
在这里插入图片描述
手机厂商会把手机的内部结构(手机的细节)给封装起来,就是套上一个壳子,留下几个接口实现用户与手机之间的交互,这就是封装的意思~~

封装的延伸之包

在生活中,我们会使用文件夹来存放不同类型的文件,每一个大的文件夹下可能会用不同的小文件,这些大文件夹我们可以理解成包,小文件夹可以理解成包里面的某一个类,在小文件夹里面有一些文件,这些文件可以理解成方法~~

包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式

在Java中我们可以使用Java已经有的包,或者自己自定义一些包~
常见的Java的包有:
1.java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入
2.java.lang.reflect:java 反射编程包;
3.java.net:进行网络编程开发包。
4.java.sql:进行数据库开发的支持包。
5.java.util:是java提供的工具程序包。(集合类等) 非常重要
6.java.io:I/O编程开发包。

举个例子,我们在打印数组的时候可以使用Arrays.toString()来实现数组转化成字符串~

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] arr = {1,2,3};
        System.out.println(Arrays.toString(arr));
    }
}

要使用Arrays.toString()这个方法的时候,我们会导入一个java.util的包,并且说明导入这个包底下的哪一个类~

导入包中的类

我们一般会使用下面的形式来导入包中的类:

方式一

直接使用包的名字来使用包里面的类里面的方法
包名.类名.方法

public class Test {
    public static void main(String[] args) {
        int[] arr = {1,2,3};
        System.out.println(java.util.Arrays.toString(arr));
    }
}

因为每次使用都要写一遍这些语句(包名.类名.方法),所以这种一般这种比较麻烦,我们不推荐使用~~

方式二

使用import 语句来导入包里面的类:
import 包名.类名
就例如下面的方式:
import java.util.Arrays;

这种显式导入包里面的类是十分推荐的~


还有一种就是直接把包里面所有的类直接导入进来:

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

但是这种我们不推荐,因为别人就不知道你使用了这个包的哪个类,代码的可读性就会变差,而且如果不同的包有一些类名是一样的,编译器就不知道要使用哪一个类了:

在这里插入图片描述

在这里插入图片描述

我们可以使用import static 导入包中静态的方法和字段。

import static java.lang.Math.*;
public class Test {
    public static void main(String[] args) {
        double x = 30;
        double y = 40;
        // 静态导入的方式写起来更方便一些.
        // double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
        double result = sqrt(pow(x, 2) + pow(y, 2));
        System.out.println(result);
    }
}

方式三

IDEA可以使用快捷键进行导入,鼠标移动到这个需要导入的类,按住Alt+回车就可以了~~

自定义一个包

创建一个包

这里使用的是IDEA编译器进行演示:
在这里插入图片描述
首先右键src,选择new,点击package,然后输入你的包名,就可以了~~

在这里插入图片描述

没错,包里面其实可以再套包,如果你输入的包名类似com.baidu.www(就会创建三个包,com里面有baidu,baidu里面有www)
如果你建立了类似上面的很多包,但是你看不到层次分明的包的话,可以这样修改:

在这里插入图片描述
在这里插入图片描述

把Compact Middle Packages 这个勾(√)给取消掉就可以了~~


编译器会在第一行就告诉你这个类是在哪一个包下的~~
会显示package+包名;

在这里插入图片描述

在这里插入图片描述


规则

在文件的最上方加上一个 package 语句指定该代码在哪个包中.
包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.baidu.www ).
包名要和代码路径相匹配. 例如创建 com.baidu.www 的包, 那么会存在一个对应的路径 com/baidu/www 来存储
代码.
如果一个类没有 package 语句, 则该类被放到一个默认包中.

使用

要使用自己的包也很简单,还是一样要导入包里面的类

import com.baidu.www.Test2;

public class Test {
    public static void main(String[] args) {
        Test2 test = new Test2();
    }
}

static

我们在使用创建对象的时候,有时候会发现有些成员变量是不变的,例如:同样在一个班里的学生,他们的姓名、年龄是不一样的,但是不变的是他们的班级,他们有些行为也是一样的(例如上课、睡觉、吃饭等等)
这时候我们就会使用static来修饰这些共性的特征

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

static 修饰成员变量

上面我们提到学生类,接下来我们就以这个来举例子:

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

    public static void main(String[] args) {
        Student student1 = new Student();
        Student student2 = new Student();
        Student student3 = new Student();
        
    }
}

我们使用 static 来修饰班级名字,意味着className 这个成员变量是共享的,并且是存放在方法区当中的,而且只会存储一份~~

在这里插入图片描述

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

由于静态成员变量是不依赖对象的,所以我们可以使用类名直接访问静态成员变量,当然也可以使用对象来访问~~
这里建议直接通过类名进行访问~~

看看下面的代码:

public class Student {
    public String name;
    public int age;
    public static String className;

    public void show() {
        System.out.println("班级:"+this.className);
    }

    public static void main(String[] args) {
        Student student1 = new Student();
        student1.className = "1班";
        student1.show();
        System.out.println("=============");

        Student student2 = null;
        student2.className = "2班";
        System.out.println(Student.className);
        System.out.println("=============");

        Student.className = "3班";
        System.out.println(Student.className);

    }
}

在这里插入图片描述

为什么 student2 明明被置为null,却还是能进行对 className 进行使用赋值呢?

因为我们知道静态成员变量是不依赖对象的,所以 student2 也可以访问静态的成员变量className,但是就不能访问其他非静态的成员变量和成员方法了~~

static 修饰成员方法

被static修饰的成员方法也叫做静态成员方法,也可以叫做类方法,不是某个对象所特有的

public class Student {
    public String name;
    public int age;
    public static String className;

    public void doHomework(){
        System.out.println(this.name+"做作业");
    }

    public void eat(){
        System.out.println(this.name+"吃饭");
    }

    public static void test(){
        System.out.println("考试");
    }

    public static void main(String[] args) {
        test();
    }
}
public class Test {
    public static void main(String[] args) {
        Student.test();
    }
}

不同类里,我们可以通过 类名.方法 来进行调用该类的静态方法~~
但是不能在静态的方法里直接调用非静态的成员变量,因为静态方法是不依赖对象的,所以你要调用非静态方法只能先创建一个对象,然后再使用这个对象去调用非静态方法,也就意味着你在静态方法也是不能使用this关键字的(this关键字是依赖对象的~~)
非静态的成员方法是可以调用非静态成员方法的和静态成员方法的~

小结

一句话总结上面的:**静态成员方法和静态成员变量是不依赖对象的**

代码块

普通代码块

普通代码块:定义在方法中的代码块.

public class Test {
    public static void main(String[] args) {
        //Student.test();
        
        {
            int a = 10;
            int b = 20;
        }

    }
}

这份代码里 { int a = 10; int b = 20; } 就是普通代码块~~

静态代码块

有 static 修饰的代码块,一般用于初始化静态成员变量~~
这个代码块在方法外面~~

public class Student {
    public String name;
    public int age;
    public static String className;

	//静态代码块
    static{
        className = "1班";
        System.out.println(className);
    }
}

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

定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
也是在方法外面定义的~~

public class Student {
    public String name;
    public int age;
    public static String className;
	
	//实例化代码块
    {
        name = "张三";
        age = 10;
    }
}

同步代码块

后面文章(多线程的内容)讲解~

执行顺序

先看现象:

在这里插入图片描述

运行结果:

在这里插入图片描述

静态代码块不管生成多少个对象,其只会执行一次
静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
实例代码块只有在创建对象时才会执行,如果有多个实例化代码块就会根据定义的先后次序执行
最后就是执行构造方法

简单来说:
静态代码块(只会执行一次)-----》 实例化代码块 ------》构造方法

包的访问权限

在这里插入图片描述
这里我会在下面的补充里面讲解到public,private,default这三个权限访问修饰符的含义和使用,protected和子类会在继承的文章中讲到~~

public

被 public 修饰的变量或者方法是公共的,在任何地方都能使用

private

被private 修饰的是私有的,只能在类内部使用

default

注意没有 default 关键字,这个的中文意思有默认的,就是代表默认权限,在同一个包里面都能使用

合理使用修饰符

Java中外面会将一些方法或者变量给封装起来,也就是使用上面这些修饰符进行封装,留下一些接口给外界使用~~

例如下面的代码:

public class Student {
    private String name;
    private int age;
    private static String className;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public static String getClassName() {
        return className;
    }

    public static void setClassName(String className) {
        Student.className = className;
    }

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

    {
        name = "张三";
        age = 10;
        System.out.println("执行实例化代码块");
    }
    static{
        className = "1班";
        System.out.println("执行静态代码块");
    }

    public Student(){
        System.out.println("调用构造方法");
    }
    
    public void doHomework(){
        System.out.println(this.name+"做作业");
    }

    public void eat(){
        System.out.println(this.name+"吃饭");
    }

    public static void test(){
        System.out.println("考试");
    }

    private static void main(String[] args) {
        //this.name = 10;
        Student student1 = new Student();
        student1.eat();
        test();
    }
}

我们通过使用private将类里面的细节给封装起来,通过get…和set…或构造方法来进行初始化和在类外也能得到里面的成员的值。

对象的成员变量初始化

就地初始化

在定义变量的时候直接赋初始值

public class Student {
    private String name = "张三";
    private int age = 10;
    private static String className = "1班";

    public String getName() {
        return name;
    }
}

代码块初始化

我们可以使用静态代码块和实例化代码块进行初始化,上面讲代码的时候就使用到了,这里不做代码示例。

构造方法初始化

public class Student {
    private String name;
    private int age;
    private static String className;
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

快捷键写代码

我们上面提到get…和set…方法还有一个初始化成员变量的构造方法,在IDEA中我们可以快速生成,我们可以使用快捷键Alt+Insert或者右键找到Generate,Getter就是获取这个变量,Setter就是设置这个变量,Constructor可以设置构造方法,然后选择你想要的成员变量就可以了(按住Ctrl,就可以选择多个变量了),最后点击OK,代码就完成了~~

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

MYSQL和JAVA中将中文汉字按照拼音首字母排序

一、MYSQL将中文汉字按照拼音首字母排序 数据库使用的字符编码是utf8_general_ci,如下 ORDER BY CONVERT(表名.字段名 USING gbk) COLLATE gbk_chinese_ci ASC;若是表查询,CONVERT中可以不添加表名。 查询结果如下: 二、JAVA中将中文汉字…

自定义 Gradle 插件进行统一的静态代码分析

静态代码分析是一项了不起的技术, 它能让代码库更易于维护. 但是, 如果你在不同的版本库中拥有多个服务(可能由不同的团队开发), 如何才能让每个人都遵循既定的代码风格呢? 一个好办法是将所有规则封装在一个插件中, 该插件会在每个项目构建时自动执行所需的验证. 因此, 在本…

【2024系统架构设计】回顾历史,查缺补漏篇 ③

前言 hello,大家好: 💡💡💡 我们一起来备考软考高级系统架构设计师吧,本专栏提供综合知识、案例科目、论文(论点和部分示例范文)等内容,包括知识点总结和记忆小妙招哦。 🚀🚀🚀 可以减少资料查找和收集的时间,提高效率,我们一起集中精力学习干货吧! 💡…

Milvus的存储/计算分离

前言 根据数据面与控制面相隔离的原则,从可扩展性和灾难恢复来看,Milvus由4个相互独立的层组成 访问层 由一系列无状态的代理组成,访问层是系统和用户之间的第一层,它主要是验证客户端请求和规整返回的结果 代理是无状态的&am…

GPU学习记一下线程分组相关

在compute的时候,是要dispatch一个数量的代表分了多少块任务集,dispatch的块内部也是有一个数量的,那么这些值怎么取的呢 内部,N卡32 外面dispatch的数量就是all/32 然后细说这个值 这有一个叫core的东西,就是相当于th…

【opencv】答题卡判分实验

实验环境: anaconda、jupyter notebook 实验用的包:numpy、matplotlib、opencv 实验的目的还是以熟悉图像的透视变换、轮廓特征提取为主要目的 关于如何判断答题卡被选项:通过几个覆盖备选项的掩膜与原二值图像想与,最终整个图像…

Springboot+MybatisPlus如何实现带验证码的登录功能

实现带验证码的登录功能由两部分组成::1、验证码的获取 2、登录(进行用户名、密码和验证码的判断) 获取验证码 获取验证码需要使用HuTool中的CaptchaUtil.createLineCaptcha()来定义验证码的长度、宽度、验证码位数以及干扰线…

性能测试工具—jmeter的基础使用

1.Jmeter三个重要组件 1.1线程组的介绍: 特点: 模拟用户,支持多用户操作多个线程组可以串行执行,也可以并行执行 线程组的分类: setup线程组:前置处理,初始化普通线程组:编写…

遥感数据集制作(Potsdam数据集为例):TIF图像转JPG,TIF标签转PNG,图像重叠裁剪

文章目录 TIF图像转JPGTIF标签转PNG图像重叠裁剪图像重命名数据集转COCO格式数据集转VOC格式 遥感图像不同于一般的自然图像,由于波段数量、图像位深度等原因,TIF图像数据不能使用简单的格式转换方法。本文以Potsdam数据集为例,制作能够直接用…

你了解 pom.xml 吗

你了解pomxml吗 springboot 是 java 利器&#xff0c;几乎每个写 java 的同学都会用&#xff0c;但是你了解 pom.xml 吗&#xff1f; 这篇干货查漏补缺。 首先我们创建个 springboot 项目 都选了默认设置&#xff1a; 我把这篇完整粘贴出来 pom.xml <?xml version&quo…

网络安全|隐藏IP地址的5种不同方法

隐藏计算机的IP地址在互联网在线活动种可以保护个人隐私&#xff0c;这是在线活动的一种常见做法&#xff0c;包括隐私问题、安全性和访问限制内容等场景。那么如何做到呢?有很5种方法分享。每种方法都有自己的优点和缺点。 1. 虚拟网络 当您连接到虚拟服务器时&#xff0c;您…

JVM内存模型最新面试题(持续更新)

问题&#xff1a;java中创建的对象一般放在哪里&#xff1f;(全流程包含从创建到回收) 回答 大部分对象在堆中&#xff0c;这个基本都知道&#xff1b; 少部分对象是会在栈中的&#xff0c;比如作用域不局限于方法内的方法内部变量&#xff0c;这类对象的特征一般就是生命周期…

第33次CSP认证Q3:化学方程式配平

&#x1f344;题目描述 为了配平一个化学方程式&#xff0c;我们可以令方程式中各物质的系数为未知数&#xff0c;然后针对涉及的每一种元素&#xff0c;列出关于系数的方程&#xff0c;形成一个齐次线性方程组。然后求解这个方程组&#xff0c;得到各物质的系数。这样&#x…

【C语言】通讯录系统实现

目录 1、通讯录系统介绍 2、代码分装 3、代码实现步骤 3.1制作菜单函数以及游戏运行逻辑流程 3.2、封装人的信息PeoInfo以及通讯录Contact结构体类型 3.3、初始化通讯录InitContact函数 3.4、增加联系人AddContact函数 3.5、显示所有联系人ShowContact函数 3.6、删除联系人D…

视频号小店是个风口吗?今年去做是明智的选择吗?一篇详解!

大家好&#xff0c;我是电商小V 视频号才刚刚推出一年半的时间&#xff0c;可以说自从推出之后这个项目的知名度一直是处于飙升的状态&#xff0c;一直处于爆火的状态&#xff0c;也是吸引了很多想做电商&#xff0c;想去创业的小伙伴&#xff0c;最主要的就是视频号小店背靠的…

流程图用什么软件做?选择这4款,让工作事半功倍

流程图用什么软件做&#xff1f;流程图是一种直观、清晰的图形表示法&#xff0c;它通过节点、箭头和符号等元素&#xff0c;精确地展示出一系列步骤、决策点以及操作过程。这种图形化的呈现方式不仅简化了复杂信息的处理&#xff0c;还使得读者能够迅速把握整体流程&#xff0…

C++容器:list(双向链表)

一丶list介绍 C中的list容器底层确实是以双向链表的形式实现的。 list容器是C标准模板库&#xff08;STL&#xff09;中的一部分&#xff0c;它提供了对列表数据结构的实现。 双向链表结构&#xff1a;list容器的每个元素都是通过指针链接在一起的&#xff0c;每个元素都包含…

C++11 新特性 常量表达式 constexpr

为了解决常量无法确定的问题&#xff0c;C11在新标准中提出了关键字constexpr&#xff0c;它能够有效地定义常量表达式&#xff0c;并且达到类型安全、可移植、方便库和嵌入式系统开发的目的。 一、常量的不确定性 在C11标准以前&#xff0c;我们没有一种方法能够有效地要求一…

为什么Python中会有集合set类型?

知乎上有人提问&#xff0c;为什么Python有了列表list、元组tuple、字典dict这样的容器后&#xff0c;还要弄个集合set&#xff1f; 确实set和list、tuple、dict一样&#xff0c;都是python的主要数据类型&#xff0c;它们的作用是不同的。 因为set是数学意义上的集合&#xf…

战网国际服加速器用哪个好 暴雪战网好用加速器介绍

战网国际版&#xff0c;又称Battle.net环球版&#xff0c;是暴雪娱乐操盘的全球性游戏互动平台&#xff0c;它跨越地理界限&#xff0c;服务于全球游戏爱好者。与地区限定版本相异&#xff0c;国际版赋予玩家自由进入暴雪旗下众多经典游戏的权利&#xff0c;无论身处何方&#…