在Java中,允许在一个类的内部定义类,这种定义在类内部的类称作内部类,这个内部类所在的类称作外部类。一共有四种内部类,分别是成员内部类、局部内部类、静态内部类、匿名内部类。
成员内部类
定义: 在一个类中除了可以定义成员变量、成员方法之外,还可以定义类,这样的类被称作成员内部类。
说明: 在成员内部类中,可以访问外部类的所有成员,包括成员变量和成员方法;在外部类中,通过创建内部类对象,可以访问成员内部类的变量和方法。
创建内部类对象的语法格式:
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
代码示例:
class Outer{
private String info = "我爱你中国";
class Inner{
public void print() {
System.out.println(info);
}
}
}
public class InnerClassDemo4 {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.print();
}
}
内部类与外部类的区别
内部类是可以直接访问外部类成员的,虽然成员内部类可以无条件的访问外部类的成员,而外部类想访问内部类的成员必须要先创建内部类对象,通过对象调用的方式访问成员。
局部内部类
定义: 局部内部类,也叫作方法内部类,就是在定义某个局部范围中的类,他和局部变量一样,都是在方法中定义的,其有效范围只限于方法内。
说明: 局部内部类可以访问外部类的所有成员变量和方法,而局部内部类中的变量和方法却只能在创建该局部内部类的方法中进行访问。
注意:
局部内部类与方法中的一个局部变量一样,不能有public、protected、private以及static修饰符。
代码示例:
class Outer{
private String info = "我爱你中国";
public void fun(final String temp){
class Inner{
public void print(){
System.out.println(info);
System.out.println(temp);
}
}
new Inner().print();
}
}
public class InnerClassDemo5 {
public static void main(String[] args) {
Outer outer = new Outer();
outer.fun("123");
}
}
静态内部类
定义: 使用static关键字修饰的成员内部类。
说明: 静态内部类在成员内部类前增加了static关键字,功能上,静态内部类只能访问外部类中的静态成员,同时通过外部类访问静态内部类成员是,可以跳过外部类从而直接通过内部类访问静态内部类成员。
创建静态内部类的具体语法格式:
外部类名.静态内部类名 变量名 = new 外部类名.静态内部类名();
代码示例:
class Outer{
private static String info = "我爱你中国";
static class Inner{
public void print() {
System.out.println(info);
}
}
}
public class InnerClassDemo3{
public static void main(String[] args) {
new Outer.Inner().print();
}
}
匿名内部类(重点)
定义: 匿名内部类其实就是没有名称的内部类。
说明: 在调用包含有接口类型参数的方法时,通常为了简化代码,可以直接通过匿名内部类的形式传入一个接口类型参数,在内名内部类中之杰完成方法的实现。
创建匿名内部类的具体语法格式:
new 父接口(){
//匿名内部类实现部分
}
代码示例:
interface A{
public void printInfo();
}
class X{
public void fun1() {
this.fun2(new A(){
@Override
public void printInfo() {
System.out.println("hello world");
}});
}
public void fun2(A a) {
a.printInfo();
}
}
public class NoInnerClassDemo7 {
public static void main(String[] args) {
new X().fun1();
}
}
匿名对象
匿名对象只是表示没有名字的对象
- 没有引用的对象称为匿名对象
- 匿名对象只能在创建对象时使用
- 如果一个对象只是使用一次,后面不需要用了,可以考虑使用匿名对象