目录
一.概述二.使用动机三.分类四.使用方法静态内部类4.2.1成员内部类4.2.2本地内部类(方法内部类)4.2.3匿名内部类外部顶级类的类名必须与类文件名相同内部类是在外部类内部定义另一个类,类名不必与文件名相同。 内部类可以是静态的,也可以用public、default、protected、private限定【注释1】在顶级类(外部类)中,只有public和默认的两种修饰符因为外部类前面的单元是包,所以外部类只有两个作用域:同一包和任意位置。 因此,所需的控制权限只有两个:分组控制权限和公共访问权限,并对应于两个控制修饰符:公共和默认。 能满足所有情况。 1 .概述内部类是编译时的概念,成功编译后称为两个完全不同的类: outer.class和out$inner.class。 因此,内部类的成员变量/方法名称可以与外部类相同。 2 .使用动机1 .内部类可以很好地实现隐藏2 .一般的非内部类不允许具有private和protected权限,但内部类3 .非静态内部类具有对外围类所有元素的访问权限(private限定) 多重继承)允许多个内部类分别继承多个其他类,外部类同时获取多个其他类【外部类继承,使内部类实现接口】3 .分类按内部类的位置、修饰符和定义方式划分: [ (3359 img-blog.csdn img.cn/img _ convert/00f2fdb B3 C5 e 2713 c 432 f 03 b 87 fab 68e.png )4.使用方法4.1静态内部类是静态关键字内部类名变量名称=new外部类名。 内部类名(); 静态内部类只能访问外部类的静态成员。 静态内部类只能定义静态成员,非静态内部类不能定义静态成员
class outer { privatestaticintnum=6; //定义静态内部类staticclassinner(voidshow ) (system.out.println ) (num='num )。 } } publicclassstaticinnerclass { publicstaticvoidmain (string [ ] args ) outer.inner inner=new outer.inner ); //内部类对象inner.show (调用创建//内部类方法) }} Output:
4.2非静态内部类必须存在非静态内部类。 因此,如果创建了非静态内部类对象,则始终会创建该外部类对象,而非静态内部类对象分别属于外部类对象。 因为非静态内部类是属于外部类的对象,所以不能有静态方法、属性或静态初始化块。 外部类的静态方法不能使用非静态内部类。 非静态内部类属于对象,外部类的静态方法属于外部类,外部类对象尚未创建,因此无法使用。 为此,不能使用非静态内部类定义变量和创建实例,但非静态内部类可以使用外部类的属性和方法。 非静态内部类对象可以单独访问外部类成员,但外部类对象不能直接访问非静态内部类的成员。 要从外部类访问内部类,必须从外部类对象创建内部类对象,并为内部类对象创建具体语法。 外部类名.内部类名变量名称=new外部类名().new内部类名4.2.1成员内部类可以在一个类中定义成员变量、成员方法和类,此类称为成员内部类成员内部类中有权访问外部类的所有成员classstaticinnerclass { privatestaticintnum=2; //定义静态内部类classinner(voidshow ) ) system.out.println ) num='num )。 }//外部类是内部类publicstaticvoidmain (string [ ] args ) static inner class.inner inner=newstaticinnerclass ).new Inner )
4.2.2本地内部类(方法内部类)本地内部类:在方法内部定义,范围仅限于使用方法本地内部类,主要用于解决复杂问题。 希望创建用于支持解决方案的类,但不希望到那时该类可公共使用,因此将生成局部内部类。 本地类的编译方式与成员内部类的编译方式相同,只是范围发生了更改,只能在该方法中使用,方法出现后将被禁用。
[方法内部类也能访问外部类的成员变量] class Outer{ private int num = 4;//定义成员变量 public void test(){ //方法定义的内部类 class Inner{ void show(){ System.out.println("num = " + num); } } Inner in = new Inner(); in.show(); }}public class PartlyInnerClass { public static void main(String[] args) { Outer outer = new Outer();//创建外部类对象 outer.test();//调用test()方法 }}Output:
Output:
Java的外部类,为什么只能使用public和default进行修饰
内部类, 静态内部类, 局部类, 匿名内部类的解析和区别
Java内部类的分类