Java内部类详细介绍

什么是内部类?内部类分为几种?

Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。

广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类 、静态内部类。我们知道类的五大成员:属性、方法、构造器、代码块、内部类。 

内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。

成员内部类

成员内部类是最普通的内部类,它的定义为位于另一个类的内部

成员内部类语法格式如下:

public class Outer {//外部类

        class Inner {//内部类

        }

}

成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)

外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问。

当成员内部类拥有和外部类同名的成员变量或者方法时,会根据就近原则

即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员
 

外部类.this.成员变量

外部类.this.成员方法

如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。

访问权限

成员内部类可以拥有 private 访问权限、protected 访问权限、public 访问权限及包访问权限。比如上面的例子,

如果成员内部类 Inner 用 private 修饰,则只能在外部类的内部访问,

如果用 public 修饰,则任何地方都能访问;

如果用 protected 修饰,则只能在同一个包下或者继承外部类的情况下访问;

如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被 public 和包访问两种权限修饰。

局部内部类

什么是局部内部类

局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内

局部内部类的特点

局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符的。

(1)局部内部类可以直接访问外部类的所有成员,包含私有的;

(2)不能添加修饰符,因为它是一个局部变量,局部变量是不能使用修饰符的,但是可以用final修饰,因为局部变量是可以使用final修饰的。

(3)作用域仅仅在定义它的方法或者代码块中。

(4)局部内部类访问外部类的成员属性或者方法时,直接访问;

(5)外部类访问局部内部类的成员属性或者方法时,通过先创建对象,再访问,且必须要在作用域内。

匿名内部类

Java 中可以实现一个类中包含另外一个类,且不需要提供任何的类名直接实例化。主要是用于在我们需要的时候创建一个对象来执行特定的任务,可以使代码更加简洁。匿名类是不能有名字的类,它们不能被引用,只能在创建时用 new 语句来声明它们。

匿名内部类语法格式:

new 类名/接口() {
    // 匿名内部类的类体部分
};

匿名内部类的特点 

匿名内部类是不能有访问修饰符和 static 修饰符的。

匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。

匿名内部类在编译的时候由系统自动起名为 Outer$1.class。

匿名内部类主要用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

匿名内部类使用一次,就不再使用。

静态内部类 

静态内部类也是定义在外部类里面的一个内部类,是在内部类的前面多了一个关键字static。

语法格式如下

public class Outer {//外部类

        static class Inner {//内部类

        }

}

特点

静态内部类是不需要依赖于外部类,这点和类的静态成员属性有点类似,而且不能使用外部类的非static成员变量或者方法

外部类的非static成员必须依附于具体的对象。可以添加任意的访问修饰符public、protected、private 以及默认,是类的成员。

End

为什么使用匿名内部类

更好的封装性内部类可以将类隐藏在外部类之内,不允许同一包下的其他类访问该类,从而提供了更好的封装性。只有外部类可以访问内部类,实现了隐藏内部类代码的效果,使得一些只服务于特定类的“专用类”得到隐藏,减少不必要的信息量。

访问权限的灵活性内部类成员可以直接访问外部类的私有数据,因为内部类被视为外部类的成员,同一类的成员之间可以互相访问。然而,外部类不能直接访问内部类的实现细节,如内部类的成员变量。这种访问权限的灵活性使得内部类在访问外部类资源时更为方便。

简化代码编写在某些情况下,如编写Swing界面的事件监听或驱动时,使用内部类可以减少作为外部类编写时的参数传递,使代码更为简洁。同时,使用内部类定义回调也可以方便地省略大量代码。

实现多继承效果在Java中,内部类和接口结合使用可以解决类似于C++中的多继承问题。通过在一个类中声明另一个类作为内部类,可以实现类似多继承的效果,尽管Java本身并不直接支持多继承。

另外,匿名内部类适合用于创建那些仅需要一次使用的类。大量使用内部类可能会导致代码结构变得复杂和难以阅读。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值