示例解析java面向对象编程封装与访问控制

作者:移动安全星球 时间:2021-10-18 19:55:19 

封装(Encapsulation)

是面向对象编程的一个核心概念,它意味着将数据(属性)和方法(操作数据的函数)捆绑在一起,形成一个类(Class)。封装的目的是将数据和操作数据的方法隐藏起来,以防止外部对数据的直接访问。这样,我们就可以通过定义公共接口(Public Interface)来控制外部对类的访问,提高代码的可维护性和安全性。

Java 提供了四种访问修饰符(Access Modifier)来实现封装,它们分别是:publicprivateprotected 和不写(默认)。访问修饰符可以修饰类的属性和方法,不同的访问修饰符有不同的访问权限。

  • public:最高权限,表示该属性或方法可以被任何其他类访问。

  • private:最低权限,表示该属性或方法只能被其所在的类访问。

  • protected:较低权限,表示该属性或方法可以被其所在类及其子类和同一包中的其他类访问。

  • 默认:表示该属性或方法可以被其所在类和同一包中的其他类访问,但不能被子类访问。

通过案例了解这四种访问修饰符

// 位于包 com.example 的 Person 类
package com.example;
public class Person {
   public String name;        // 公共属性,任何类都可以访问
   private int age;           // 私有属性,只能在 Person 类中访问
   protected String address;  // 受保护属性,可以在 Person 类,同一包中的类和子类中访问
   String phoneNumber;        // 默认属性,可以在 Person 类和同一包中的类访问,但不能被子类访问
   public void sayHello() {   // 公共方法,任何类都可以访问
       System.out.println("Hello! I am " + name);
   }
   private void growUp() {    // 私有方法,只能在 Person 类中访问
       age++;
   }
   protected void changeAddress(String newAddress) { // 受保护方法,可以在 Person 类,同一包中的类和子类中访问
       address = newAddress;
   }
   void updatePhoneNumber(String newNumber) { // 默认方法,可以在 Person 类和同一包中的类访问,但不能被子类访问
       phoneNumber = newNumber;
   }
}
// 位于包 com.example 的 Employee 类
package com.example;
public class Employee extends Person {
   public void work() {
       sayHello();            // 可以访问父类的公共方法 sayHello
       changeAddress("New York"); // 可以访问父类的受保护方法 changeAddress
   }
}
// 位于包 com.other 的 Another 类
package com.other;
import com.example.Person;
public class Another {
   public void test() {
       Person person = new Person();
       person.sayHello();     // 可以访问 Person 类的公共方法 sayHello
   }
}

这个例子中,Person 类有四个属性和四个方法,分别使用了四种不同的访问修饰符。Employee 类继承了 Person 类,可以访问其公共方法和受保护方法。Another 类虽然不在同一包中,但是可以访问 Person 类的公共方法。

当我们设计类时,应该尽量将属性设置为 private,并通过公共方法(如 getter 和 setter)来访问这些属性。这样做可以确保类的实现细节不会泄露给外部,提高代码的可维护性和安全性。

来源:https://segmentfault.com/a/1190000043842297

标签:java,封装,访问控制,面向对象
0
投稿

猜你喜欢

  • 利用Matlab复刻羊了个羊小游戏

    2021-10-10 17:13:05
  • MyBatis-Plus工具使用之EntityWrapper解析

    2021-10-09 06:13:48
  • C#中的委托、事件学习笔记

    2023-01-21 18:03:49
  • 浅谈Java多进程程序的运行模式

    2021-07-06 11:06:49
  • Android Studio实现登录界面功能

    2023-06-11 20:27:35
  • 使用SpringCloudApiGateway之支持Cors跨域请求

    2022-10-15 18:28:08
  • Java源码解析之平衡二叉树

    2023-11-29 11:16:40
  • SpringBoot 自定义starter yaml提示失效问题及解决方法

    2022-08-03 14:58:42
  • 关于@Scheduled不执行的原因分析

    2021-06-27 17:13:20
  • Java语法关于泛型与类型擦除的分析

    2023-12-22 06:15:22
  • Android 7.0系统webview 显示https页面空白处理方法

    2021-10-22 09:36:49
  • Java封装的实现访问限定符、包

    2023-03-20 07:08:48
  • idea2020.3.3集成maven及遇到的坑(推荐)

    2021-11-18 04:18:54
  • Android 手写热修复dex实例详解

    2022-11-06 08:01:40
  • C#隐藏手机号、邮箱等敏感信息的实现方法

    2023-12-08 17:17:45
  • Android Flutter实现GIF动画效果的方法详解

    2023-02-06 02:46:37
  • SpringBoot搭配AOP实现自定义注解

    2022-04-07 01:21:59
  • 举例讲解Java的Hibernate框架中的多对一和一对多映射

    2023-09-05 23:05:53
  • Android编程获取GPS数据的方法详解

    2023-09-20 16:37:34
  • RocketMQ之NameServer架构设计及启动关闭流程源码分析

    2021-07-30 20:43:56
  • asp之家 软件编程 m.aspxhome.com