1.定义
内部类,将一个类定义在另一个类内部。
2.修饰符
外部类只能使用public、default修饰
内部类可以使用private、public、protect、default(即全部修饰符)修饰
内部类可以直接访问外部类的属性和方法,包括private修饰的
如果内外有同名,内调外,加上类名.this.方法或者属性名来调用:
public class Outer { private int a=1; public class Inner{ private int a=2; public void show(){ System.out.println(Outer.this.a); } } }
3.class
一个类中总共有几个类就会有几个.class文件,内部类的class文件使用外部类名加上$符号修饰
public class Outer{ class inner{ } }
4.实例化
内部类可以看作是外部类的一个成员,
在成员内部类中访问外部类的成员方法和属性:外部类名.this.成员方法(或者属性)
在内部类之外创建成员内部类的实例:外部实例对象名.内部类名 实例名 = new 内部类构造方法
class Outer { private int a=1; class Inner{ private int a=2; public void show(){ System.out.println(Outer.this.a); } } } public class test { public static void main(String[] args) { Outer.Inner inner=new Outer().new Inner(); } }
5.静态内部类
用static修饰的内部类叫静态内部类,使用方法和调用限制和静态方法相同,即静态内部类只能调用外部类的静态属性和方法。对静态内部类的调用可以视为对一个静态方法的调用。
class Outer { private static int a=1; static class Inner{ private int a=2; public void show(){ System.out.println(Outer.a); } } }
6.匿名内部类
没有名称的内部类,形式上是直接new接口或者抽象类,实际上是产生一个匿名的实现类。
new匿名内部类的前提是必须继承一个父类或者实现一个接口;
匿名内部类中不能使用static修饰符;
匿名内部类就是一个普通的实现类,里面方法属性不限量。可重载可自定义等等。
调用自己特有的方法时候注意:
因为这是对象是父类型,并没有用子类去实现父类,所以调用不到自己特有的方法
又因为这里没有实现类供调用来强转:
所以一般不给引用指向,而是在创建的时候直接调用: