可以用private和protected修饰内部类为什么是对的,局部内部类不是不可以吗?

img


第一题,可以用private和protected修饰内部类为什么是对的,局部内部类不是不可以吗?

答案错了,确实不可以。
内部类可以使用private和protected限制访问权限,内部类这时候只能在外部类中访问,不能被其他类访问。局部内部类的作用域被限制下当前所在的方法或语句块中.
局部内部类虽然是一种特殊的内部类,但是跟你理解的意思不一样,它作用域跟其他的都不同,不能登等价成内部域。

局部内部类是在方法或代码块内部定义的内部类,其可见性仅限于所在方法或代码块,因此无法使用private或protected进行修饰。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7744102
  • 你也可以参考下这篇文章:外部类如何调用内部类private
  • 除此之外, 这篇博客: 什么?到现在你还不知道什么是 访问修饰限定符吗?中的 二、private 访问修饰限定符 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •        private ,即:私有的,只属于自己的;

           也就是说,private 的权限最小,只能在当前类当中 来进行访问(这个常用来进行封装);

           当前类指的是:private所修饰的类的内部 来进行访问。

     

           所以,作为类的实现者来说,不想让 其他人在类外拿到类内部的 属性和方法(防止对觉得比较重要的数据,用户来进行修修改改,让其他的代码也要时不时的进行修改),那么都可以使用 private来进行修饰(上面代码示例 只显示了属性,当然方法也可以);

           但是,如果用户想用这个被private修饰的数据,那么可以提供一个 公开的接口(即 一个public修饰的方法):

     

           上面的过程也就是 封装,对类里面的实现细节进行了隐藏;

           对外只提供公开的方法来供你使用;

           这也大大提高了数据的安全性。


  • 以下回答由chatgpt基于相关博客总结生成:

    局部内部类不能使用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修饰的变量或者方法只有在类内部可以被访问,可以通过反射来获取私有成员的访问权限,从而突破私有的边界。