Как получить доступ к защищенной переменной из другого пакета

Здесь я хочу получить доступ к этой защищенной переменной rollno в моем другом пакете package2. Итак, ребята, я поставил обе программы: Итак, когда я запускаю Check.java, он выдает ошибку not defined @ Protected1, единственная цель здесь - получить доступ к защищенной переменной из пакета 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);
    }
}

person user3522245    schedule 07.05.2014    source источник


Ответы (2)


Защищенные переменные и методы позволяют самому классу обращаться к ним, классам внутри того же пакета получать к ним доступ и подклассам этого класса получать к ним доступ.

Подробнее: здесь

Статическая переменная — это переменная, связанная с классом, не с объектами этого класса. Статические переменные инициализируются только один раз.

Языки ООП поддерживают ключевое слово "static" и их свойства, но многие программисты ООП считают, что статические переменные или статические методы не должны использоваться в программах. Одна из причин этого, статические переменные хранятся в стеке. Затем, если в программе используется так много статических переменных, стек заполняется.

person TeachMeJava    schedule 07.05.2014

Краткий ответ: вы не можете получить доступ к защищенной переменной из другого пакета. По этой причине java (и другие объектно-ориентированные языки) имеют модификаторы доступа.

Однако есть исключения для (почти) каждого правила. Если вам это действительно нужно, вы можете создать в этом пакете специальный класс доступа, который обращается к «защищенной» переменной (или методу), или расширить класс, который содержит защищенный член, и предоставляет его через общедоступный метод.

Другой способ - использовать отражение. Вы всегда можете вызвать setAccessible(true) для каждого метода или поля, а затем использовать его:

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

То же самое касается методов и конструкторов.

person AlexR    schedule 07.05.2014
comment
Другой способ - использовать Unsafe, хотя, чтобы получить представление о Unsafe, вам придется использовать отражение. - person Alexey Malev; 07.05.2014
comment
@AlexeyMalev, Unsafe очень сильный инструмент, но ИМХО его здесь слишком много. - person AlexR; 07.05.2014
comment
Пожалуйста, перефразируйте свое первое предложение, так как вы можете получить доступ к защищенному члену (даже статическому!) из подкласса в другом пакете. - person whaley; 07.05.2014