zoukankan      html  css  js  c++  java
  • Java:内部类的四种形式

    内部类

    • 成员内部类
    • 局部内部类
    • 静态内部类
    • 匿名内部类

    内部类可看做外部类的成员。外部类只能由public修饰或者默认包内访问
    而内部类却可以用四种访问控制符以及static修饰


    成员内部类

    解释:除静态常量外没有静态内容且声明在类的成员区
    外部类内容的访问权限:顾名思义 此时的内部类就相当于外部类的一个成员,因此可以访问外部类的所有内容
    成员限制:除静态常量外,无静态内容

    public class OuterClass {
    
        private int out;
        public static  final  int CONST = 5;
    
        private static  int getCONST(){
            return CONST;
        }
    //成员内部类
        class InnerClass{
    
            private int out;//内部类变量与外部类变量重名
            private static final int test = 5;
    
            public int getOut(){
                System.out.println(OuterClass.this.out);//内部用out访问到的是内部变量,
                return out;//用  外部类名.this.变量名   访问外部变量
            }
    
            public int innerGetCONST(){
                return getCONST();
            }
        }
        InnerClass ic = new InnerClass();//外部类内制造成员内部类对象
        InnerClass p = this.new InnerClass();//实际通过this创建
    }
    //成员内部类是依附外部类而存在的,制造成员内部类的对象,必须存在一个外部类的对象
    OutClass oc = new OutClass();
    OutClass.InnerClass oi = oc.new InnerClass();
    //方法二
    OutClass.InnerClass oi = new OutClass().new InnerClass();

    局部内部类

    解释:作用域类似局部变量,只在当前代码块中有效的,只有在作用域内才能被实例化的内部类
    外部类内容的访问权限:
    如果在静态方法中:
    可以访问外部类中所有静态成员,包含私有
    如果在实例方法中:
    可以访问外部类中所有的成员,包含私有
    成员限制:局部内部类中不可定义静态变量

    public class Outer {
    
        private int out;
    
        public void print(){
        //局部内部类
            class Inner{
    
                private int in;
    
                private final int tset=3;
    
                private int getIn(){
                    return in;
                }
            }
            System.out.println(new Inner().getIn());//可以在外部类中直接制造局部内部类的对象
        }
    }

    静态内部类

    解释:由static修饰的静态内部类类似静态变量/方法
    可含有static修饰的方法
    外部类内容访问权限:只可访问外部类的静态成员

    实际上由static修饰后,此内部类已经与外部类的对象无关了,它是直接属于外部类的,可以认为是嵌套类,类名为 外部类名.内部类名 ,实际上就是一种外部类 这个特点在制造对象的方式中可见一斑

    public class Out {
        private int out = 10;
    //静态内部类
        static class In{
            private int inner = 5;
            private static int in = 6;
    
            public void setIn(int num){
                in = num;
            }
            public static int getIn(){
                return in;
            }
            public static  int getInner(){
                return new In().inner;
            }
        }
    
        In in = new In();//外部类内可直接使用
    }//静态内部类的对象制造方式
    //外部类名.内部类名 变量名 = new 外部类名.内部类名();

    匿名内部类

    解释:顾名思义,没有名字的内部类。。
    没有class,interface,implements,extends关键字
    没有构造器
    一般隐式的继承某一个父类或者实现某一个接口,只使用一次

    public class OutClass {
    
        private int out=1;
    
        public int getOut(OutClass oc){
            return  oc.out;
        }
    
    
        public static void main(String[] args) {
            System.out.println(new OutClass(){//由此开始  继承了OutClass类
                @Override//临时重写了getOut方法
                public int getOut(OutClass oc){
                    return 10;
                }
            }/*匿名内部类自此结束*/.getOut(new OutClass())//调用这个该匿名内部类的getOut方法);
        }
    }
    //输出为10

    2018/7/21

  • 相关阅读:
    JAVA中handleEvent和action的区别
    Hessian的使用以及理解
    Java基础中的RMI介绍与使用
    Callable与Runable接口 submit与execute区别
    XXL-JOB原理--定时任务框架简介(一)
    11.并发包阻塞队列之LinkedBlockingQueue
    并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
    正确实现用spring扫描自定义的annotation
    自贡进入“刷脸卡”时代 人脸识别支付“黑科技”现身自流井老街
    谷歌最新研究:量子计算机能在8小时内破解2048位RSA加密
  • 原文地址:https://www.cnblogs.com/kafm/p/12721854.html
Copyright © 2011-2022 走看看