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();

    }
}
原文地址:https://www.cnblogs.com/zjdbk/p/8883702.html