当前位置: 首页 > news >正文

【Java面向对象三大特征——封装】

在这里插入图片描述

](https://img-home.csdnimg.cn/images/20220524100510.png#pic_center)

🌈个人主页: Aileen_0v0
🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法
💫个人格言:“没有罗马,那就自己创造罗马~”

文章目录

  • `面向对象三大特征`
    • `封装Encapsulation`
      • `运行结果:`
      • `实用tips:`
    • `包`
    • `包访问权限`
    • `不同访问修饰符在Java中的访问权限`
    • `static成员`
      • `static修饰成员变量`
      • `static修饰方法`
      • `静态初始化的方法`
    • `代码块{}`
      • `普通代码块`
      • `构造代码块`
      • `静态代码块`
    • `toString()`

在这里插入图片描述

数据类型类别类型位大小默认值
基本数据类型描述描述描述
整型byte8位0
整型short16位0
整型int32位0
整型long64位0
浮点型float32位0.0
浮点型double64位0.0
字符型char16位‘\u0000’
布尔型boolean-false
引用数据类型描述描述描述
class-null
接口interface-null
数组array-null
枚举enum-null
注解annotation-null

面向对象三大特征

封装Encapsulation

封装:不仅仅是将public变成private,而是通过将类的属性和实现细节隐藏起来,只暴露必要的部分(对外只提供一些开放的接口)。这可通过设置属性为private,protected来实现,防止外部直接修改或访问对象的状态(属性)。

封装的核心理念:隐藏内部实现细节,提控制访问的方式。通过类内提供的public的访问方法(如gettersetter)或其他操作方法,来安全的访问或修改内部属性。这确保了对象的状态只能通过特定的方法改变,从而提高数据的安全性和代码的可维护性。

在这里插入图片描述

通过private类修饰的方法或属性只能在当前类内进行调用。
package com.javastudy.demo;
import java.util.*; //*表示通配符,只要所用的东西都在util文件夹下,它都能帮你找到class Student{
//    --> 通过private进行封装private String name;public  int age;//通过公开方法修改成员变量public void setName(String name) {this.name = name;}//通过公开方法获取修改后的成员变量public String getName(){return  this.name;}//构造方法的创建public Student(String name, int age) {this.name = name;this.age = age;}//普通方法的创建public void eat(){System.out.println(this.name+ " 正在吃饭!");}
}public class Test {public static void main(String[] args) {Student student1 = new Student("Aileen",21);student1.eat();student1.setName("Ling");System.out.println(student1.getName());student1.eat();}
}

运行结果:

在这里插入图片描述

通过上面运行结果可知,在创建对象student1的时候我们给它的属性赋值为“Aileen”和21,当我通过调用公开set设置完成员变量以后,“Aileen”就变成了“Ling”,并且通过调用公开的eat方法,我们也可以知道,变量名发生考虑了改变,
于是我们可以得出以下结论:封装了的属性可以间接通过公开的set方法在类外来进行修改,并且可以通过在类内设置get方法来回获取修改后的属性,类外进行相应的get方法的调用即可。

实用tips:

在这里插入图片描述

当我们有很多属性要实现封装并对其进行修改和调用的时候,我们可以通过点击鼠标右键或者fn+alt+insert点击Generate这个选项,就会弹出get and set方法的批量设置,我们选中我们要修改的变量即可生成对应字段(成员变量)的get and set方法。

Java当中包就是文件夹,同一个包同一个类就是如下图所示:
在这里插入图片描述


同一个包不同类,如下所示:
在这里插入图片描述

包访问权限

在Java中,包访问权限(也称为默认访问权限或者包私有权限)是一种没有明确指定访问修饰符(如 public, private, 或 protected)的成员(包括类、接口、变量和方法)的访问级别。这种权限也被称作“默认访问级别”。

具体来说,当一个类成员没有被任何访问修饰符修饰时,它拥有包访问权限。这意味着只有同一个包内的其他类可以访问这些成员。不在此包中的类无法访问这些成员,即使是这些类的子类也不行。

  • 包访问权限的特点如下:

    • 局限于同一包内:只有同一个包内的类可以访问没有访问修饰符的成员。
    • 不影响类的继承:即使一个类继承了具有包访问权限的另一个类,如果这两个类不在同一个包中,子类也无法访问父类的包访问权限成员。
    • 适用于类、接口、变量和方法:这种访问级别可以用于类、接口及其成员变量和方法。

在这里插入图片描述
在这里插入图片描述
同一个包不同类调用,输出结果为99.
在这里插入图片描述
同一个包同一个类调用,输出结果也是99。

在这里插入图片描述

不同访问修饰符在Java中的访问权限

访问修饰符同一包中的同类同一包中的不同类不同包中的子类不同包中的非子类
private
default (no modifier)
protected
public

static成员

static修饰成员变量

被static修饰的成员变量不属于对象属于类,相当于公共的东西它不依赖于对象,只能通过它所属的类来访问,虽然通过对象访问没有报错,但是不合理。
在这里插入图片描述

package com.javastudy.demo;
import java.util.*; //*表示通配符,只要所用的东西都在util文件夹下,它都能帮你找到
import static java.lang.Math.pow;class Student{
//    --> 通过private进行封装private String name;private   int age;private  String classroom;public String getClassroom() {return classroom;}public void setClassroom(String classroom) {this.classroom = classroom;}public class Test {public static void main(String[] args) {Student student1 = new Student("Terry",10);student1.setClassroom("A-101");//----------------------------------------------------------------------Student student2 = new Student("kendrid",11);student2.setClassroom("A-101");//----------------------------------------------------------------------Student student3 = new Student("Mike",12);student3.setClassroom("A-101");//----------------------------------------------------------------------System.out.println(" ");}

在这里插入图片描述
假设三个同学是同一个班的,,那么他们上课肯定是在同一个教室,那能否给类中再加一个成员变量,来保存同学上课时的教室?

在这里插入图片描述

  • 这种方法不现实,因为在Student这个类中定义的成员变量,每个对象都会包含一份(即实例变量),因为需要使用这些信息来描述具体的学生。现在要表示学生上课的教室,这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所有的学生来共享。
  • 在Java中,被static修饰的成员,称为静态成员,也可称为类成员,其不属于某个具体的对象,是所有对象共享的
  • 静态的成员变量随着类被加而创建,随着类被销毁而销毁
  • ⚠️此外注意,静态的只能是成员变量,即在类内方法外的变量,static不能修饰局部变量。

static修饰方法

在这里插入图片描述
在这里插入图片描述
我们根据上面的运行结果可以看出name这个属性的访问是需要对象的,而我们用static修饰的这个方法是不能够用对象去访问的,这就会导致在使用的时候报错,因为静态方法的内部不能使用非静态的数据成员,非静态方法有this参数,在静态方法调用时候无法传递this引用,但非静态方法里面可以调用静态的东西。
在这里插入图片描述
通过上面的运行结果我们可以得出以下结论:非静态方法的调用,如eat是通过创建的对象student1去进行访问的,在eat这个非静态方法里面我们调用了静态方法sleep,静态方法可以通过类名进行调用

在这里插入图片描述

⚠️虽然静态成员变量通过对象去访问不合理,但是我们还是能用的,如上代码所示,我们①-③通过创建的对象去修改了静态的成员变量,让他每次加1,在第四个我们通过类名去调用它的成员变量并让他减1,得到最终答案为102。

静态初始化的方法

  • 1.直接赋值进行初始化。

在这里插入图片描述

  • 2.通过静态代码块进行初始化

代码块{}

使用{}定义的一段代码称为代码块。

普通代码块

在这里插入图片描述

构造代码块

用来初始化非静态的数据成员(也可以初始化静态)

静态代码块

用来初始化静态成员变量
在这里插入图片描述
在这里插入图片描述

  • 从上面的运行结果我们可以对比得出以下结论:
    • 静态代码块在类加载时执行,所以无论是否创建对象,只要类被加载,静态代码块就会先执行,并且只执行一次。
    • 实例代码块在每次创建对象时执行,所以当创建第一个对象时,实例代码块和构造方法都会执行。当创建第二个对象时,实例代码块和构造方法再次执行。
    • 即使没有调用静态代码块里面的内容(比如静态变量或静态方法),静态代码块依然会在类加载时执行。

在这里插入图片描述

特性静态代码块普通代码块实例代码块
关键字static{}无特殊关键字{} 包裹,无 static 关键字
执行时机类加载时执行,只执行一次每次调用方法或逻辑块时执行每次创建对象时执行
执行顺序在类的任何静态成员前执行根据调用逻辑执行在构造方法之前执行
用途类级别的初始化,初始化静态变量方法或代码块级别的逻辑处理实例级别的初始化
是否依赖对象不依赖对象,只依赖类的加载与对象无关,和方法逻辑有关依赖对象,每个对象创建时执行
是否可以访问实例变量不能直接访问实例变量,只能访问静态变量可以访问方法范围内的变量可以访问实例变量和静态变量
执行次数只执行一次由方法调用次数决定每创建一个对象执行一次
典型用途初始化静态变量、注册驱动等在方法内部处理逻辑初始化实例变量

在这里插入图片描述
根据上面的代码我们可知,一个类中可以包含多个静态代码块,在编译代码时,编译会根据定义的先后顺序依次执行(就是把多个静态代码块合并成一个),如下图所示:
在这里插入图片描述


在这里插入图片描述

在这里插入图片描述
通过上面的运行结果我们可知:我们可以通过创建对象然后调用get方法和set方法来直接给我们封装好的属性来赋值,并通过对象来访问对应的成员方法,而对于静态HaveFun方法我们则通过类名进行访问。

我们也可以通过再创建一个Dog的无参构造方法来进行属性的赋值
在这里插入图片描述
然后我们通过创建Dog的对象来调用show方法将所有的属性值打印出来,如下图所示:
在这里插入图片描述


toString()

在这里插入图片描述

为什么打印对象的结果会是这样子呢?

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

在这里插入图片描述

通过对比我们两段代码的打印结果,我们可以得出以下结论:当我们调用Java内部的重写方法toString()方法的时候,对象的属性就能完完整整的打印出来,而当我们没有调用这个重写方法的时候,打印出的是这个类对应的路径和它的对象的哈希值的组合。下面让我们来介绍一下Java当中,这个toString方法的相关知识吧,加深对它的理解~

toString:是Java中一个非常重要的方法,他定义在java.lang.Object类中,这意味着所有的Java类都继承了这个方法。toString()方法的主要作用是返回一个代表对象值的String,通常包括类的名称和对象的属性信息。

    • toString() 方法的作用:
  • 提供对象的字符串表示:这是最直接的作用,它允许开发者获取对象的字符串表示形式,便于调试和显示。

  • 调试和日志记录:在调试程序或记录日志时,经常需要将对象转换为字符串形式以便查看其状态。

  • 数据展示:在用户界面显示对象信息时,通常需要将对象转换为易于阅读的字符串形式。

  • 网络传输:在网络通信中,对象通常需要被序列化为字符串形式进行传输。

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

toString()方法的主要功能就是提供更有意义的表示对象,使得打印和显示对象时能够看到对象的属性和状态,如果不重写,将只能提供一个不太有用的默认字符串表示,因此在开发中,通常会为自定义的类重写toString()方法,以便于调试和数据展示。

在这里插入图片描述


通过重写我们可以将对应的属性值打印出来

在这里插入图片描述


在这里插入图片描述
因为static修饰的是类变量,类变量是公共的,只能通过类去访问,而不能通过对象去访问,所以编译会发生报错。如果没有static修饰,当j调用这个方法的时候,就会打印出1。

在这里插入图片描述
在这里插入图片描述
在Java中我们不能import导入指定的包,我们只能导入指定的类或者是通配符,如第二行import语句那样会导致报错。


http://www.mrgr.cn/news/57238.html

相关文章:

  • 地图导航平台怎么标注店铺定位?
  • Java项目-基于springboot框架的游戏分享系统项目实战(附源码+文档)
  • 因为一句废话,大模型无法解决小学数学题?
  • javaweb-mybatis之动态sql
  • Servlet学习--从概述到Cookie
  • Python 第六节 变化的文字
  • 青训营 X 豆包MarsCode 技术训练营--充电总时间计算
  • 智能体能和人工智能有什么区别?
  • 云岚到家系统优化
  • 8阻塞队列
  • Python项目内网环境pdm install超时httpx.ReadTimeout: timed out
  • Vue Router实现路由懒加载
  • 简记 Vue3(一)—— setup、ref、reactive、toRefs、toRef
  • Linux中如何理解一切皆文件
  • Python包——Matplotlib
  • 各种数据类型的定义与常规计算
  • 第23周Java主流框架入门-SpringMVC 3.拦截器
  • 【单元测试】深入解剖单元测试的思维逻辑
  • 【论文速看】DL最新进展20241023-多模态、无监督学习、多任务、图像修复
  • 【哈工大_操作系统实验】Lab8 终端设备的控制
  • 买华为系的车,这个理由无法拒绝
  • hass docker openwrt配置
  • 软件分享丨PDF Shaper
  • 不错的二次元个人导航页源码
  • 从新手到高手:map和set的使用技巧全攻略(C++)
  • 重学SpringBoot3-集成Hazelcast