zoukankan      html  css  js  c++  java
  • 二十二、Java基础之内部类

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

    一、静态内部类

    /*
    关于静态内部类:
    1.静态内部类可以等同看做静态变量
    2.内部类重要的作用:可以访问外部类中的私有数据
    3.静态内部类可以直接访问外部类的静态数据,无法直接访问成员变量和成员方法
    */

    public class Test01 {
    
        //静态变量
        static  String s1="A";
    
        //成员变量
        private String s2="B";
    
        //静态方法
        private static void m1(){
            System.out.println("静态内部方法m1执行。。。。");
        }
        //成员方法
        private void m2(){
            System.out.println("成员方法m2执行。。。。");
        }
        //静态内部类
        //可以用访问权限的修饰符修饰
        //public protected private
        static class InnerClass{
            //静态方法
            public static void m3(){
                System.out.println(s1);
                //System.out.println(s2);
    
                m1();
               // m2();
    
            }
            //成员方法
            public void m4(){
                System.out.println("m4....");
            }
        }
    
        public static void main(String[] args){
    
            //访问静态内部类的静态方法
            Test01.InnerClass.m3();//A//静态内部方法m1执行。。。。
    
            //访问静态内部类的成员方法,需要对象
            InnerClass inner=new Test01.InnerClass();
            inner.m4();//m4....
            inner.m3();//A//静态内部方法m1执行。。。。
    
    
    
        }
    }

    二、成员内部类

    /*
    关于成员内部类:
    1.成员内部类可以等同看做成员变量
    2.成员内部类不能有静态声明(静态方法,静态变量)
    3.成员内部类可以访问外部的所有方法,变量
    */
    public class Test01 {
    
        //静态变量
        static  String s1="A";
    
        //成员变量
        private String s2="B";
    
        //静态方法
        private static void m1(){
            System.out.println("成员内部方法m1执行。。。。");
        }
        //成员方法
        private void m2(){
            System.out.println("成员方法m2执行。。。。");
        }
        //成员内部类
        //可以用访问权限的修饰符修饰
        //public protected private
        class InnerClass{
    
            //静态变量
                //static int n=100;
            //静态方法
            //内部类com.study.内部类.成员内部类.Test01.InnerClass中的静态声明非法修饰符 'static' 仅允许在常量变量声明中使用
    //        public static void m3(){
    //            System.out.println(s1);
    //            //System.out.println(s2);
    //
    //            m1();
    //           // m2();
    //
    //        }
            //成员方法
            public void m4(){
                System.out.println("m4....");
            }
    
        }
    
        //入口
        public static void main(String[] args){
    
            //创建外部对象
            Test01 t=new Test01();
    
            InnerClass inner=t.new InnerClass();
    
            inner.m4();//m4....
        }
    }

    三、局部内部类

    /*
    局部内部类:
    局部内部类等同于局部变量

    重点:局部内部类在访问局部变量的时候,局部变量必须使用final修饰
    */

    public class Test01 {
    
        //方法
        public void m1(){
    
            //局部变量
            final int i=10;// 从内部类引用的本地变量必须是最终变量或实际上的最终变量
    
            //局部内部类
            //局部内部类不能用访问控制权限修饰符修饰
            class InnerClass{
    
                //内部类不能有静态声明
               // public static void m1(){}
    
                //成员方法
                public void m2(){
                    System.out.println(i);
    
                }
            }
           // i=100;Error:(27, 36) java: 从内部类引用的本地变量必须是最终变量或实际上的最终变量
            //调用m2
            InnerClass inner =new InnerClass();
            inner.m2();
    
            }
    
        public static void main(String[] args){
    
            Test01 t= new Test01();
            t.m1();//10
        }
    }

    四、匿名内部类

    /*
    匿名内部类:指的是类没有名字

    */

    原始实现方式
    public class Test01 {
    
        //静态方法
        public static void test(CustomerService cs){
    
            cs.logout();
        }
    
        //入口
        public static void main(String[] args){
    
            //调用test方法
            test(new CustomerServiceImpl());//系统已退出!
    
           }
    }
    
    
    interface CustomerService{
    
        //退出系统
        void logout();
    }
    
    //编写一个class实现CusromerService接口
    class CustomerServiceImpl implements CustomerService{
        public void logout(){
            System.out.println("系统已经退出!");
        }
    }

    使用匿名内部类实现

    public class Test01 {
    
        //静态方法
        public static void test(CustomerService cs){
    
            cs.logout();
        }
    
        //入口
        public static void main(String[] args){
    
            //调用test方法
            //test(new CustomerServiceImpl());
    
            //使用匿名内部类的方式执行test方法
            test(new CustomerService() {
                @Override
                public void logout() {
    
                    System.out.println("系统退出!");
    
                }
            });
            //匿名内部类优点:少定义一个类
            //缺点是:无法重复使用!
    
        }
    }
    
    
    interface CustomerService{
    
        //退出系统
        void logout();
    }
    /*
    //编写一个class实现CusromerService接口
    class CustomerServiceImpl implements CustomerService{
        public void logout(){
            System.out.println("系统已经退出!");
        }
    }
    */


  • 相关阅读:
    (转)十分钟搞定CSS选择器
    (转)我所理解的OOP——UML六种关系
    闲话:你今天OO了吗?
    oledb方式读取excel文件
    (转)asp.net 高质量缩略图
    (转载)重温SQL——行转列,列转行
    第九讲,资源表解析
    第八讲,TLS表(线程局部存储)
    第七讲,重定位表
    第六讲,导出表
  • 原文地址:https://www.cnblogs.com/chushujin/p/10126176.html
Copyright © 2011-2022 走看看