Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)
原创
©著作权归作者所有:来自51CTO博客作者已注销的原创作品,请联系作者获取转载授权,否则将追究法律责任
分享知识 传递快乐
Java中的内部类
例:
public class 外部类的名称{
//外部类的成员
public class 内部类的名称{
//内部类的成员
}
}
使用内部类有什么好处:
- 实现多重继承;
- 内部类可以很好的实现隐藏:一般的非内部类,是不允许有 private 与protected权限的,但内部类可以;
- 减少了类文件编译后的产生的字节码文件的大小。
**使用内部类的缺点:**使程序结构不清楚。
内部类在编译完成后也会产生.class文件,但文件名称是:外部类名称$内部类名称.class
内部类的种类:成员内部类、静态内部类、局部内部类、匿名内部类。下面分别详细学习一下这四种内部类的具体使用。
一、成员内部类
1、成员内部类也叫实例内部类。
应用场合:每一个外部类对象都需要一个内部类的实例,内部类离不开外部类存在(相当于心脏对人体)
2、成员内部类的特征:
- 作为外部类的一个成员存在,与外部类的属性、方法并列;
- 成员内部类持有外部类的引用;
- 成员内部类中不能定义static变量和方法。
代码:
public class App {
private String name = "成员内部类 - 1";
public static void main(String[] args) throws Exception {
//方法一:
// App app = new App();
// InnerApp innerApp = app.new InnerApp();
// innerApp.show();
//方法二:
App.InnerApp innerApp = new App().new InnerApp();
innerApp.show();
System.out.println(innerApp.name);
}
public class InnerApp {
private String name = "成员内部类 - 2";
public void show() {
System.out.println(App.this.name);
System.out.println("内部类!");
}
}
}
二、静态内部类
1、内部类如果使用static声明,则此内部类就称为静态内部类。(其实也相当于外部类)可以通过外部类 . 内部类来访问。
2、静态内部类使用场合:
内部类不需要外部类的实例(注意区分成员内部类),静态内部类存在仅仅为外部类提供服务或者逻辑上属于外部类,且逻辑上可以单独存在。
3、静态内部类的特征:
- 静态内部类不会持有外部类的引用;
- 静态内部类可以访问外部的静态变量,如果访问外部类的成员变量必须通过外部类的实例访问
4、Java中只有内部类才可以是静态的
代码:
public class App {
String name = "静态内部 - 1";
public static void main(String[] args) throws Exception {
App.InnerApp innerApp = new App.InnerApp();
innerApp.print();
}
static class InnerApp {
String name = "静态内部 - 2";
public void print() {
System.out.println(name);
}
}
}
三、局部内部类
1、局部内部类也叫区域内嵌类,局部内部类与成员内部类类似,不过,区域内嵌类是定义在一个方法中的内嵌类。
2、使用场合:
如果内部类对象仅仅为外部类的某个方法使用,使用局部内部类
3、特征:
- 用在方法内部,作用范围仅限于该方法中;
- 根据情况决定持有外部类对象引用;
- 不能使用private,protected,public修饰符;
- 不能包含静态成员。
代码:
public class App {
String name = "局部内部类 - 1";
public static void main(String[] args) {
App app = new App();
app.show();
}
public void show() {
final String name = "局部内部类 - 2";
class InnerApp {
public void print() {
System.out.println(name);
}
}
new InnerApp().print();
}
}
四、匿名内部类
1、如果一个内部类在整个操作中只使用一次的话,就可以定义为匿名内部类。
匿名内部类也就是没有名字的内部类,这是java为了方便我们编写程序而设计的一个机制,因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适。
2、使用场合:
简化内部类的使用
3、特征:
- 使用new创建 ,没有具体位置;
- 创建的匿名类,默认继承或实现new后面的类型;
- 根据使用情况决定是否持有外部类对象引用;
- 内嵌匿名类编译后生成的.class文件的命名方式是”外部类名称$编号.class”,编号为1,2,3…n,编号为x的文件对应的就是第x个匿名类
代码:
public class App {
String name = "匿名内部类 - 1";
public static void main(String[] args) {
Person p = new Person() {
public void run() {
System.out.println("匿名内部类实现的");
}
};
p.run();
}
}
public interface Person {
public void run();
}
————————————
如有不妥之处请留言指正。
相互学习,共同进步。