【问题标题】:How to access a protected variable from another package如何从另一个包访问受保护的变量
【发布时间】:2014-06-24 12:03:20
【问题描述】:

在这里,我想将受保护的变量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);
    }
}

【问题讨论】:

标签: java visibility packages access-specifier


【解决方案1】:

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

阅读更多:Here

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 另一种方法是使用Unsafe,尽管要获得Unsafe,大多数情况下你必须使用反射。
    • @AlexeyMalev, Unsafe 是非常强大的工具,但是恕我直言,这里太多了。
    • 请改写您的第一句话,因为您可以从另一个包中的子类访问受保护的成员(甚至是静态的!)。
    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 2013-12-22
    • 2021-12-31
    • 2017-01-12
    • 2014-11-06
    • 2012-05-09
    • 2023-01-13
    • 2019-10-27
    相关资源
    最近更新 更多