Java-内部类

本文深入解析Java内部类的四种类型:成员内部类、静态内部类、局部内部类和匿名内部类。探讨它们的优势,如封装性、实现多继承和回调功能的运用,并展示了如何利用这些特性进行数据安全和代码组织。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java-内部类

1.内部类

1.概念

把类定义在另一个类的内部,该类就被称为内部类。广义上我们将内部类分为四种:成员内部类、静态内部类、方法(局部)内部类、匿名内部类

/**
*	我是一个外部类(外部是相对内部而言)
*/
public class Outer{
	/**
	*	我是一个内部类
	*/
	class Inner{
	//...
	}
}

java内部类有什么好处?为什么需要内部类?

每个内部类都能独立继承一个(接口的)实现,所有无论外围类是否已经继承了某个(接口的)实现,对内部类没有影响。

也就是说内部类拥有类的基本特征

2.成员内部类

  • 位于外部类成员的位置的类
  • 特点就是可以使用外部类中的所有成员变量和成员方法(包括private)
/*
    外部类
 */
public class Outer {
    //外部类成员
    private int age =20;
    //成员内部类
    class Inner{
            int num =  10;
            public void show(){
                System.out.println(age);//在内部类中可以直接使用外部类中成员变量、方法、以至于私有成员
                System.out.println(num);
            }
    }
}
public class Demo1 {
    public static void main(String[] args) {
        Outer.Inner inner= new Outer().new Inner();
        inner.show();
    }
}

注::如果我们的内部类不想被轻易被任何人访问,可以选择使用private修饰内部类,这样我们就无法通过创建对象的方法来访问,要想访问只需要在外部类定义一个public修饰的方法,间接调用。 好处:我们就可以在这个public方法中增加一些判断语句,起到数据安全的作用

class Outer {
      private class Inner {
          public void show() {
              System.out.println(“密码备份文件”);
          }
      }
      //使用getXxx()获取成员内部类,可以增加校验语句(文中省略)
      public Inner getInner() {
          return new Inner();
      }
     }

    public static void main(String[] args) {
          Outer outer = new Outer();
          Outer.Inner inner = outer.getInner();
          inner.show();
      }

3.静态内部类

这种被static所修饰的内部类,按位置分,属于成员内部类,但也可以称作静态内部类,也常叫嵌套内部类,不能使用外部类的非static成员常量和成员方法

/*
    外部类
 */
public class Outer {
    //外部类成员
    private int age =20;
    //成员内部类
    static class Inner{
            int num =  10;
            public void show(){
                System.out.println(age);//在内部类中可以直接使用外部类中成员变量、方法、以至于私有成员
                System.out.println(num);
            }
    }
}
public class Demo1 {
    public static void main(String[] args) {
        Outer.Inner inner= new Outer().new Inner();
        inner.show();
    }
}

4.局部内部类

定义在一个方法或者一个作用域里面的类

特点:主要是作用域发生了变化,只能在自身所在的方法和属性中被使用

class Outer {
      private int age = 20;
      public void method() {
          final int age2 = 30;
          class Inner {
              public void show() {
                  System.out.println(age);
                  //从内部类中访问方法内变量age2,需要将变量声明为最终类型。
                  System.out.println(age2);
              }
          }
                    Inner i = new Inner();
                              i.show();
      }
  }

5.匿名内部类

一个没有名字的类,是内部类的简化写法

java语言提供了一个没有名字的类,实现接口,创建一个没有名字的类的对象

public interface Animal {
    public void eat();
}
public class Demo1 {
    public static void main(String[] args) {
        Outer.Inner inner= new Outer().new Inner();
        new Animal(){
            @Override
            public void eat() {
            }
        };
    }
}   

6.内部类的特点

  • 内部类依然是一个独立的类,在编译之后被编译成独立的.class文件,但是前面冠以外部类的类名和$符号
  • 内部类不能用普通的方式访问,内部类是外部类的一个成员,因此内部类可以自由的访问外部类的成员变量,无论是否为private的
  • 内部类声明成静态的,就不能随便访问外部类的成员变量,仍然是只能访问外部类的静态成员变量

意义:

  • 封装性

  • 实现多继承

  • 用匿名内部类实现回调功能

    通俗的说就是在java中,通常编写一个接口,然后来实现这个接口,把这个接口的一个对象作以参数的形式传到另一个程序方法中,通过接口调用你的方法,匿名内部类就可以很好的展现了一个回调功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值