欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java内部类

程序员文章站 2024-03-15 20:25:30
...

一、内部类概念

  • 在java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类

  • Inner Class 一般用在定义它的类或者语句块之内,在外部引用它时必须给出完整的名称

    • Inner Class的名字不能与包含它的类名相同
  • Inner Class可以使用外部类的私有数据,因为它是外部类的成员,同一个类的成员之间可相互访问。


二、内部类的分类

内部类可以分为三类:

  • 成员内部类(static成员内部类和非static成员内部类)
  • 局部内部类
  • 匿名内部类
1.成员内部类

在内部类中,可以直接访问外部类的成员,包括私有成员;而外部类要访问内部类中的成员需要:内部类.成员或者内部类对象.对象。

//外部类Outer
public class Outer{
	private String s = "外部类的私有成员";
	
    public void showInfo() {
    //外部类访问内部类需要:内部类.成员 or 内部类对象.对象
		Inner i = new Inner();
		i.function();	
		System.out.println("这是外部类的方法");
	}
    //内部类其实就是外部类的一个成员
	public class Inner{
		public void function() {
		//可以直接访问外部类的私有成员
            System.out.println("内部类可以访问外部类的私有成员" + s); 
		}
	}
}

非static内部类的创建语法:

OuterClass.InnerClass inner = new OuterClass().new InnerClass();
//创建内部类实例
//当内部类为私有或其他不可以访问的属性时,无法创建内部类
public class Demo{
    public static void main(String[] args){
     	Outer.Inner oi = new Outer().new Inner();
        oi.function();
    }
} 

注:static内部类按静态成员的方式使用

2.局部内部类(使用极少)
  • 定义在方法或任意的作用域内的内部类
  • 不能声明为public,protected,private,static的内部类
//放在方法中,无法使用外部类创建这种内部类的实例
public class Outer {
	public void method() {
		class Inner{
			public void function() {
				System.out.println("function");
			}
		}
		
		Inner inner = new Inner();
		inner.function();
	}
}
3.匿名内部类
  • 没有名字和构造方法的类
  • 没有class,entends和implements关键字
  • 隐式继承一个父类或实现一个接口
//创建接口
interface Inner{
	public void function();
}

class Outer{
	public void method() {
//		创建匿名对象
		new Inner() {

			@Override
			public void function() {
				System.out.println("匿名内部类");
			}
			
		}.function();

	}
}
//匿名内部类常用作参数进行传递
public class com {
	public static void main(String[] args) {
		method(new A());
		method(new B());
	}
    
    public static void method(Object o) {
		o.function();
	}
}

三、成员内部类的一些特性总结

内部类作为类的成员:

  • 可以声明为final
  • 和外部类不同,内部类可以声明为private或protected
  • 内部类可以声明为static的,但此时就不能再使用外层类的非static的成员变量

内部类作为类:

  • 可以声明为abstract类,因此可以被其它的内部类继承

注意: 非static的内部类中的成员不能声明为static的,只有在外部类或static的内部类中才可声明static成员