JavaSE——类和对象(二)~~封装

news2024/11/18 14:38:27

目录

一.封装

二.封装扩展之包

三.static成员

四. 代码块

五. 内部类(重要)


大家好呀,我是北纬,接着上节我们继续讲解Java中关于类和对象的相关知识,今天着重给大家介绍一下关于面向对象程序的特性之一——封装。

一.封装

1.什么是封装

封装是面向对象程序三大特性之一,面向对象程序有三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性,何为封装呢?简单来说就是套壳屏蔽细节
类比一下比如说:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器,USB插孔等,让用户来和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
2.访问限定符

Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:
【说明】:

          1.private同一包中的同一类,也就相当于自己的秘密只有自己知道,所以被private修               饰的成员变量和方法只能在本类中的成员方法中可以调用。

          2.default是什么都不写时的默认权限,同一包中的不同类,被default修饰的成员方法               和成员变量在同一个包中可以被其他类中的成员方法调用。   
          3.protected主要是用在继承中,后期会有详细讲解这里就不赘述了。
          4. 访问权限除了可以限定类中成员的可见性,也可以控制类的可见性。

3.如何实现封装

使用private关键字对类里面的成员变量进行隐藏,这里可以利用settergetter方法对隐藏的成员变量进行访问。

代码示例:

【说明】:这里的settergetter方法可以借助我们的编译器idea自动生成。

二.封装扩展之包


1 .包的概念

在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。
在Java中引入了包,包是对类、接口等的封装机制的体现是一种对类或者接口等的很好的组织方式。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可
2.导入包中的类

Java 中已经提供了很多现成的类供我们使用。例如Date类:可以使用 java.util.Date 导入java.util 这个包中的 Date类,但是这种写法比较麻烦一些,可以使用 import语句导入包。


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

如果需要使用 java.util 中的其他类, 可以使用 import java.util.*


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

但是我们更建议显式的指定要导入的类名,否则还是容易出现冲突的情况。也可以使用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);
   }
}

注意事项: import C++#include 差别很大。C++ 必须 #include 来引入其他文件内容, 但是 Java 不需要。import 只是为了写代码的时候更方便 import 更类似于 C++ 的 namespace 和using
3.如何自定义包

基本规则:

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

操作步骤
              1. 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包。

              2. 在弹出的对话框中输入包名, 例如 com.bite.demo1。
              3. 在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可。
              4. 此时我们可以看到, 在新创建的 Test.java 文件的最上方, 就出现了一个 package 语句

三.static成员

1.static修饰成员变量

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

【静态成员变量特性】
          1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中。
          2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问。
          3. 类变量存储在方法区当中。
          4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)。

public class Student{
public String name;
public String gender;
public int age;
public double score;
public static String classRoom = "Bit306";
// ...
public static void main(String[] args) {
// 静态成员变量可以直接通过类名访问
System.out.println(Student.classRoom);
Student s1 = new Student("Li leilei", "男", 18, 3.8);
Student s2 = new Student("Han MeiMei", "女", 19, 4.0);
Student s3 = new Student("Jim", "男", 18, 2.6);
// 也可以通过对象访问:但是classRoom是三个对象共享的
System.out.println(s1.classRoom);
System.out.println(s2.classRoom);
System.out.println(s3.classRoom);
   }
}

大家可以以调试的方式运行上述代码,然后在监视窗口中可以看到,静态成员变量并没有存储到某个具体的对象中。

2.static修饰成员方法

Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的,静态成员一般是通过静态方法来访问的。


【静态方法特性】
              1. 不属于某个具体的对象,是类方法。
              2. 可以通过对象调用,也可以通过类名.静态方法名(..)方式调用,更推荐使用后者。
              3. 不能在静态方法中访问任何非静态成员变量。
              4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法                      中调用时无法传递this引用。
              5. 静态方法无法重写,不能用来实现多态

public static String getClassRoom(){
doClass();
return classRoom;
}

上述程序就会编译错误,因为无法从静态方法中引用非静态方法 doClass()。

四.代码块


1. 代码块概念以及分类
使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种即普通代码块,构造代码块,静态代码块,同步代码块。
普通代码块用的较少这里重点介绍一下构造代码块和静态代码块,同步代码块后期会讲到。

2. 构造代码块
构造代码块:定义在类中的代码块(不加修饰符),也叫:实例代码块,构造代码块一般用于初始化实例成员变量。


//实例代码块
{
this.name = "beiwei";
this.age = 20;
this.sex = "man";
System.out.println("实例代码块!");
}

3. 静态代码块
使用static定义的代码块称为静态代码块,一般用于初始化静态成员变量。
代码示例:

注意事项:

       1. 静态代码块不管生成多少个对象,其只会执行一次
       2. 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的。
       3.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行
       4. 实例代码块只有在创建对象时才会执行。


五. 内部类(重要)


当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。在 Java 中,可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类,内部类也是封装的一种体现
注意:
   1. 定义在class 类名{}花括号外部的,即使是在一个文件里,都不能称为内部类。
   2. 内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件1 .内部类的分类

根据内部类定义的位置不同,一般可以分为这几种形式,实例内部类,静态内部类,局部内部类。

public class OutClass {
// 成员位置定义:未被static修饰 --->实例内部类
public class InnerClass1{
} /
/ 成员位置定义:被static修饰 ---> 静态内部类
static class InnerClass2{
}
public void method(){
// 方法中也可以定义内部类 ---> 局部内部类:几乎不用
class InnerClass5{
    }
  }
}

2.实例内部类
即未被static修饰的成员内部类。

代码示例:

如何实例化内部类对象,这里语法有点怪异,大家适应一下。

注意:
1. 外部类中的任何成员都可以在实例内部类方法中直接访问。
2. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束。
3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问。
4. 实例内部类对象必须在先有外部类对象前提下才能创建。
5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用。
6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。

3.静态内部类

被static修饰的内部成员类称为静态内部类。

对静态内部类对象的实例化:

public static void main(String[] args) {
        OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2();  //静态内部类对象的实例化

    }

【注意事项】

           1. 在静态内部类中只能访问外部类中的静态成员。
           2. 创建静态内部类对象时,不需要先创建外部类对象。

 

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

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

相关文章

FPGA 纯逻辑arinc818 ip core

1、 符合FC-FS、FC-AV、FC-ADVB协议规范; 2、符合ARINC818协议规范; 3、支持光纤通信Class1、Class3服务; 5、可动态配置光纤端口速率,支持1.0625Gbps、2.125Gbps、3.1875Gbps、4.25Gbps可配置; 6、DDR控制接口简洁…

【01】全面理解JVM虚拟机

一、前言 学习JVM是进行JVM调优的基础。写的代码部署到线上它会如何运行?要配多少内存?线上环境出问题了,服务崩溃了,应该怎么快速定位?这些问题都与JVM有着一定的关系。好的程序员都应该尽自己的能力把JVM每个底层逻…

记录github小程序短视频系统的搭建过程

GitHub - lkmc2/AwesomeVideoWxApp: 《倾心短视频》微信小程序 这个项目按readme中的来可以部署成功,但是会发现图片、视频全是空的,如下图: 修改源代码,更换图片上传与保存地址 大概涉及到这些代码块,进行更改即可。…

HarmonyOS interface router scale pageTransition SlideEffect.Left ArkTS ArkUI

🎬️create Component export default struct TitleBar {build(){Row(){Text(transition).fontSize(30fp).fontColor(Color.White)}.width(100%).height(8%).backgroundColor(#4169E1).padding({left:10})}}🎞️interface export interface IList{ti…

【zotero6】ZotCard笔记模板分享

zotcard插件下载链接:传送门 因为zotero出了新的zotero7,现在下载插件会出现zotero6和zotero7不兼容的情况,通过这个链接可以区分适配不同版本的插件。 下载后点击工具的附加组件 然后选择通过文件添加 就可以添加插件了 再通过 工具->…

第十三期Big Demo Day亮点项目:CCarbon重塑碳交易生态,助力全球绿色发展

第十三期Big Demo Day活动即将于2024年5月28日在香港数码港的CyberArena隆重举行。我们荣幸地宣布,利用区块链技术优化全球碳交易CCarbon项目将亮相,参与精彩的项目路演。本次活动由ZeeprLabs、BiKing Exchange、Gather冠名赞助,Central Rese…

commvault学习(8):备份与恢复sql server

1.安装sql server2008r2 安装sql server 2.在客户端添加cv代理mssql server 如果此前的cv代理中没有sql server,那么可以手动再补充 点击setup 添加MSSQL Server 将程序添加到windows防火墙排除表 勾选自动探寻实例 3.备份sql server 3.1配置数据库内容 右击默…

HLS入门

一. HLS是什么?与VHDL/Verilog编程技术有什么关系? 高层次综合 (HLS) 抽象级别更高:HLS允许设计者在更高的抽象级别上工作,使用高级编程语言来描述硬件的功能。这种方法减少了设计者需要处理的底层细节,使得设计过程更加高效。…

下一代Docker会让部署更丝滑吗

下一代Docker会让部署更丝滑吗 如何通俗易懂的理解DockerDocker有什么缺点Docker与AI结合,会让部署更加丝滑吗 随着互联网技术的不断发展,单机系统已经无法满足日益正常的用户量以及正常处理用户请求,这个时候就需要进行多机部署,…

JDBC(Java DataBase Connectivity)Java数据库连接

JDBC(Java DataBase Connectivity) Java 语言连接数据库 再本模块中,java提供里一组用于连接数据库的类和接口Java 语言开发者,本身没有提供如何具体连接数据库的功能只是定义了一组java程序连接数据库的访问接口 连接到数据库向数据库发送增,修改,删除这一类的sql发送查询sq…

学习Thymeleaf时遇到的问题

使用idea创建web项目,启动服务器后无法访问页面 原因是tomcat 新版本引用包名改变 由javax变为jakarta 解决办法1 把项目的poe.xml文件由 改为 解决办法2 新建项目时选择新版本,但是新版本不支持thymeleaf

uniapp android使用uni.chooseLocation,app云打包后,定位地址列表一直在加载中

复现BUG 1、自己生成一个证书 参考生成证书流程 2、使用刚生成证书的SHA1 ,重新创建一个高德key 高德开放平台地址 3、打包(打包的包名要与高德申请key所填的包名一致)

从零搭建python环境:深入解析虚拟环境与Python版本管理

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:为何需要虚拟环境? 二、虚拟环境的创建与命名 1. 虚拟环境…

Spark SQL【Java API】

前言 之前对 Spark SQL 的影响一直停留在 DSL 语法上面,感觉可以用 SQL 表达的,没有必要用 Java/Scala 去写,但是面试一段时间后,发现不少公司还是在用 SparkSQL 的,京东也在使用 Spark On Hive 而不是我以为的 Hive O…

FastSAM 部署 rknn

基于yolov8(ultralytics)工程导出的FastSAM的onnx模型,后处理和yolov8seg是一样的。      模型和完整测试代码。 1 FastSAM 导出 onnx 导出onnx的方式有两种,一种使用FastSAM工程,一种是使用yolov8(ultralytics)工程。本篇博客使用yolov…

Unity在Windows平台播放HEVC/H.265格式视频的底层原理

相关术语、概念 HEVC/H.265 HEVC(High Efficiency Video Coding)是一种视频压缩标准,也被称为H.265。它是一种高效的视频编码标准,可以提供比之前的标准(如H.264)更高的压缩率,同时保持较高的…

【LabVIEW FPGA入门】使用事件发生函数同步FPGA循环

1.使用事件发生函数 使用 Occurrences 函数来控制单独的同步活动。特别是,当您希望程序框图的一部分等待程序框图的另一部分完成任务而不强制 LabVIEW 进行轮询时,请使用这些函数。 您可以使用全局变量执行类似于occurrences函数的功能,通过一…

QT教程-一,初识QT

目录 一,QT是什么?能够使用它做什么? 二,Qt 能够使用的语言 三,Qt主要用于什么领域? 四,Qt开发的软件 一,QT是什么?能够使用它做什么? Qt是一个跨平台的 C 开发库,主…

二十六篇:嵌入式系统行业全景:应用、趋势与市场洞察

嵌入式系统行业全景:应用、趋势与市场洞察 1. 行业应用案例分析 1.1 汽车电子 引言 在飞速发展的科技领域,汽车电子正逐步成为现代汽车设计中的核心。嵌入式系统在这一进程中充当了枢纽的角色,不仅推进了车辆性能的极限,还不断…

WordPress国外超人气主题Vikinger汉化版

WordPress国外超人气主题Vikinger汉化版 前言效果图安装教程领取主题下期更新预报 前言 我们在上一个教程已经学过如何安装WordPress,所以现在不用多说。 效果图 安装教程 下载后先本地解压,找到vikinger.zip文件,上传安装并启用主题。 访…