What is Access Modifiers
Tags: beginners, programming, tutorial
Published: 2024-04-06 17:53:41

# Access Modifiers

Access modifiers play a crucial role in object-oriented programming languages like C++, Java, and C#. They determine the accessibility of classes, methods, and other members within a program, thus contributing significantly to the principles of encapsulation, abstraction, and information hiding. Let's delve into a comprehensive examination of access modifiers across these languages.

### Core Concepts:

- **Encapsulation:** Bundling data (member variables) and the operations that manipulate that data (member functions) within a single unit (class). Access modifiers control how external code interacts with this data.
- **Abstraction:** Exposing essential functionalities while hiding the underlying implementation details. Access modifiers help achieve this by making certain elements internal to a class or its inheritance hierarchy.
- **Information Hiding:** Protecting sensitive or critical data from unintended modification by restricting access. Access modifiers play a key role in preventing unauthorized access.

> **Summary:** Access Modifiers or Access Specifiers in a class are used to assign the accessibility to the class members, i.e., they set some restrictions on the class members so that they can’t be directly accessed by the outside functions.

# types in languages

## C++

- **Public:** When members of a class are declared under the public specifier, they become accessible from outside the class as well as from within. This means that any function or object outside the class can access public members directly. Public members essentially define the interface of the class, as they represent the functionalities that the class provides to its users.

  - **Use Case:** Public members form the public interface of the class, defining how users interact with it.

- **Private:** The class members declared as private can be accessed only by the member functions inside the class. Direct access to them by any object or function outside the class is prohibited. Only internal functions are allowed to access the private data members of the class.

  - **Purpose:** Encapsulation, protecting sensitive data and implementation details.

- **Protected** Protected access advisor is similar to private access in that it cannot be accessed outside of your class except with the help of a classmate. With the difference that class members declared as Protected can be accessed by any subclass of that class.

  - **Purpose:** Facilitating inheritance, allowing derived classes to access and potentially modify certain aspects of the base class behavior.

> **NOTE:** By default, all members of a class are private if you don't specify an access specifier

#### **[Example](https://github.com/m-mdy-m/algorithms-data-structures/blob/main/2.OOP/concepts/MediumExample/Access-Modifiers/example.cpp)**

### better understanding

![](https://d8it4huxumps7.cloudfront.net/uploads/images/6530f5e8e5b8f_access_specifiers_in_c_01.jpg?d=2000x2000)

---

## java

- **Default  (Package-Private):** When no access modifier is explicitly specified for a class, method, or data member, it is considered to have default access. Default access restricts the visibility of the class, method, or data member to within the same package. This means that classes, methods, or data members with default access can only be accessed by other classes within the same package. for example Imagine a private club where only members can access its facilities. 

- **Public:** The public access modifier has the widest scope among all other access modifiers. They are accessible from everywhere in the program. There is no limit to the scope of public data members. for example similar to a large and welcoming entrance to a public building, public members have the widest range and are accessible from any floor in the program.

- **Private:** Members declared as private are accessible only within the class in which they are declared. This access level provides the highest degree of encapsulation, ensuring that sensitive information or functionality is hidden from external classes. for example think of a safe deposit box that protects valuable assets from unauthorized access. Private members reflect this concept and protect sensitive data from external manipulation. Member functions act as authorized personnel, with the exclusive ability to access and manage private members while respecting encapsulation principles.

- **Protected:** The protected access modifier allows access within the same package and by subclasses, even if they are in different packages. It strikes a balance between encapsulation and inheritance, enabling subclasses to access the members necessary for extending or modifying the behavior of the superclass.  Think of a family inheritance. Certain assets or properties may be accessible to family members, even if they are located in different places. Similarly, protected members are accessible to subclasses, facilitating the inheritance and extension of functionality.

#### **[Example](https://github.com/m-mdy-m/algorithms-data-structures/blob/main/2.OOP/concepts/MediumExample/Access-Modifiers/example.java)**

### better understanding

![](https://codepumpkin.com/wp-content/uploads/2017/09/accessModifier.png.webp)

---

### C#:


1. **Public:** There are no restrictions on accessing public members.

2. **Private: (default):** like c++

3. **Protected:** like c++

4. **Internal:** Access is limited to only the current Assembly, that is any class or type declared as internal is accessible anywhere inside the same namespace. 

>  - better example : Consider a company that has different departments, such as IT engineering, sales, human resources, etc. Now, every section that can be accessed by the users of that section is called internal

5. **Protected Internal:** Protected Internal members are accessible within the same assembly or by derived classes in other assemblies. This access modifier combines the behavior of protected and internal, providing access to derived classes as well as types within the same assembly.

>  - better example : In continuation of the previous example. Now think that the IT department has a supervisor called "IT management" who, for example, when someone gives him money, he shares the money with his team (derived classes).

6. **Private Protected:** Private Protected members are accessible only within the same assembly and by derived classes in the same assembly. They restrict access to a narrower scope compared to protected internal, allowing access only from within the same assembly.

>  - better example : In continuation of the previous example
For example, the IT manager has a document of a program that only his team knows about and is outside the company's work, and none of the company's employees or managers know about it.
It is called Private Protected

**This example was created by CHATGPT**
#### **[Example](https://github.com/m-mdy-m/algorithms-data-structures/blob/main/2.OOP/concepts/MediumExample/Access-Modifiers/example.cs)**

### better understanding

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/prlmzaidpn8pcv7j9gw8.png)

---

### js :

- **Public(default):** members are the default in JavaScript classes. They are accessible in and out of the classroom.  
- **private:** Members marked as private are only accessible within the class itself. Private members are marked with the # symbol. These members are only accessible from within the class itself. They are invisible to external code. Private members provide encapsulation and ensure that the internals of a class remain hidden.
- **Protected:** Members marked as protected are accessible within the class and its subclasses. Members marked as protected are accessible within the class and its subclasses. You can use the protected keyword to define protected members. These members maintain a level of encapsulation while allowing access to subclasses.

### **[Example](https://github.com/m-mdy-m/algorithms-data-structures/blob/main/2.OOP/concepts/MediumExample/Access-Modifiers/example.js)**

### ts:
- **Public(default):** In TypeScript, if no access modifier is specified, the member is by default public, just like in JavaScript. Public members are accessible from outside the class.

- **private:**  Private members are accessible only within the class where they are declared. They are denoted by the private keyword.

- **Protected:** Protected members are accessible within the class where they are declared and by their subclasses. They are denoted by the protected keyword.

### **[Example](https://github.com/m-mdy-m/algorithms-data-structures/blob/main/2.OOP/concepts/MediumExample/Access-Modifiers/exaple.ts)**

---

## Algorithm to use access modifier


1. **Identify Class Members:** Define the variables (data) and methods (functions) that make up your class. These are the members that will have access modifiers applied.

2. **Consider Access Level:** Determine the appropriate access level for each member. There are typically three main options:

## FAQs in Access Modifiers

* **When to use private?** Use private for data that only the class itself needs to manage directly. This helps prevent accidental modification from outside and promotes encapsulation.
* **When to use public?** Use public for data or functionality that other parts of your program need to interact with. 
* **When to use protected?** Use protected for data or functionality that needs to be shared by subclasses but not directly accessed by outside classes. This is helpful for building class hierarchies with common functionality.