Java面向对象的封装你了解吗

作者:厚积薄发? 时间:2023-11-06 16:32:38 

面向对象思想之封装

或许大家都听说过java是纯面向对象语言,面向对象思想也就是我们常说的OOP,我们听说最多的思想就是继承,封装,多态,今天我们来讲一讲封装。

什么是封装呢?

封装就是一种将数据和操作数据的方法进行有机结合,一种函数抽象类的接口实现了对细节的封装和隐藏,使得我们只需要调用对外开放的公共接口去实现与对象的交互。我们可以把封装理解为一种保护的屏障,需要一些严格的接口进行控制,我们可以修改自己实现类的内部结构的代码,但是不可以修改那些公共接口。这就提供更好的安全性。

封装的好处意义

  • 好的封装能够减少耦合度

  • 能够对成员变量更精准的控制

  • 实现对细节的封装和隐藏,使得更具有安全性。

  • 可以修改类的内部代码,不用修改那些公共的接口

讲到封装那必然讲到关键字private也就是访问修饰限定符。

回忆一下我们见过哪些访问修饰限定符呢?有public ,还有成员变量什么也不加的默认权限英文是default,还有就是我们今天要讲解的private,下一篇文章会讲解protected。

那private到底有什么用处呢?

我们在来回忆一下上篇文章讲过的类和对象,下面我会创建一个学生类。

//创建一个学生类
class Student {
   public String name;//学生姓名
   public int age;//学生年龄
   public String sex;//学生性别
   public double score;//学生分数
   public void sleep() {
       System.out.println("我要睡觉了!!!");
   }
   public void eat() {
       System.out.println("我要干饭了!!!");
   }
   public void exam() {
       System.out.println("我要考试了!!!");
   }
}
public class TestDemo {
   public static void main(String[] args) {
       Student student = new Student();//利用new关键字实例化一个对象
       student.age = 19;
       student.name = "厚积薄发";
       student.score = 99.9;
       student.sex = "男";
   }
}

以上的代码我们将这个学生成员变量分别赋值。这样写会不会有什么不足呢?

想一想,如果我们每次要定义一个学生对象,每次都要这样赋值会不会有点太麻烦?今天我们讲到封装就会让它更简单一些。请看下面代码:

class Student {
   private String name;//学生姓名
   private int age;//学生年龄
   private String sex;//学生性别
   private double score;//学生分数
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
}
public class TestDemo {
   public static void main(String[] args) {
       Student student = new Student();
       student.setName("厚积薄发");
       System.out.println(student.getName());
   }
}

根据封装的概念我是不是可以给它封装成一个公共的接口然后调用。

好接下来分析一下这个代码:

Java面向对象的封装你了解吗

Java面向对象的封装你了解吗

Java面向对象的封装你了解吗

 所以,我们在成员变量前面加上private修饰使得成员变量只能在类的内部访问,不能在类的外部访问,然后我们实现了setName getName方法,调用者两个接口就可以进行初始化和返回值操作,更好地体现了封装性。

getter方法和setter方法

为了更方便的调用这些接口,IDEA会为我们提供了这些接口,我们通常情况下把这些方法叫做getter方法和setter方法。只要我们需要我们就可以调用这些共有的getter方法和setter方法。

IDEA快捷键:Alt + insert

Java面向对象的封装你了解吗

class Student {
   private String name;//学生姓名
   private int age;//学生年龄
   private String sex;//学生性别
   private double score;//学生分数
   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 String getSex() {
       return sex;
   }
   public void setSex(String sex) {
       this.sex = sex;
   }
   public double getScore() {
       return score;
   }
   public void setScore(double score) {
       this.score = score;
   }
   public void sleep() {
       System.out.println("我要睡觉了!!!");
   }
   public void eat() {
       System.out.println("我要干饭了!!!");
   }
   public void exam() {
       System.out.println("我要考试了!!!");
   }
}
public class TestDemo {
   public static void main(String[] args) {
       Student student = new Student();//利用new关键字实例化一个对象
       student.setName("厚积薄发");
       student.setAge(19);
       student.setScore(99.9);
       student.setSex("male");
       System.out.println(student.getName());
       System.out.println(student.getAge());
       System.out.println(student.getScore());
       System.out.println(student.getSex());
   }
}

toString方法

此外,我们每个成员变量都要自己实现一遍打印操作,没错IDEA编译器又为我们提供了一个方法,这个方法叫做toString方法,快捷键是 Alt +insert然后选择toString方法。

Java面向对象的封装你了解吗

 我们直接打印对象的引用就可以调用toString方法.

有同学就会问为什么呢?

这就得需要我们看一看println的源码是怎么实现的了。

我们按住ctrl 点进println这个方法

Java面向对象的封装你了解吗

 我们通过源码就可以发现,println会调用toString方法,如果定义了toString方法,那他就调用toString方法,如果没有调用他就会打印:

Java面向对象的封装你了解吗

 eg:

Java面向对象的封装你了解吗

快捷键: Alt + insert  选择constructor

Java面向对象的封装你了解吗

总结:

private关键字:利用private修饰的成员变量和方法只能在本类中访问,如果在外部访问可以调用公有的setter方法和getter方法。

封装的优点:减少代码的耦合性    , 可以自由修改自己的内部类,不用修改公有地接口 ,隐藏信息实现细节,更精准的控制成员变量。

要记住并且运用并且调用这些公共的接口:getter方法和setter方法 还有toString方法以及 构造方法。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容! 

来源:https://blog.csdn.net/m0_61210742/article/details/123780102

标签:Java,面向对象,封装
0
投稿

猜你喜欢

  • Android学习教程之圆形Menu菜单制作方法(1)

    2022-05-23 03:08:50
  • C# SendInput 模拟鼠标操作的实现方法

    2022-03-15 00:07:25
  • Java使用@EnableEurekaServer实现自动装配详解

    2023-08-23 19:50:32
  •  java中StopWatch的使用详解

    2023-12-21 03:19:04
  • 解决SpringCloud下spring-boot-maven-plugin插件的打包问题

    2022-03-10 14:35:59
  • Springboot实现动态定时任务流程详解

    2022-09-28 02:26:55
  • Java读写文件创建文件夹多种方法示例详解

    2022-11-17 01:08:48
  • C#实现添加多行文本水印到Word文档

    2023-03-22 07:45:33
  • Android UI效果之绘图篇(一)

    2022-03-24 08:30:51
  • Android仿开心消消乐大树星星无限循环效果

    2021-10-04 07:19:06
  • Android Studio 3.0 原生支持kotlin 例子详解

    2023-10-30 04:28:14
  • SpringBoot下使用定时任务的方式全揭秘(6种)

    2022-06-13 01:34:48
  • C++实现企业职工工资管理系统

    2023-11-02 17:34:34
  • Java中BigInteger与BigDecimal类用法总结

    2021-09-14 07:15:26
  • C#将Sql数据保存到Excel文件中的方法

    2023-11-11 08:34:26
  • idea推送项目到gitee中的创建方法

    2021-08-19 11:27:14
  • Android studio 出现错误Run with --stacktrace option to get the stack trace. Run with --info or --debu

    2022-10-25 09:43:15
  • SpringBoot AOP方式实现多数据源切换的方法

    2023-04-08 20:58:08
  • Java 通过API操作GraphQL

    2021-12-24 03:21:49
  • Android EasyBarrage实现轻量级弹幕效果

    2022-03-07 06:46:31
  • asp之家 软件编程 m.aspxhome.com