zoukankan      html  css  js  c++  java
  • 27 内部类

    方法内部类,成员内部类,静态内部类,匿名内部类

    1.方法内部类

    public class Person{
        
        public static void main(String[] args){
            //调用内部内对象就是先---外部类对象.方法();在方法中创建内部类对象,并且通过内部类对象来调用内部类属性和方法
            
         new out().m();
        }
    }
    class out{
        int b=0;
        public void n() {
            final int k2=10;
            m(); //n中调用m方法
        }
        public void m() {
            int k=10;//在jdk1.7及其以前要显式的去表示这个是常量(要加上final),就是显式常量
            //jdk1.8新特性及其以后就是隐式常量(只要定义一个变量就是常量),在方法内部类中去用的时候就是常量
            //方法内部类
            /**1.只能定义非静态的属性和方法
             * 2.final也可以修饰方法和属性
             * 3.可以定义静态常量(static final)
             * 4.可以能到外部类所有的属性和方法
             * 5.可以拿到包含此内部类方法里的常量,声明的变量在此时也会隐式的转换成常量(加上了final)
             *6.可以继承其他类和实现接口
             *7.内部类前不允许加访问修饰符 ,只能加final或者abstract(抽象)我们就无法访问到 
             *8.如何创建内部类的对象? 不能再其他方法中创建内部类对象,只能在本方法内创建
             *9.别的方法中调用内部内对象就是先---外部类对象.方法();在方法中创建内部类对象,并且通过内部类对象来调用内部类属性和方法
             */
            
              class Inner1 extends Object {
                static final int a=2;
    
                void m2() {
                    //可以拿到外部类的属性方法 
                    System.out.println(b);
                    //
                    //可以拿到方法中的常量
                    System.out.println(k);
                    //  k=11;//这里报错了因为k是一个隐式常量,值不能被修改
                    //不能拿到不包含此内部类方法 的常量
                    //System.out.println(k2);
              
                }//endm2()
    
            }//end内部类
              //创建内部类对象
              Inner1 nei=new Inner1();
              nei.m2(); //调用内部类中的方法
        }//endm()
    }//endout类

     2.成员内部类

    public class Person{
        
        public static void main(String[] args){
            //创建成员内部类的对象
            Out.Inner1 in1=new Out().new Inner1();
        }
    }
    
    //外部类
     class Out{
        //属性 -----成员变量
        int i=1;
        /**
         * 位置在类内方法外
         * 1.只能定义非静态属性和方法
         * 2.可以修饰静态常量(static final)和常量
         * 3.可以拿到外部类所有的属性和方法
         * 4.和方法内部类的很大区别是可以被访问修饰符修饰
         * 5.可以继承和多实现
         * 6.如何产生对象?  通过外部类找到内部类然后声明对象就好
         */
        //成员内部类
        public class Inner1 extends Object implements Cloneable{
            //属性
             int j=2;
            //方法
            public void n() {
                
            }
            
        }//endInner1
        //方法----成员方法
        public void m() {
                
        }
    }//endout类

     3.静态内部类

    public class Person{
        
        public static void main(String[] args){
    
            System.out.println(Out.Inner1.j);//访问静态内部类中的静态属性
            //创建静态内部类的对象
            Out.Inner1 in=new Out.Inner1();
        }
    }
    
    //外部类
     class Out{
        //属性 -----成员变量
        static int i=1;
        /**
         * 位置在类内方法外
         * 1.可以定义任意的属性和方法(静态和非静态都可以)以及静态常量
         * 2.只能拿到外部内的静态属性和方法;
         * 3.可以被访问权限修饰符修饰和final和abstract
         * 4.可以继承和多实现
         * 5.如何产生对象?  通过外部类点出静态内部类然后创建内部类对象
         */
        //静态内部类
        static class Inner1 extends Object implements Cloneable{
            //属性
            static int j=2;
            int i=3;
            //方法
            public void n() {
                System.out.println(i);
            }
            
        }//endInner1
        //方法----成员方法
        public void m() {
                
        }
    }//endout类

    4.匿名内部类---实质继承或者实现,最终要进行方法重写。

    public class Person{
     C c=new C() {//成员位置下的匿名内部类
         
     };
        public static void main(String[] args){
            /**
             * 匿名内部类
             * 1.{}匿名内部类的内容 {}相当于匿名内部类
             * 2.匿名内部类在重写重写抽象方法
             * 3.匿名内部类就是在继承类(抽象类和普通类 )
             * 4.一个类或者接口可以被继承或者实现,那么这个类或者接口就会有匿名内部类的形式
             * 5.构造函数私有化也可以被继承
             * 6.创建一次对象,创建一个匿名内部类麻烦
             * 7.如果匿名内部类在方法中定义中,就和方法内部类使用一致
             * 8.如果匿名内部类在成员的位置定义就和成员内部类使用一致
             */
            D d=new D() {
    
                @Override
                void m() {
                    // TODO 自动生成的方法存根
    
                }
            };
            C c=new C() { //普通类也能有匿名内部类
                
            };
        /*B b=new B() { //final修饰的不能被继承的类没有匿名内部类
                
            };*/
        A a=new A() { //接口也能有匿名内部类
                
            };
        }
    }
    interface A{
        
    }
    final class B{
        
    }
    class C{
        
    }
    class E{
        //私有构造,感觉不能被继承,但是可以通过内部类访问
        private E () {
            
        }
        class E2 extends E{
            //通过E2成员内部类访问
        }
    }
    abstract class D{
        abstract void m();
    }
    public class Person{
    
        public static void main(String[] args){
            int j=10;
            A2 a=new A2() { //这个a不是接口的对象是匿名内部类的对象
                int i=10;
                @Override
                public void m() {
                    //j=20;  //报错,此时的匿名内部类相当于方法内部类,使用方法中的变量的时候是隐式的添加了final
                    //不可改变
                    System.out.println(j);
                    // TODO Auto-generated method stub
    
                }
            };
            a.m();
        }
    }
    
    interface A2{
        void m();
    }

     接口中的内部类 默认用static 修饰

    内部接口 :接口中来个接口,类中再来个接口(再来个接口默认是静态的) 详情请看:https://www.cnblogs.com/chenpi/p/5518400.html

  • 相关阅读:
    php将字符串形式的数组转化为真数组
    Mysql8.0及以上 only_full_group_by以及其他关于sql_mode原因报错详细解决方案
    php使用base64_encode和base64_decode对数据进行编码和解码
    大数据基本概念
    sonarqube安装部署
    git-修改commit信息
    NLP-Commen Sense
    索引生命周期的管理
    kibana软件具体参数配置信息
    es机器监控x-pack导致的监控存储过大的问题
  • 原文地址:https://www.cnblogs.com/xuwangqi/p/11105796.html
Copyright © 2011-2022 走看看