java基础(七)、内部类和匿名内部类

一、内部类
将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类。

1、成员内部类

class 外部类 { 
    修饰符 class 内部类 {
        //其他代码
    }
}

访问方式:外部类名.内部类名 变量名 = new 外部类名().new 内部类名();

注:

  • 在内部类中可以直接访问外部类的所有成员
  • 内部类的类体中不可以声明类变量和类方法(不能使用static修饰)
  • 内部类可以由外部类使用外部类中在函数中创建内部类对象来使用
  • 内部类是静态的,非私有的,静态成员可以直接类名调用,非静态成员通过创建外部类对象使用

2、局部内部类
局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问

class 外部类 { 
    修饰符 返回值类型 方法名(参数) {
            class 内部类 {
            //其他代码
        }
    }
}    

访问方式:在外部类方法中,创建内部类对象,进行访问

案例:

public class InnerClass {
    public static void main(String[] args) {
        System.out.println("测试内部类");
        
        //调用成员内部类
        A.B a= new A().new B();
        a.say();

        //调用局部内部类
        new C().test();
    }
}

//成员内部类
class A{
    private String str="我是外部类成员";
    class B{
        public void say(){
            System.out.println("我是内部类:"+str);
        }
    }
}

//局部内部类
class C{
    public void test(){
        class D{
            public void in(){
                System.out.println("我是局部内部类");
            }
        }
        D d=new D();
        d.in();
    }
}

二、匿名内部类
匿名类,就是没有名称的类,其名称由Java编译器给出,没有名称也就是其他地方就不能引用,不能实例化,只用一次,当然也就不能有构造器;匿名内部类是创建某个类型子类对象的快捷方式。
含义:

  • 临时定义某一指定类型的子类
  • 定义后即刻创建刚刚定义的这个子类的对象
new 父类或接口(){
    //进行方法重写
};
  • 匿名类可以继承父类的方法,也可以重写父类的方法。
  • 匿名类可以访问外部类的成员变量和方法,匿名类的类体不可以声明称static成员变量和static方法。
  • 匿名类由于是一个new的结果,所以其实可以赋值给一个父类对象。因此可以分为两种匿名类,成员匿名类和局部匿名类(作为函数参数)

1、成员匿名类

案例:

public interface Smoking {
    public abstract void smoke();
}
public class InnerTest {
    //成员匿名类
    Smoking s=new Smoking(){
        @Override
        public void smoke() {
            System.out.println("成员匿名类");
        }
    };

    public void test(){
        s.smoke();
    }
}

2、局部匿名类

public class ProcessImpl{
   public Object doProcess(Smoking smoking, Object... params) throws Exception {
       smoking.smoke();
       return null;
   }
}
public interface Smoking {
    public abstract void smoke();
}

public class InnerTest {


    public static void main(String[] args) throws Exception{
        new ProcessImpl().doProcess(new Smoking() {
            @Override
            public void smoke() {
                System.out.println("测试局部匿名内部类");
            }
        });
    }
}

参考文档:
https://www.cnblogs.com/Ace-suiyuan008/p/9381274.html
https://www.cnblogs.com/progor/p/8644634.html

你可能感兴趣的:(java,java基础)