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

前言

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

封装

什么是封装

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

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

封装的延伸之包

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

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

在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.rhkb.cn/news/328284.html

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

相关文章

Pencils Protocol Season 2 收官在即,展望Season 3 及其权益

此前 Scroll 生态 LaunchPad &聚合收益平台 Pencils Protocol(原 Penpad),推出了首个资产即其生态代币 PDD 的 Launch,Season 2 活动主要是用户通过质押 ETH 代币、组件战队等方式,来获得 Point 奖励,并…

Go微服务: 日志系统ELK核心架构设计

微服务日志系统建设 1 )为什么需要日志系统 业务发展越来越庞大,服务器越来越多各种访问日志,应用日志,错误日志量越来越多,无法管理开发人员排查问题,需要到服务器上查日志 2 )Elastic Stack…

【MySQL】表的增删改查 | CRUD | 新增 | 查询 | 修改 | 删除 | 数据库约束

文章目录 表的增删改查一、CRUD1.新增(Create)1.插入多行2.指定列多行插入3.插入datetime类型4.插入当前时间5.插入查询的结果 2.查询(Retrieve)1.全列查询 *2.指定列查询3.查询字段为表达式4.指定别名 as5.去重 distinct6.排序 o…

人物介绍模板 PSD 源文件免费获取

免费获取 下载链接在最后! 下载链接在最后! 下载链接在最后! 下载链接在最后! 下载链接在最后! 链接:https://pan.baidu.com/s/1sq3e6djMdZt76Sh_uqVxWg 提取码:naun

WPF之DataGird应用

1,DataGrid相关属性 GridLinesVisibility:DataGrid网格线是否显示或者显示的方式。HorizontalGridLinesBrush:水平网格线画刷。VerticalGridLinesBrush:垂直网格线画刷。HorizontalScrollBarVisibility:水平滚动条可见…

SOLIDWORKS 2024云服务新功能

一、简单的分享一下,在线观看,轻松标记 在达索系统SOLIDWORKS 2024云服务中,您只需在达索系统SOLIDWORKS中点击按钮,就可以将当前的设计分享给其他人,无论是客户、供应商还是团队内部成员。共享的用户只要打开浏览器里…

C++:编程世界的永恒之石

在编程的广袤领域中,C犹如一块永恒的基石,历经岁月的洗礼,依旧坚固而璀璨。它的深厚底蕴、强大功能和广泛的应用领域,使其成为无数程序员心中的信仰与追求。 一、C:历史与传承的交汇点 C的历史可追溯到上世纪80年代&…

详解JS的URL()和URLSearchParams() API接口

两个 API 接口定义 URL() 构造函数返回一个新创建的 URL 对象,表示由一组参数定义的 URL。 URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串。 快速了解两个 API 在哪里用 以前我们要对地址栏中的 URL 地址进行分析处理,需要自己进…

Redis如何避免数据丢失?——AOF

目录 AOF日志 1. 持久化——命令写入到AOF文件 写到用户缓冲区 AOF的触发入口函数——propagate 具体的实现逻辑——feedAppendOnlyFile 从用户缓冲区写入到AOF文件(磁盘) 函数write、fsync、fdatasync Redis的线程池 AOF文件的同步策略 触发的入口函数——…

NSSCTF Web方向的例题和相关知识点(二)

[SWPUCTF 2021 新生赛]Do_you_know_http 解题: 点击打开环境,是 提示说请使用wLLm浏览器访问 我们可以更改浏览器信息,在burp重放器中发包后发现是302重定向,但是提示说success成功,说明 我们修改是成功的&#xff…

20232803 2023-2024-2 《网络攻防实践》实践九报告

目录 1.实践内容2.实践过程2.1 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数2.2 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数2.3 注入一个自己制作的shellcode并运行…

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

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

【数据可视化-05】:Plotly数据可视化宝典

一、引言 数据可视化是机器学习流程中不可或缺的一部分。通过图形和图表展示数据,我们可以更直观地理解数据的分布、趋势和关联,从而更有效地进行数据分析、特征工程和模型评估。Plotly是一个功能强大且灵活的数据可视化库,它提供了丰富的图表…

Linux系统 -目录结构与配网

目录的特点 Windows中有C盘、D盘等,每个都是一个根系统是个多根系统 Linux中只有一个根是个单根系统 Linux-目录存储的内容 1、/root:管理员的家目录 2、/home:存储普通用户家目录的目录/3、/tmp:临时目录,这个目录存储…

合并K个升序链表

题目 解法一 优先级队列 思想 将每个链表中的一个节点存放到优先级队列中,本题采用小根堆,将小根堆中的根节点取出,插入到最终的链表中,并且将该节点在原链表中的下一个节点插入小根堆中(需要向下调整)&a…

Python查询和操作HTML文档库之pyquery使用详解

概要 在Web开发和数据抓取中,处理HTML文档是一项常见任务。Python的pyquery库提供了一个强大且灵活的方式来查询和操作HTML文档,类似于jQuery的语法。通过这篇文章,将深入了解pyquery的安装、特性、基本和高级功能,以及它在实际应用中的用例。 安装 安装pyquery相当简单,…

python:SunMoonTimeCalculator

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看: # 描述: https://github.com/Broham/suncalcPy # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 3.11 # Datetime : 2024/5/14 21:59 # User …

MQTT_服务器的安装_1.3

此例子是以Windows系统安装开源版本的EMQX 下载 EMQX 下载并解压 解压如图 进入bin 文件夹在文件目录中输入cmd回车 启动服务器 然后在cmd中输入下面的代码(会弹出一个访问网络的选项,确认可以访问网络) emqx start 结果如图(…

在Linux中安装Docker

如果之前安装过旧版本的 Docker,可以使用下面命令卸载: yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine…

YOLO损失函数——SIoU和Focal Lossr损失函数解析

1. 概述 YOLO(You Only Look Once) 系列模型以其实时目标检测能力而闻名,其有效性在很大程度上归功于其专门设计的损失函数。在本文中,这里将深入探讨YOLO演进中不可或缺的各种YOLO损失函数,并重点介绍它们在PyTorch中…