Java 如何从另一个包访问受保护的变量

Java 如何从另一个包访问受保护的变量,java,visibility,packages,access-specifier,Java,Visibility,Packages,Access Specifier,在这里,我想访问另一个包package2的受保护变量rollno。 所以伙计们,我把这两个程序都放进去了: 因此,在这里,当我运行Check.java时,它会抛出一个未定义的错误Protected1 这里的唯一目标是将受保护变量从package test访问到package2 package test; import java.io.*; import java.util.*; import java.lang.*; public class Protected1 { static pr

在这里,我想访问另一个包
package2
的受保护变量
rollno
。 所以伙计们,我把这两个程序都放进去了: 因此,在这里,当我运行
Check.java
时,它会抛出一个未定义的错误
Protected1
这里的唯一目标是将受保护变量从package test访问到
package2

package test;
import java.io.*;
import java.util.*;
import java.lang.*;
public class Protected1
{
    static protected int rollno;
    static public String name;
    static private int mobileno;
    public void Protected1()
    {
        System.out.println("lets start doing the Assignment for Protected variable                                                                 assigning in another package");
    }

    public static void main(String a[])
    {

        /*protected int rollno;
        public String name;
        private int mobileno;*/
        Scanner br=new Scanner(System.in);
        //Protected1 st=new Protected1();
        try
        {
            System.out.println("Enter the name:");
            name=br.nextLine();
            System.out.println("Enter the rollno:");
            rollno=br.nextInt();
            System.out.println("Enter the mobile number:");
            mobileno=br.nextInt();
            System.out.println("lets just print it out:");
            System.out.println("name is \t"+name);
            System.out.println("rollno is \t"+rollno);
            System.out.println("mobileno is \t"+mobileno);
        }
        catch(Exception e)
        {
            System.out.println("Exception caught");
            e.getMessage();
        }

    }
}


package package2
import java.io.*;
import java.util.*;
import test.* ;

public class Check extends Protected1 
{
    public int Check()
    {
        System.out.println("hello guys ..lets try"); 
        return 0;
    }
    public static void main(String a[])
    {
        Scanner dr=new Scanner(System.in);
        Protected1 as=new Protected1();
        int roll=as.rollno;
        System.out.println("type welcome");
        String input=dr.nextLine();
        System.out.println("now we have to assess the protected variable from Protected 1 i.e"+roll);
    }
}

简短的回答是:您不能从其他包访问受保护的变量。这就是java(和其他面向对象语言)具有访问修饰符的原因

但是(几乎)每个规则都有例外。如果确实需要,可以在该包中创建访问“受保护”变量(或方法)的特殊访问器类,或者扩展包含受保护成员的类,并通过public方法将其公开

另一种方法是使用反射。您始终可以对每个方法或字段调用
setAccessible(true)
,然后使用它:

Field protectedField = clazz.getDeclaredField("theProtectedField");
protectedField.setAccessible(true);
protectedField.get(obj); // Now you can access the variable. 
方法和构造函数也是如此

受保护的变量和方法允许类本身访问它们,允许同一包中的类访问它们,允许该类的子类访问它们

阅读更多:

静态变量是与类关联的变量,而不是该类的对象。静态变量只初始化一次


OOP语言支持“static”关键字及其属性,但许多OOP程序员认为不应在程序中使用静态变量或静态方法。一个原因是,静态变量存储在堆栈中。然后,如果程序中使用了这么多静态变量,堆栈就满了。

另一种方法是使用
不安全的
,尽管要想摆脱
不安全的
大多数情况,你必须使用反射。@AlexeyMalev,
不安全的
是一个非常强大的工具,但是,我觉得这里太多了。请重新表述您的第一句话,因为您可以从另一个包中的子类访问受保护的成员(甚至是静态的!)。可能是重复的