📜  Java的受保护与最终访问修饰符

📅  最后修改于: 2022-05-13 01:54:33.184000             🧑  作者: Mango

Java的受保护与最终访问修饰符

每当我们编写我们的类时,我们必须向 JVM 提供一些关于我们的类的信息,比如这个类是否可以从任何地方访问,是否可以创建子类,是否可以创建对象等。我们可以通过在Java使用适当的关键字访问修饰符来指定此信息。因此访问修饰符用于设置类、方法和其他成员的可访问性。

受保护的访问修饰符

此修饰符可应用于数据成员、方法和构造函数,但此修饰符不能应用于顶级类和接口。成员被声明为受保护的,因为我们只能在当前包中访问该成员,但只能在外部包的子类中访问该成员。

例子

Java
// Java Program to illustrate Protected Access Modifier
 
// Importing required classes
import java.io.*;
import java.util.*;
 
// Class 1
// Declaring a parent class A
class A {
 
    // Declaring a protected method m1()
    protected void m1() { System.out.println("GFG"); }
}
 
// Class 2
// Creating a child class by extending the class A
class B extends A {
 
    // Main driver method
    public static void main(String[] args)
    {
        // Creating an object of parent class
        // using parent reference
        A a = new A();
 
        /// Calling methid m1
        a.m1();
 
        // Creating an object of child class
        // using child reference
        B b = new B();
 
        // Calling method m1
        b.m1();
 
        // Creating an object of child class
        // using parent reference
        A a1 = new B();
 
        // Calling m1 method
        a1.m1();
    }
}


Java
// Java program to Illustrate Final keyword
 
// Importing required classes
import java.io.*;
import java.util.*;
 
// Class 1
// Declaring parent class P
class P {
 
    // Declaring a first name method
    public void firstName()
    {
 
        // Display firstname
        System.out.println("Rahul ");
    }
 
    // Declaring a final surName method
    public final void surName()
    {
 
        // Display surname
        System.out.println("Trivedi");
    }
}
 
// Class 2
// Creating a child class of above parent class
class C extends P {
 
    // Method 1
    // Overriding the surName() method
    public void surName()
    {
 
        // Display suname
        System.out.println("Sharma");
    }
 
    // Method 2
    // Main driver method
    public static void main(String[] args)
    {
 
        // Display message
        System.out.println("GFG");
    }
}


输出

GFG
GFG
GFG

输出说明:

这里我们使用父引用和子引用创建了 3 个对象,并在其上调用了 m1() 方法,并且它成功执行,因此从上面的例子我们可以说我们可以通过使用父引用访问当前包中任何地方的受保护方法或通过儿童参考。

最终访问修饰符

它是适用于类、方法和变量的修饰符。基本上它是指一旦初始化就不能在以后更改的样本。假设如果我们将父类方法声明为 final 则我们不能在子类中覆盖该方法,因为它的实现是 final 并且如果一个类被声明为 final 我们不能扩展该类的功能,即我们不能创建该类的子类,即最终类不可能继承。默认情况下,final 类中的每个方法都是 final 的,但 final 类中的每个变量都不需要是 final 的。 final 关键字的主要优点是我们可以实现安全性,并且可以提供独特的实现。但是 final 关键字的主要缺点是我们缺少像继承(因为 final 类)、多态性(因为 final 方法)等 OOP 的主要优点,因此如果没有特定要求,则不建议使用 final关键词。

简而言之,它是一个简单的修饰符,用于创建最终方法,无论我们想根据要求在程序中创建什么变量。我们使用我们想要制作程序的一部分的地方,从最小的可变到更大的块,无论是考虑出生日期的方法。

final int dob = 25011947 ;

现在你一定想知道我们简单地声明而不是初始化什么,而不是在这种情况下记住值只能在构造函数的帮助下被初始化并且这些构造函数不能被继承。

例子

Java

public static final weekDay ;

输出:

现在让我们讨论这两者之间的差异,以下以表格形式最终列出,如下所示:

                              Protected Access Modifier                         Final Access Modifier
This modifier is not applicable to top-level classes.This modifier is applicable to top-level classes. 
This modifier is applicable to interfaces.This modifier is not  applicable to interfaces 
This modifier is applicable to both the enum and constructor.The final modifier is not applicable to both the enum and constructor. 
This modifier is not applicable for local variables.This modifier is the only modifier that is applicable for local variables. 
We can access protected members from the outside package through child reference.We cannot access final members from the outside package.