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.mzph.cn/bicheng/12946.shtml

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

相关文章

关键字详解

1.用于定义访问权限修饰符的关键字 面向对象程序三大特性:封装、继承、多态。 1.1 访问权限符 Java 中主要通过类和访问权限来实现封装: 类可以将数据以及封装数据的方法结合在一起 ,更符合人类对事物的认知,而访问权限用来控制…

5月15日,机器人任务挑战赛(无人协同系统)第二期培训即将开启!

一.大赛培训通知 本月起,卓翼飞思实验室将针对机器人任务挑战赛(无人协同系统)赛项内容开启赛事培训计划,采用“线上线下”相结合的培训模式,围绕赛事关键技术,让您轻松应对比赛。本期培训为第二期&#x…

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

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

惠普打印机无线网络连接设置

休息一下,灌个水。这次没多少内容,具体步骤惠普官网上都有,唯一增加的是对安装过程中踩的坑做了一个说明。 一.打印机无线网络连接设置步骤 惠普打印机设置无线网络连接,共16个步骤。 1. 在电脑上打开任意浏览器&am…

HAProxy系列文章二《Patroni+ETCD+PG14+HAProxy的安装部署》

瀚高数据库 目录 文档用途 详细信息 文档用途 本文主要介绍Patroni架构下单点HAProxy的安装部署,通过单点HAProxy实现数据库的负载均衡。本文为HAProxy系列文章之一,其他相关文章请点击文档下方的相关文档链接进行详细查看,文章内不在赘述。…

Spring MVC(四) 数据校验

在开发过程中有一环必不可少的部分就是数据校验,用户在页面中填写的数据通过表单提交时,前端的JS可以做一些是否合法性的验证,比如是否为空、两次密码是否一致、格式是否正确等等验证。当数据到了后台控制器,为了确保程序的健壮性…

内网环境ubuntu设置静态ip、DNS、路由,不影响网络访问

内网环境通常是有线的,通过服务器的ip、mac、dns地址访问网络才生效的,如果ip地址变了,就不能访问网络了。 如果你的ip地址变了,或者要防止ip变更影响网络访问,就要设置 1、依次点击右上角的电源-设置,在打…

公司里的“卷王”,是主动卷还是迫于无奈?

先来唠唠 “卷” 这个词是近几年流行起来的网络用语,它是内卷的简化形式,“内卷”本来是一个名不见经传的普通词语,经网络流传,很多人就用其来指代非理性的内部竞争或“被自愿”竞争。 在现代职场,有一群人被戏称为&…

三分钟快速上手SpringSecurity框架

导入依赖框架 web 框架(spring-boot-starter-web) <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> springSecurity 框架(spring-boot-starter-security) <de…

基于单片机的空气质量检测系统设计(51+4G版)-设计说明书

设计摘要&#xff1a; 本设计是基于单片机的空气质量检测系统设计涉及以下主要功能&#xff0c;旨在监测甲烷和一氧化碳的浓度&#xff0c;并在浓度过高时采取相应措施&#xff0c;以确保室内空气质量的安全。该系统使用传感器对甲烷和一氧化碳的浓度进行检测。传感器将收集到…

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

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

AniPortrait详细讲解以及完整搭建流程(有问题留言)

AniPortrait是一款真实感人像动画的音频驱动合成的AI程序。 下面是它的github源码: GitHub - Zejun-Yang/AniPortrait: AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait AnimationAniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animati…

TiDB学习1:TiDB体系架构概览

目录 1. TiDB体系结构 2. TiDBsever 3. TiKV 4. PD(Placement Driver) 5. TiFlash 1. TiDB体系结构 水平扩容或者缩容金融级高可用实时 HTAP云原生的分布式数据库兼容MySQ 5.7 协议 2. TiDBsever 处理客户端的连接SQL语句的解析和编译关系型数据与 kv 的转化(insert语句)S…

线上3D博物馆搭建简单吗?有何优势?有哪些应用场景?

随着科技的飞速发展&#xff0c;传统的博物馆参观方式正在经历一场前所未有的变革&#xff0c;在科技的“加持”下&#xff0c;不少博物馆凭借强大的技术、创意和美学实践&#xff0c;频频“出圈”&#xff0c;线上3D博物馆逐渐崛起&#xff0c;这不仅丰富了人们的文化体验&…

C++|多态性与虚函数(1)功能绑定|向上转换类型|虚函数

目录 什么是多态性&#xff1f; 概念 分类 向上类型转换 功能的早绑定和晚绑定 绑定 绑定与多态的联系 编译时多态&#xff08;功能的早绑定&#xff09; 运行时多态&#xff08;功能的晚绑定&#xff09; 一般而言 实现功能晚绑定——虚函数 虚函数定义的说明 什么…

springboot jar包下config logback外配置文件不生效

描述 与jar 包同级的config目录下放置配置文件 检查1 确定配置配置文件名称为logback-spring.xml 检查2 确定logback-spring.xml 内容正确 检查3 开发环境为 生产环境&#xff08;外配置环境下&#xff09;

寻求发展+兼顾陪读|企业高管赴美国乔治梅森大学做访问学者

E经理拟去美国访学&#xff0c;想达到3个目的&#xff1a;结合本专业方向&#xff0c;扩展至跨学科研究领域&#xff1b;考察市场&#xff0c;寻求新的发展契机&#xff1b;携孩子出国读书&#xff0c;兼顾陪读&#xff0c;并希望尽早出国。最终我们为其落实的乔治梅森大学访问…

会员网站如何创建具有不同仪表盘结构的用户帐户页面

用户帐户页面是中央用户仪表盘&#xff0c;用户可以在其中添加和编辑信息、发布和编辑帖子以及保存收藏夹项目。本教程介绍如何使用“内容”和“重写”模板模式设置帐户页面、为帐户页面创建子页面以及设置个人资料菜单等。 在本教程中&#xff0c;我们将介绍如何使用招聘网站…

PSAI超强插件来袭:一键提升设计效率!

无需魔法&#xff0c;直接在PS中完成图生图、局部重绘、线稿上色、无损放大、扩图等操作。无论你是Windows还是Mac用户&#xff0c;都能轻松驾驭这款强大的AI绘图工具&#xff0c;这款PSAI插件让你的设计工作直接起飞&#xff01; 在之前的分享中&#xff0c;我为大家推荐过两…

Wiley数据库文献哪里比较全?去哪里下载比较高效

Wiley出版社1807年创建于美国&#xff0c;是一家具有超过200年历史的全球知名的出版机构&#xff0c;面向专业人士、科研人员、教育工作者、学生、终身学习者提供必需的知识和服务。 Wiley及旗下的子品牌出版了超过500位诺贝尔奖得主的作品。Wiley Online Library为全学科期刊全…