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

时间:2014-05-07 13:20:36

标签: java visibility packages access-specifier

在这里,我想将受保护的变量rollno访问到另一个包package2。 所以,我已经把这两个程序: 所以,当我运行Check.java时,它会引发错误not defined @ Protected1 这里唯一的目标是从包测试中访问受保护的变量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);
    }
}

2 个答案:

答案 0 :(得分:1)

受保护的变量和方法允许类本身访问它们,同一个包内的类来访问它们,以及该类的子类来访问它们。

了解详情:Here

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

支持OOP语言"静态" 关键字及其属性,但许多OOP程序员认为静态变量或静态方法不应该用于程序中。其中一个原因是,静态变量存储在Stack中。如果在程序中使用了如此多的静态变量,则堆栈正在填充。

答案 1 :(得分:0)

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

然而,(几乎)每条规则都有例外。如果您真的需要这个,您可以在该包中创建访问“受保护”变量(或方法)的特殊访问者类,或者扩展包含受保护成员的类并通过公共方法公开它。

其他方式是使用反射。您始终可以在每个方法或字段上调用setAccessible(true),然后使用它:

Field protectedField = clazz.getDeclaredField("theProtectedField");
protectedField.setAccessible(true);
protectedField.get(obj); // Now you can access the variable. 

关于方法和构造函数也是如此。