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

  • 相关阅读:
    fastreport 中文汉字换行
    Delphi调用自身onchange事件,如提示缺少声明object时,不能调用,用此方法!
    delphi 截取某个字符之前的字段,,如 1234567-9,要分别得到
    delphi 四舍五入取整函数
    SQLServer2008不允许保存更改错误解决办法_不允许保存更改、不允许修改表解决_百度经验
    关于APP的架构实现!微博和知乎中的 feed 流是如何实现的?
    win2003没有OLE DB Provider for SQLServer驱动,可安装sqlserver2000或者安装MDAC2.6,适用于winxp、win2003
    SQLServer2000安装失败,[ODBC 驱动程序管理器]未发现数据源,详细信息请查看日志文件 sql2000 [Microsoft][ODBC 驱动程序管理器] 未发现数据源,参见sqlstp.org,直接退出
    sql server2008R2 密钥
    CentOS7安装memcached
  • 原文地址:https://www.cnblogs.com/kafm/p/12721854.html
Copyright © 2011-2022 走看看