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,不安全的是一个非常强大的工具,但是,我觉得这里太多了。请重新表述您的第一句话,因为您可以从另一个包中的子类访问受保护的成员(甚至是静态的!)。可能是重复的