答案错了,确实不可以。
内部类可以使用private和protected限制访问权限,内部类这时候只能在外部类中访问,不能被其他类访问。局部内部类的作用域被限制下当前所在的方法或语句块中.
局部内部类虽然是一种特殊的内部类,但是跟你理解的意思不一样,它作用域跟其他的都不同,不能登等价成内部域。
局部内部类是在方法或代码块内部定义的内部类,其可见性仅限于所在方法或代码块,因此无法使用private或protected进行修饰。
private ,即:私有的,只属于自己的;
也就是说,private 的权限最小,只能在当前类当中 来进行访问(这个常用来进行封装);
当前类指的是:private所修饰的类的内部 来进行访问。
所以,作为类的实现者来说,不想让 其他人在类外拿到类内部的 属性和方法(防止对觉得比较重要的数据,用户来进行修修改改,让其他的代码也要时不时的进行修改),那么都可以使用 private来进行修饰(上面代码示例 只显示了属性,当然方法也可以);
但是,如果用户想用这个被private修饰的数据,那么可以提供一个 公开的接口(即 一个public修饰的方法):
上面的过程也就是 封装,对类里面的实现细节进行了隐藏;
对外只提供公开的方法来供你使用;
这也大大提高了数据的安全性。
局部内部类不能使用private和protected修饰符是因为局部内部类只能在其所在的方法中使用,不像成员内部类可以在整个类中使用,因此private和protected没有意义。而成员内部类可以使用private和protected修饰符来保证访问的安全性。
针对在外部类中无法访问修饰符为private的成员变量、方法、构造函数,可以通过反射来获取私有成员的访问权限。具体步骤如下:
1.获取类对象Class。
2.通过getDeclaredField方法获取私有字段。
3.通过setAccessible方法让JVM不检查权限。
4.通过set方法设置对象的属性为具体的值。
以下是示例代码:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = Dog.class;
Constructor constructor = clazz.getDeclaredConstructor(String.class, Integer.class);
constructor.setAccessible(true);
Dog dog = (Dog) constructor.newInstance("小黑", 2);
//获取所有私有字段
Field breedField = clazz.getDeclaredField("breed");
breedField.setAccessible(true);
breedField.set(dog, "大黄");
System.out.println(dog.getBreed());
//获取私有方法
Method printMethod = clazz.getDeclaredMethod("print", String.class);
printMethod.setAccessible(true);
printMethod.invoke(dog, "Hello");
}
private static class Dog {
private String breed;
private Integer size;
private Dog(String breed, Integer size) {
this.breed = breed;
this.size = size;
}
private String getBreed() {
return breed;
}
private void print(String str) {
System.out.println(str);
}
}
}
其中,通过getDeclaredConstructor方法获取私有构造函数,并进行访问权限设置,然后通过newInstance方法创建一个对象。通过getDeclaredField方法获取私有字段,进行访问权限设置,并通过set方法设置属性值。通过getDeclaredMethod方法获取私有方法,进行访问权限设置,并通过invoke方法调用方法。
总结来说,只要是在对象所属的类的范围内,私有变量都可以访问,这个限制是对类的而不是对对象的。用private修饰的变量或者方法只有在类内部可以被访问,可以通过反射来获取私有成员的访问权限,从而突破私有的边界。