1.内部类
定义: 说白了其实也就是一个类中还包含着另外一个类,类似于于孕妇肚子中的婴儿,
与外部类的关系: 内部类作为外部类的一个成员,并且依附于外部类而存在的。
-
成员内部类
-
普通成员内部类
-
位置 :在类中方法外,跟成员变量是一个位置
-
访问特点
-
外部类和其他类要访问内部类的成员,必须创建对象 —外面创建对象才能用里面
-
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
内部类可以直接访问外部类的成员,包括私有 —里面直接用外面------ 如同如同婴儿可以直接用母亲血液里的营养
-
注意:其实内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两个类。
编译完成后出现两个字节码文件。 -
成员内部类中,不能定义静态成员
// 成员内部类中,可以访问外部类的所有成员
-
-
-
私有成员内部类 (private 修饰的就是私有成员内部类)
-
特点:
- 私有成员内部类,外界无法直接访问;在自己的外部类中创建对象进行访问
-
-
静态成员内部类(加了static的内部类)
-
对象访问格式
-
静态内部类的对象可以直接生成:Outer.Inner in = new Outer.Inner(); 而不需要通过生成外部类对象来生成。
-
外部类名.内部类名 对象名 = new 外部类名.内部类名();
-
-
静态方法访问格式
- 外部类名.内部类名.方法名();
-
特点
-
静态内部类不能直接使用外部类的非static成员变量或者方法
-
静态内部类可以用public,protected,private修饰
// 静态内部类中可以定义静态或者非静态的成员 -
生成一个静态内部类不需要外部类成员:这是静态内部类和普通成员内部类的区别。
-
-
-
-
局部内部类
-
- 在方法中定义的内部类称为局部内部类。与局部变量类似,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,和此外围类所有的成员。
- 局部内部类方式
- 局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用
- 该类可以直接访问外部类的成员,也可以访问方法内的局部变量
- 注意:局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
-
匿名内部类
-
简单地说:匿名内部类就是没有名字的内部类。
-
匿名内部类的本质
- 本质:是一个继承了该类或者实现了该接口的子类匿名对象
-
匿名内部类的前提
- 存在一个父类或者接口,这里的类可以是具体类也可以是抽象类
-
匿名内部类的格式
- 格式:new 接口名 ( ) { 重写方法 } new 接口名 ( ) { 重写方法 }
-
方法调用
- 直接调用
- 用多态的形式接收
-
- 提示:
- 创建格式:new 接口名 ( ) { 重写方法 }
- 根据格式创建对象,随后直接调用method方法即可
- 提示:
-
在使用匿名内部类时,要记住以下几个原则:
1 匿名内部类不能有构造方法。
2 匿名内部类不能定义任何静态成员、方法和类。
3 匿名内部类不能是public,protected,private,static。
4 只能创建匿名内部类的一个实例。
5 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
6 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。 -
什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
当发现某个方法需要接口或抽象类的子类对象,我们就可以传递一个匿名内部类过去,来简化传统的代码
只用到类的一个实例。
·类在定义后马上用到。
·类非常小(SUN推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。