内部类
来源:互联网 发布:数控螺纹g92螺纹编程 编辑:程序博客网 时间:2024/06/05 05:25
内部类(inner class)
内部类是定义在另一个类中类。使用内部类主要原因有: *内部类方法可以访问自身数据域,也可以访问创建他的外围类对象的数据域,包括私有数据。 *内部类可以对同一个包中的其他类隐藏起来。 *当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。通俗来讲,就是:当A类的程序代码要用到B类的实例对象,而B类的程序代码又要访问A类的成员,则将B类作为A类的内部类,代码就比较容易编写。例如,若TimePrinter是一个公有内部类,对于任意的外部TimeClock类都可以构造一个TimePrinter:
TimeClock tc = new TimeClock(^^,^^); TimeClock.TimePrinter tctp = tc.TimePrinter();
在外围类的作用域之外,这样引用内部类: OuterClass.InnerClass*** static内部类很少使用的原因在于:用static修饰一个内部类,这个类就相当于是一个外部定义的类,这样static的内部类不能再使用外层封装类的非static的成员变量。
1、方法中定义内部类(局部内部类)
如果一个类在某方法中创建这个类型的对象只使用了一次,这种情况可以在该方法中定义局部类。如:
public void run(){ class Haha { } ......}
局部类不能用public或private访问说明符进行声明。内部类不仅可以在类和方法中定义,也可以在在几个程序块的范围之内定义、或者甚至在for循环中定义局部类不仅可以访问包含它们的外部类,还可以访问局部变量,但是这些局部变量必须被声明为final。
2、用外部方法访问final变量
局部类不仅能够访问包含他们的外部类,也能够访问局部变量,但是这些局部变量不许被声明为final。【***final关键字***】final关键字可以应用于局部变量、实例变量和静态变量,在这些情况下,其含义是:在创建这个变量之后,只能够为之赋值一次,此后便不能修改它的值。final限制有时不太方便,如果用内部类访问一个变量,但该变量是需要更新变化的,这时的补救办法是使用一个长度为1的数组:
final int [] counter = new int[1];for (int i=0; i< data.length; i++){ data[i]=new data(){ public int compareTo(Data dt) { counter[0]++; return super.compareTo(Data); } }}
3、内部类如何被外部引用
将内部类声明为public,这样内部类就可以通过创建对象从外部类之外被调用。
class Outer { private int outer_i=10; public class Inner { public void dostuff() { System.out.println(++outer_i); } } }public class TestInner{ public static void main (String [] args) { Outer outer =new Outer(); Outer.Inner inner = outer.new Inner(); inner.dostuff(); }}这样外部就可创建外部类Outer的实例对象,再通过Outer的实例对象创建Inner类的实例对象,就可以使用Inner类的实例对象来调用内部类Inner中的方法。
4、匿名内部类
在局部内置类中,如果只创建该类的一个对象,就不必命名,这种类称为匿名内部类。
构造方法为:
new SuperType(parameters){inner class methods and data}
SuperType可以使接口。这里需要注意的是,构造器要求其名字与类名相同,但是匿名类没有类名,所以匿名类不能有构造器。取而代之的是,将构造器参数传递给超类构造器,尤其是在内部类实现接口的时候,不能有任何构造参数。如:
new InterfaceType(){ methods and data}
示例代码块
public abstract class WeekDay { private WeekDay(){} public final static WeekDay SUN = new WeekDay(){ @Override public WeekDay nextDay() { // TODO Auto-generated method stub return MON; } }; //new WeekDay()是创建了一个子类,该子类没有名称,子类的内部代码是{}内的部分,实现子类创建实例对象。 public final static WeekDay MON = new WeekDay(){ @Override public WeekDay nextDay() { // TODO Auto-generated method stub return SUN; } }; /*public WeekDay nextDay() { if(this == SUN) return MON; else return SUN; }*/ public abstract WeekDay nextDay(); public String toString() { return this==SUN?"SUN":"MON"; }}
0 0
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 内部类
- 2-18
- 面试感悟:一名3年工作经验的程序员应该具备的技能
- 嵌入式系统开发流程
- 从命令行运行 MyBatis Generator
- 2-3-4-5 获取时间的客户端例子 TCP相关
- 内部类
- BSP模型学习
- 【车】当前状况与规划(1)
- MyBatis-Spring配置简单了解
- Java编程题练习2017-02-19
- java基础八类的组成
- c语言和c++中值传递、指针传递和引用传递的比较和区别
- HTTP 请求头中的 X-Forwarded-For
- 移动端布局