定义:能够将一个类的定义放在另外一个类的定义内部java
做用: 每一个内部类都能独立地继承一个(接口的)实现,因此不管外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。函数
同时若是咱们须要建立某个内部类对象,必需要利用外部类的对象经过.new来建立内部类: OuterClass.InnerClass innerClass = outerClass.new InnerClass();this
内部类是个编译时的概念,一旦编译成功后,它就与外围类属于两个彻底不一样的类。code
在Java中内部类主要分为成员内部类、局部内部类、匿名内部类、静态内部类。对象
1. 成员内部类继承
它是外围类的一个成员,该内部类能够访问外部类的全部成员和方法,即便是private. 可是外围类要访问内部类的成员属性和方法则须要经过内部类实例来访问。接口
2. 静态内部类内存
该类被修饰为static。,他不能访问外部类非静态的成员或方法。编译
建立静态内部类对象时,能够直接建立 内部类 对象名 = new 内部类();class
若是外部类的静态成员与内部类相同时,能够经过类名.静态成员访问外部类静态成员若是不相同,能够 “成员名”直接调用外部类的静态成员。
public class textneibulei { int x = 9; class Inner{ int x = 8; public void test(){ int x = 7; System.out.println(x); System.out.println(this.x); System.out.println(textneibulei.this.x); test1(); } } private void test1(){ System.out.println("test"); } public static void main(String[] args) { Inner in = new textneibulei().new Inner(); in.test(); } }
输出为:7,8,9,test 分析:第七行第八行相信你们都没有什么问题,第九行输出的是9,说明访问到了外部类的变量,而输出的test说明内部类访问到了外部类的test1方法 总结: 输出是9的缘由:由于内部类持有一个外部类的引用,格式:外部类名.this 能够调用private方法缘由是:由于他们在一个类Outer中因此能够调用
3. 方法内部类
能够访问外部类成员,不能被 public 、protected、private以及 static 修饰。
只能访问方法中定义的 final 类型的局部类型变量。
内部类访问外部方法中的局部变量时,该局部变量变量须要被修饰成 final 。
4. 匿名内部类
使用名匿名内存类时,必须实现一个接口或者继承一个类。
匿名内部类中不能定义构造函数,不能存在任何静态成员和静态方法。