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成员