内部类详解

定义

◼ 在类的内部可以定义一个另一个类

◼ 如果在Outer类的内部再定义一个Inner类,此时Inner类就称为内部类(或嵌套 类),而类Outer则称为外部类(或宿主类)

◼ 如果有多层嵌套,最外层的类称为顶层类

class Outer {	//外部类
	class Inner {	//内部类
		…
	}
}

 

内部类的分类

内部类的分类

1.非静态成员内部类

(1) 在外部类的静态方法和外部类以外的其他类中,必须通过外部类的实例创建内部类的实例 ★
public class Outer {
class Inner {
// static int a;
}

public void method1() {
    Inner i = new Inner(); // 实例方法:直接new(不需要创建外部类实例)
}

public static void method2() {
    Outer.Inner i = new Outer().new Inner(); // 静态方法:需要创建外部类实例( new Outer() )
}

class Inner2 {
    Inner i = new Inner(); // 内部类:直接new(不需要创建外部类实例)
}

}
class OtherClass {
Outer.Inner i = new Outer().new Inner(); // 其他类:需要创建外部类实例( new Outer() )
}

上述代码中method2()为外部类的静态方法,outerClass类为外部类以外的其他类,都需要先创建外部类实例new.Outer()再进行内部类实践的创建,创建方式为new Outer().new.Inner();

 

(2) 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员 ★
package edu.wust.examples;
public class Outer {
    public int a = 100;
    static int b = 100;
    final int c = 100;
    private int d = 100;
    class Inner {
        int a2 = a + 1; // 访问public的a
        int b2 = b + 1; // 访问static的b
        int c2 = c + 1; // 访问final的c
        int d2 = d + 1; // 访问private的d
    }
}

public class Test {
public static void main(String args[]) {
Outer.Inner i = new Outer().new Inner(); // 创建内部类实例
System.out.println( i.a2 ); // 输出101
System.out.println( i.b2 ); // 输出101
System.out.println( i.c2 ); // 输出101
System.out.println( i.d2 ); // 输出101
}
}

上述Inner类可以访问Outer类的a,b,c,d。但是如果在outer类中用到inner类的变量,就是错的

(3) 非静态内部类不能有静态方法、静态属性和静态代码块 ★
非静态内部类同名变量问题
public class Outer {
    private int size;
    public class Inner { //内部类
        private int size;
        public void doStuff( int size ) {
            size++; // doStuff()方法自己的形参size
            this.size++; //内部类自己的成员变量
            Outer.this.size++; //外部类成员变量
        }
    }
}

Outer.size++; X 因为该size不是静态变量 所以最后一步Outer.this.size错误

 

2.静态内部类

(1) 通常一个普通类不允许声明为静态的,只有一个内部类才可以
(2) 在创建静态内部类的实例时,不需要创建外部类的实例
public class Outer {
    static class Inner {
//静态内部类
    }
}
class OtherClass {
    Outer.Inner i = new Outer.Inner();	//静态内部类的实例化
}

静态内部类相当于把它放在外面 不再是嵌套的内部类,变成了顶层类

(3) 静态内部类中可以定义静态成员和实例成员
public class Outer {
    static class Inner {
        int a = 0; // 实例变量a
        static int b = 0; // 静态变量b
    }
}
class OtherClass {
    Outer.Inner i = new Outer.Inner();
    int a2 = i.a; // 访问实例成员
    int b2 = Outer.Inner.b; // 通过类名访问静态成员
}

(4)静态内部类可以直接访问外部类的静态成员,如果要访问外部类的实 例成员,则需要通过外部类的实例去访问
public class Outer {
    int a = 0; // 实例变量a
    static int b = 0; // 静态变量 b
    static class Inner {
        Outer o = new Outer(); // 外部类实例
        int a2 = o.a; // 访问实例变量
        int b2 = b; // 访问静态变量
    }
}

 

3.局部内部类

(1) 局部内部类只在当前方法中有效
(2) 局部内部类不能使用public、private 和 protected修饰
(3) 局部内部类不能使用 static 修饰符
(4) 在局部内部类中可以访问外部类的所有成员
(5)在局部内部类中只可以访问==当前方法中 final 类型的参数与变量
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值