黑马程序员--------内部类和外部类

(一) 内部类(InnerClass)和内部类

类可以有两种重要成员:成员变量和方法,还可以有一种成员:内部类。内部类是在一个类的内部嵌套定义的类,它可以是其它类的成员,也可以在一个语句块的内部定义,还可以在表达式内部匿名定义。

内部类有如下特性:

◇ 一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。名字不能与包含它的类名相同。

◇ 可以使用包含它的类的静态和实例成员变量,也可以使用它所在方法的局部变量。

◇ 可以定义为abstract

◇ 可以声明为privateprotected

◇ 若被声明为static,就变成了顶层类,不能再使用局部变量。

◇ 若想在inner class中声明任何static成员,则该inner class必须声明为static。。

1. 内部类使用

3-8 是一个说明内部类如何使用的例子,其中,定义了两个内部类:MouseMotionHandlerMouseEventHandler,分别用来处理鼠标移动事件和鼠标点按事件。

【例3-8

import java.awt.*;

import java.awt.event.*;

public class TwoListenInner {

  private Frame f;

  private TextField tf;

  public static void main(String args[]) {

    TwoListenInner that=new TwoListenInner();

    that.go(); 

  }

  public void go() {

   f=new Frame("Two listeners example");

   f.add("North",new Label("Click and drag the mouse"));

   tf=new TextField(30);

   f.add("South",tf);

   f.addMouseMotionListener(new MouseMotionHandler());

   f.addMouseListener(new MouseEventHandler());

   f.setSize(300,300);

   f.setVisible(true);

  

  public class MouseMotionHandler extends MouseMotionAdapter { 

    public void mouseDragged(MouseEvent e){

     String s="Mouse dragging:X="+e.getX()+"Y="+e.getY();

     tf.setText(s);

    }

  }

  public class MouseEventHandler extends MouseAdapter {

    public void mouseEntered(MouseEvent e){

     String s="The mouse entered";

     tf.setText(s);

    }

    public void mouseExited(MouseEvent e){

     String s="The mouse left the building";

     tf.setText(s);

    }

  }

}

运行这个程序,可以看到它的运行结果。当将鼠标移入frame时,文本框中会出现:"The mouse entered";当在frame中拖曳鼠标时,文本框中会出现:"Mouse dragging:X=64 Y=117";当鼠标离开文本框时,文本框中出现:"The mouse left the building"

2. 匿名类的使用

匿名类是一种特殊的内部类,它是在一个表达式内部包含一个完整的类定义。通过对上例中go()部分语句的修改,我们可以看到匿名类的使用情况。

public void go() {

  f=new Frame("Two listeners example");

  f.add("North",new Label("Click and drag the mouse"));

  tf=new TextField(30);

  f.add("South",tf);

  f.addMouseMotionListener(new MouseMotionHandler(){

     /*定义了一个匿名类,类名没有显式地给出,只是该类是

     MouseMotionHandler类的子类*/

     public void mouseDragged(MouseEvent e){

        String s="Mouse dragging:X="+e.getX()+"Y="+e.getY();

        tf.setText(s);

     }

  });

  f.addMouseListener(new MouseEventHandler());

  f.setSize(300,300);

  f.setVisible(true);

}

内部类的优缺点:

1.优点:

java中的内部类和接口加在一起,可以实现多继承。 

可以使某些编码根简洁。 

隐藏你不想让别人知道的操作。

节省编译后产生的字节码文件的大小

2. 缺点:

使程序结构不清楚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值