• 21. 内部类


    /*
    内部类:
        
        成员内部类(在外部类声明成员的地方创建一个类)
    
                    
            创建对象方式:
                    
                1)在外部类中定义一个方法并创建内部类对象
    
                    a.在另一个类中创建外部类的对象,并调用那个创建内部类对象的方法
    
                2)在另一个类中创建内部类对象
    
                    a.外部类.内部类  变量名 = new 外部类().new 内部类()
                
            
            注意:
                1)如果是静态内部类在其他类中创建对象的访问方式为:外部类.内部类 变量名 = new 外部类.内部类()
                2)如果成员内部类中出现了静态的成员,那么内部类必须用static修饰
                3)如果成员内部类是私有的,那么创建内部类对象只能在外部类中提供方法创建
            
            访问成员:
    
                1)内部类访问外部类的变量
    
                    a.外部类和内部类不存在相同的成员变量
    
                        访问的是外部类的成员变量
                    
                    b.外部类和内部类存在相同的成员变量
                        
                        默认访问的是内部类的成员变量
    
                        访问外部类成员变量的格式为:外部类.this.变量名
                            
    
    
        局部内部类(在外部类方法里面创建一个类)
    
            注意:如果局部内部类访问了局部变量,那么该变量需要使用final修饰(原因:因为生命周期不一致)
    
    
        匿名内部类(没有类名的类)    
            
            匿名内部类使用的前提:必须继承一个父类或者是实现一个接口
    
            格式:
                new 父类(父接口){
                    
                    匿名内部类的成员
                }
    
            注意:
    
                1)如果只调用一个方法可以直接在创建内部类后面写  .方法名
    
                    a.格式:
                        new 父类(父接口){
                    
                            匿名内部类的成员
                        }.方法名
    
                    b.可以直接调用内部类特有的方法
    
    
                2)如果调用多个方法
                    
                    a.第一个方法设置一个返回值,并返回这个对象
                        //抽象方法定义
                        abstract public AbsClass run();
                        
    
                        匿名内部类中返回对象
    
                        public void sleep(){
                            System.out.println("狗在睡觉~~");
                            return this;
                        }
    
    
                    b.给对象一个变量名在调用
                        
                        格式:
    
                            父类(父接口) 变量名 = new 父类(父接口){
                    
                                匿名内部类的成员
                            }
                            
                        变量名.方法     
    
    */
    //外部类
    import java.util.*;
    
    
    
    
    abstract class AbsClass{
    
        abstract public void run();
    
        //abstract public AbsClass run();
        abstract public void sleep();
    }
    class Outer{
        
    
        /*
        String str1 = "外部类的str1";
        String str2 = "外部类的str2";
    
        public Outer(){}
    
        
        
        定义一个方法并且创建内部类对象
        public  void newInner(){
            Inner inner = new Inner();
            inner.innerFuntion();
        }
        
        
        //内部类
        static class Inner{
    
            String str2 = "内部类的str2";
            public Inner(){}
            public void innerFuntion(){
                System.out.println("我是内部类。。。。");
                
                System.out.println(str1);
                System.out.println(Outer.this.str2);
                
            }
        }
    
        */
    
        public void outerFun(){
        
            /*
            new AbsClass(){
                public void run(){
                    System.out.println("狗在跑。。。。");
                }
                
                public void sleep(){
                    System.out.println("狗在睡觉~~");
                }
    
            }.sleep();
    
            */
            /*
            new AbsClass(){
                public AbsClass run(){
                    System.out.println("狗在跑。。。。");
                    //返会对象
                    return this;
                }
                
                public void sleep(){
                    System.out.println("狗在睡觉~~");
                }
    
            }.run().sleep();
    
            */
    
            AbsClass absclass = new AbsClass(){
    
                public void run(){
                    System.out.println("狗在跑。。。。");
                }
                
                public void sleep(){
                    System.out.println("狗在睡觉~~");
                }
    
            };
    
            absclass.run();
            absclass.sleep();
        }
    
        
    
    }
    
    
    class Demo1 {
        public static void main(String[] args) {
            /*
            Outer outer = new Outer();
            outer.newInner();
            */
    
            
            /*
            Outer.Inner inner = new Outer().new Inner();
            inner.innerFuntion();
            */
            
            /*
            Outer.Inner inner = new Outer.Inner();
            inner.innerFuntion();
            */
    
            Outer outer = new Outer();
            outer.outerFun();
    
        }
    }
  • 相关阅读:
    redis zset 延迟合并任务处理
    String忽略大小写方法compareToIgnoreCase源码及Comparator自定义比较器
    dotnet 使用 ConfigureAwait.Fody 库设置默认的 await 同步上下文切换配置
    dotnet 解析 TTF 字体文件格式
    Total Commander 使用 mklink 建立文件夹链接 将 C 盘文件迁移到其他盘
    dotnet OpenXML 解析 PPT 图表 解析日期时间表示内容
    dotnet 使用 IndentedTextWriter 辅助生成代码时生成带缩进的内容
    dotnet 读 WPF 源代码笔记 为什么自定义的 UserControl 用户控件不能跨程序集继承
    dotnet 使用 TaskTupleAwaiter 同时等待多个任务简化代码写法
    dotnet OpenXML 解析 PPT 图表 面积图入门
  • 原文地址:https://www.cnblogs.com/zjdbk/p/8883702.html
Copyright © 2020-2023  润新知