Java面向对象之内部类
1 - 什么是内部类?外部类?
/*
1. 当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内 部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使 用内部类
2. 在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者 称为外部类
3. Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完 整的名称。注意:Inner class的名字不能与包含它的外部类类名相同
4. 分类:
成员内部类(static成员内部类和非static成员内部类)
局部内部类(不谈修饰符)、匿名内部类
*/
2 - 内部类的定义与使用
/*
类的内成员之五:内部类
1. 在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者 称为外部类
2.内部类的分类:成员内部类(静态、非静态) vs 局部内部类(方法内、代码块内、构造器内)
3. 成员内部类:
作为外部类的成员:
>调用外部类的结构
>可以被static修饰
>可以被4种不同权限修饰符修饰
作为一个类:
>类内可以定义属性、方法、构造器等
>可以被final修饰,表示此类不可以被继承。不是final修饰,就可以被继承
>可以被abstract修饰
4. 关注如下的3个问题
①如何实例化成员内部类的对象 (见代码内)
②如何在成员内部类中区分调用外部类的结构 (见代码内)
③开发中局部内部类的使用
*/
public class InnerClass { public static void main(String[] args) { // 创建静态Mouth内部类的对象 Person.Mouth mouth = new Person.Mouth(); mouth.function(); // 功能:吃饭、说话、呼吸、接吻 // 创建Foots实例(非静态成员内部类) Person p = new Person(); Person.Foots foot = p.new Foots(); foot.function(); // 脚的作用是走路 System.out.println(); foot.display("测试"); } } class Person{ String name = "李白"; int age; public void eat() { System.out.println("人:吃饭"); } // 静态成员内部类 static class Mouth{ String name = "嘴"; public void function() { System.out.println("功能:吃饭、说话、呼吸、接吻"); } } // 非静态内部类 final class Foots{ String name = "脚"; int footsNum; public Foots() { } public void function() { System.out.println("脚的作用是走路"); // eat(); Person.this.eat(); // 调用外部类的非静态属性 } public void display(String name) { System.out.println(name); // 方法的形参 System.out.println(this.name); // 内部类的属性 System.out.println(Person.this.name); // 外部类的属性 } } // 构造器内 public Person() { class AA{ } } // 方法内 public void method() { class BB{ } } // 代码块内 { class CC{ } } }
3 - 开发中 局部内部类 的使用
package com.lzh.innerclss; public class InnerClassTest { // 开发中很少见 public void method() { // 局部内部类 class BB{ } } // 返回一个实现了Comparable接口的类的对象 public Comparable getComparable() { // 创建一个实现了Comparable接口类:局部内部类 // 方式1 // class MyComparable implements Comparable{ // // @Override // public int compareTo(Object o) { // // TODO Auto-generated method stub // return 0; // } // } // return new MyComparable(); // 方式2 return new Comparable() { @Override public int compareTo(Object o) { // TODO Auto-generated method stub return 0; } }; } }
4 - 局部内部类的特点
1 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但 是前面冠以外部类的类名和$符号,以及数字编号。
2 只能在声明它的方法或代码块中使用,而且是先声明后使用。除此之外的任何地方 都不能使用该类。
3 局部内部类可以使用外部类的成员,包括私有的。
4 局部内部类可以使用外部方法的局部变量,但是必须是final的。由局部内部类和局 部变量的声明周期不同所致。
5 局部内部类和局部变量地位类似,不能使用public,protected,缺省,private
6 局部内部类不能使用static修饰,因此也不能包含静态成员
5 - 匿名内部类
1 匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一 个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或 实现一个类。
2 格式:
new 父类构造器(实参列表)| 实现接口(){
// 匿名内部类的类体部分
}
3 匿名内部类的特点
① 匿名内部类必须继承父类或实现接口
② 匿名内部类只能有一个对象
③ 匿名内部类对象只能使用多态形式引用