Java 之内部类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Monkey_LZL/article/details/62237776
定义

内部类是定义在一个类里面的类,与之对应的包含内部类的类为外部类。

作用
  1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包的其他类访问该类。
  2. 内部类的方法可以直接访问外部类的所有数据,包括私有数据;外部类不可以直接访问内部类成员和方法,需要先创建对象。
  3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便 。
public class HelloWorld{
    public class InnerClass{
        public void show(){
            System.out.println("hello")
        }
    }
    public static void main(String[] args){
        HelloWorld helloworld = new HelloWprld();
        InnerClass ic = helloworld.new InnerClass();//访问时要加一级
        ic.show;
    }
}
分类

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

成员内部类
  1. Inner 类定义在 HelloWorld 类的内部,相当于 HelloWorld 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如:public,private 等。
  2. Inner 类中定的show()方法可以直接访问外部类数据,不受访问控制符的影响。
  3. 定义了成员内部类后,必须使用外部类的对象创建内部类的对象,不可以直接new一个内部类的对象,用static修饰的内部类除外,语法为:内部类 对象名 = 外部类对象.new 内部类();
  4. 编译时,产生两个class文件,外部类名 $ 内部类名 .class 为内部类文件。
  5. 外部类不可以直接访问内部类成员和方法,需要先创建对象。
  6. 如果外部类与内部类具有相同的成员变量或者方法时,内部类默认访问自己的成员变量和方法,如果访问外部类的成员变量,则为外部类名.this.成员变量
静态内部类
  1. 静态内部类是有 static 修饰的内部类。
  2. 静态内部类不能直接访问外部类的非静态成员,可以通过”new 外部类().成员“访问。
  3. 如果外部类的静态成员与内部类的成员名称相同,则通过”类名.静态成员“访问外部类的静态成员;若不相同,则可以直接通过”成员名“调用。
  4. 创建静态内部类对象时,不需要外部类的对象内部类 对象名 = new 内部类();
方法内部类
  1. 方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
  2. 方法内部类不能使用访问控制符和static修饰。
匿名内部类
  1. 匿名内部类没有类名,无 class 关键字,所以只能使用一次。
  2. 必须继承一个父类或者实现一个接口,同时只能继承或者实现一个类或者一个接口。
  3. 匿名内部类中不能定义构造函数。
  4. 匿名内部类不能存在任何静态成员变量和方法
  5. 匿名内部类不能是抽象的,所以必须实现继承的类或接口中的所有方法。
  6. 创建语法:
new 父类构造器(参数列表)| 接口(){
    //匿名内部类的主体部分
}

如 Android 中对于一个 Button 进行侦听

button.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v){
        Toast.makeText(FirstActivity.this, "aa", Toast.LENGTH_SHORT).show();
    }
});

猜你喜欢

转载自blog.csdn.net/Monkey_LZL/article/details/62237776