OOP:Java如何使用封装?用法解析和示例

2021年3月30日10:20:17 发表评论 964 次浏览

封装定义为将数据包装在单个单元下。它是将代码及其所处理的数据绑定在一起的机制。考虑封装的另一种方法是, 它是一种保护性屏蔽, 可防止数据被此屏蔽之外的代码访问。

  • 从封装技术上讲, 一个类的变量或数据对任何其他类都是隐藏的, 并且只能通过声明了它们的自身类的任何成员函数来访问。
  • 与封装一样, 使用数据隐藏概念将类中的数据与其他类隐藏, 这是通过将类的成员或方法设置为私有来实现的, 并且该类向最终用户或整个世界公开, 而无需提供任何实现细节使用抽象概念, 因此也称为隐藏数据和抽象的结合。.
  • 可以通过以下方式实现封装:将类中的所有变量声明为私有, 并在类中编写公共方法以设置和获取变量的值。
封装形式
// Java program to demonstrate encapsulation
public class Encapsulate
{
     // private variables declared 
     // these can only be accessed by 
     // public methods of class
     private String geekName;
     private int geekRoll;
     private int geekAge;
  
     // get method for age to access 
     // private variable geekAge
     public int getAge() 
     {
       return geekAge;
     }
   
     // get method for name to access 
     // private variable geekName
     public String getName() 
     {
       return geekName;
     }
      
     // get method for roll to access 
     // private variable geekRoll
     public int getRoll() 
     {
        return geekRoll;
     }
   
     // set method for age to access 
     // private variable geekage
     public void setAge( int newAge)
     {
       geekAge = newAge;
     }
   
     // set method for name to access 
     // private variable geekName
     public void setName(String newName)
     {
       geekName = newName;
     }
      
     // set method for roll to access 
     // private variable geekRoll
     public void setRoll( int newRoll) 
     {
       geekRoll = newRoll;
     }
}

在上面的程序中, 由于变量被声明为私有, 所以封装了EncapsulateDemo类。将getAge(), getName(), getRoll()之类的get方法设置为public, 这些方法用于访问这些变量。诸如setName(), setAge(), setRoll()之类的setter方法也声明为public, 并用于设置变量的值。

下面显示了访问EncapsulateDemo类的变量的程序:

public class TestEncapsulation
{    
     public static void main (String[] args) 
     {
         Encapsulate obj = new Encapsulate();
          
         // setting values of the variables 
         obj.setName( "Harsh" );
         obj.setAge( 19 );
         obj.setRoll( 51 );
          
         // Displaying values of the variables
         System.out.println( "Geek's name: " + obj.getName());
         System.out.println( "Geek's age: " + obj.getAge());
         System.out.println( "Geek's roll: " + obj.getRoll());
          
         // Direct access of geekRoll is not possible
         // due to encapsulation
         // System.out.println("Geek's roll: " + obj.geekName);        
     }
}

输出如下:

Geek's name: Harsh
Geek's age: 19
Geek's roll: 51

封装的优势:

  • 资料隐藏:用户将不了解类的内部实现。用户将看不到该类如何将值存储在变量中。他只知道我们将值传递给setter方法, 并且变量已使用该值初始化。
  • 更高的灵活性:我们可以根据需要将类的变量设置为只读或只写。如果我们希望将变量设为只读, 则必须忽略上述程序中的setter(), setAge()等setter方法, 或者如果希望将变量设为只读, 则必须忽略上面程序中的get方法, 如getName(), getAge()等。
  • 可重用性:封装还提高了可重用性, 并易于根据新要求进行更改。
  • 测试代码很容易:封装的代码易于进行单元测试。

如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: