内部类

 


 

 

测试代码:

public class Inner_Classes {
    
    private int p1 = 1;
    private static int ps1 = 11;
    protected int p2 = 2;
    public int p3 = 3;
    int i = 6;
    
    private void funPR_pc() {System.out.println("Inner_Classes...fun_pc()");}
    public void funPU_pc() {System.out.println("Inner_Classes...fun_pc()");}
    
    //外部类要访问内部类数据,必须先实例化内部类对象通过对象访问,访问不受访问修饰符修饰影响
    int readInnerData1 = new ClassIn_PClass().c1;
    int readInnerData2 = new ClassIn_PClass().c2;
    int readInnerData3 = new ClassIn_PClass().c3;
    
    
    //成员内部类 [private访问权限、protected访问权限、public访问权限]
    /*
     * private,只能在外部类的内部访问
     * public,任何地方都能访问
     * protected,只能在同一个包下或者继承外部类的情况下访问
     * 默认访问权限,只能在同一个包下访问
     * 
     * */
    private class ClassIn_PClass{
        private int c1 = 10;
//        private static int cs1 = 10; //非静态内部类中不能定义静态成员变量
        protected int c2 = 20;
        public int c3 = 30;
        int i = 66;
        
        //遮蔽了外部类中的成员变量i
        //访问外部类数据: 外部类.this.成员变量 / 外部类.this.成员方法
        public void value() {Inner_Classes.this.funPR_pc(); System.out.println(Inner_Classes.this.p1+i);}
        //内部类中可以调用外部类中所有成员变量和方法
        public void test() {System.out.println("P: "+p1+ps1+p2+p3+"---"+"C: "+c1+c2+c3+" -> "); funPR_pc();}
        
        
    }
    
    public void fun() {
        //局部变量不能被访问修饰符修饰
//        private int f1 = 10;
        int i;
        
        //局部内部类,访问仅限于方法内或者该作用域内,同样也不能被访问修饰符修饰
         class ClassIn_Fun_PClass{
            private int f1 = 10;
//            private static int cs1 = 10; //非静态类中不能定义静态成员变量
            protected int f2 = 20;
            public int f3 = 30;
            
            public int value() { return f1; }
            public void test() {System.out.println(p1+ps1+p2+p3);}
        }
    }
    
    //静态内部类
    //静态内部类不需要依赖于外部类,类似于静态成员属性,不能使用外部类的非static成员变量或者方法
    static class ClassIn_SPClass{
        
    }
    
    //匿名内部类时没有构造器的类,使用范围有限,大部分匿名内部类用于接口回调
    //匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写
    Object inner = new Object() {
        private int a1 = 100;
        int a2 = 200;
        
        public void fun() {System.out.println("new Object(){}...fun");};
    };
    
    public static void main(String[] args) {
        Inner_Classes inner_Classes = new Inner_Classes();
        //new ClassIn_PClass();
        inner_Classes.new ClassIn_PClass().test();//不能直接创建内部类,需要通过外部类间接创建
        //inner_Classes.inner.fun();
    }

}

class InnerClassesTest{
    
    public static void main(String[] args) {
        Inner_Classes inner_Classes = new Inner_Classes();
        //如果ClassIn_PClass为private的,则不能访问。只能在它的外部类中访问
        //inner_Classes.new ClassIn_PClass().test();//不能直接创建内部类,需要通过外部类间接创建
    }
}
posted @ 2023-09-18 16:23  bkyvv  阅读(4)  评论(0)    收藏  举报