10-Java内部类——成员内部类、局部内部类、匿名内部类


一.内部类

把类定义在其他类的内部,这个类就叫做内部类。

  • 根据内部类,定义位置的不同,又分为成员内部类和局部内部类
    • 成员内部类:内部类位于外部类的成员位置
    • 局部内部类:内部类位于外部类的成员方法内

举例:

class A{
    
    
   //成员内部类:位于外部类的成员位置
   class B{
    
    

   }
    public void show(){
    
    
      //局部内部类,位于外部类成员方法内
       class C{
    
    

        }
    }
}

1.成员内部类

  • 成员内部类的访问特点

    • 内部类可以直接访问外部类的成员,包括私有的。

    • 外部类要访问内部类的成员,必须创建内部类对象

    • 可以在外部直接创建内部类对象,格式

外部类名.内部类名 对象名=new 外部类().new 内部类()

  • 注意

    • 类不可以私有化,但是内部类可以(经常采用的就是私有化内部类,外部间接访问的形式,保证数据的安全性)

    • 内部类可以使用static修饰,称为静态内部类,其只能访问外部类的静态成员(方便访问数据)

    • 外界直接创建静态内部类的格式

Wai.Nei a=new Wai.Nei();

举例:

public class 内部类的访问特点 {
    
    
    public static void main(String[] args) {
    
    
        //可以在外部直接创内部类的对象
        Outer.Inner inner1=new Outer().new Inner();
        inner1.neishow();
        Outer outer=new Outer();
        outer.waishow();

    }

}
class Outer{
    
    
    int num=100;
    private int a=200;
    class Inner{
    
    
        int b=300;
        public void neishow(){
    
    
            System.out.println(b);
            //内部类可以发访问外部类的成员,包括私有成员
            System.out.println(num);
            System.out.println(a);
            waishow1();
        }
        public void neitest(){
    
    
            System.out.println("内部类方法执行");
        }
    }
    public void waishow(){
    
    
        System.out.println("外部的show方法执行");
        //外部类访问内部类的成员,必须创建内部类的对象
        Inner inner=new Inner();
        //通过内部类对象,访问内部类的成员变量
        System.out.println(inner.b);
        //通过内部类对象,访问内部类的成员方法
        inner.neitest();
    }
    private void waishow1(){
    
    
        System.out.println("外部类私有方法执行");
    }
}

2.局部内部类

  • 局部内部类的访问特点
    • 可以直接访问外部类的成员
    • 可以创建内部类对象,通过对象调用内部类方法,来使用内部类功能
    • 局部内部类访问局部变量必须是final修饰

举例:

public class 局部内部类 {
    
    
    public static void main(String[] args) {
    
    
        int a=100;
        int b=200;
        Outer outer=new Outer();
        outer.waishow(100,200);

    }
}
class Outer{
    
    
    private int num=20;

    public void waishow(final int a,final int b){
    
    
        //该局部变量需要使用final修饰
        final int num1=30;
        //局部内部类定义在成员方法内
        class inner{
    
    
            public void neishow(){
    
    
                num=40;
                System.out.println(num);
                System.out.println(num1);
                System.out.println(a+":"+b);
            }
        }
        //创建内部类对象,调用内部类功能
        inner x = new inner();
        x.neishow();
    }
}

3.匿名内部类

就是局部内部类的简化写法。

  • 前提:存在一个类(可以是抽象类)或接口;格式:

    new 类名或者接口名(){
    重写方法;
    } ;

  • 本质:继承该类或实现该接口的子类匿名对象

举例:

//抽象类
abstract class AbstractClass{
    
    
    public abstract void show();
}
class Outer1{
    
    
    public void method(){
    
    
        //创建抽象类的子类的匿名对象
        new AbstractClass(){
    
    
            @Override
            public void show() {
    
    
                System.out.println("shoshowshow");
            }
        };
    }
}
//接口
public interface MyInter{
    
    
    public abstract void show();
}
class Outer{
    
    
    public void method(){
    
    
        new MyInter(){
    
    
            @Override
            public void show() {
    
    
                System.out.println("showshowshow");
            }
        };

    }
}

猜你喜欢

转载自blog.csdn.net/m0_46988935/article/details/110559846