内部类
一.什么是内部类
将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类
内部类所在的类在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class
内部类主要分为四种:
成员内部类,局部内部类,匿名内部类,静态内部类
二.成员内部类
package com.jiangbei.test.innerclass; /** * 外部类 * 作者: Administrator * 日期: 2017/9/24 **/ public class OutterClass { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } // 内部类 public class InnerClass{ public InnerClass(){ name = "张三"; age = 18; } public void show(){ System.out.println("i am InnerClass"); } public void display(){ System.out.println("name:"+getName()+" age:"+getAge()); } } // 推荐使用getInnerClass()获取内部类 public InnerClass getInnerClass(){ // 当然也可以在外部类创建内部类引用,当内部类为空时新建,不为空时返回,实现单例的效果 return new InnerClass(); } public static void main(String[] args) { OutterClass outter = new OutterClass(); // InnerClass inner = new InnerClass(); 无法直接创建内部类 // OutterClass.InnerClass inner = outter.new InnerClass(); 不推荐 OutterClass.InnerClass inner = outter.getInnerClass(); inner.show(); inner.display(); } }
由此我们可以知道:
1.成员内部类依靠外部类,只有创建了外部类实例才能创建成员内部类
2..成员内部类可以无限制访问外部类成员,即使它是private的
3.外部类想访问成员内部类的方法和变量,必须通过内部类的实例
三.局部内部类
嵌套在方法和作用域的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。
class People{ public People() { } } class Man{ public Man(){ } public People getWoman(){ class Woman extends People{ //局部内部类 int age =0; } return new Woman(); } }
注意点:局部内部类类似一个局本变量,无法拥有访问修饰符!
四.匿名内部类
一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
new 父类构造器(形参列表) | 实现接口(){
// 重写方法或实现方法
}
比较典型的就是swing中的事件绑定了:
button1.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("你按了按钮二"); } });
1.匿名内部类必须是实现一个接口或者继承一个父类的方式
2.匿名内部类没有构造函数
3.匿名内部类不能存在静态变量静态方法
4.匿名内部类不能是抽象的(继承抽象类、实现接口必须重写、实现所有方法)
5.Java为了避免数据不同步的问题,做出了匿名内部类只可以访问final的局部变量的限制。
五.静态内部类
和成员变量类似,不过它是静态的,不再需要依靠外部类
/** *静态内部类 */ static class InnerClass1{ /* 在静态内部类中可以存在静态成员 */ public static String _name1 = "chenssy_static"; public void display(){ /* * 静态内部类只能访问外围类的静态成员变量和方法 * 不能访问外围类的非静态成员变量和方法 */ System.out.println("OutClass name :" + name); } }
有关内部类的讲解与深入,请参见:http://www.cnblogs.com/dolphin0520/p/3811445.html