Topic: 局部类和内隐类的访问问题?? |
Print this page |
1.局部类和内隐类的访问问题?? | Copy to clipboard |
Posted by: AchillesA Posted on: 2004-08-07 15:58 “局部内部类在定义该类的作用域中可以访问所有的变量:局部变量,方法参数,实例变量(假设是一个非静态的块)和静态变量。唯一的限制是只有局部变量或者方法参数被声明为final,它才可以被访问”
public Wrapping wrap(int x)中的int i不是fianl的,但为什么能通过compile呢?还有,为什么说这里new传回的是一个reference(然后被向上转型)呢?不是传回的一个对象吗? |
2.Re:局部类和内隐类的访问问题?? [Re: AchillesA] | Copy to clipboard |
Posted by: haha石头 Posted on: 2004-08-08 12:31 public Wrapping wrap(int x)中的int i不是fianl的???? 因为在anonymous class中,并没有用到 x ,因此不必定义为 final 现在的情形,属于带参数的 anonyous class ------------------------ 我也是正在学习 thinking in java,个人意见 |
3.Re:局部类和内隐类的访问问题?? [Re: AchillesA] | Copy to clipboard |
Posted by: AchillesA Posted on: 2004-08-08 17:19 就是这样,刚看明白,谢谢 |
4.Re:局部类和内隐类的访问问题?? [Re: AchillesA] | Copy to clipboard |
Posted by: pdfjn5189 Posted on: 2004-08-10 03:39 用内部类,匿名类实现事件处理 1.事件适配器--EventAdapter 下例中采用了鼠标适配器: import java.awt.*; import java.awt.event.*; public class MouseClickHandler extends MouseAdaper{ public void mouseClicked(MouseEvent e) //只实现需要的方法 { ……} } java.awt.event包中定义的事件适配器类包括以下几个: 1.ComponentAdapter( 组件适配器) 2.ContainerAdapter( 容器适配器) 3.FocusAdapter( 焦点适配器) 4.KeyAdapter( 键盘适配器) 5.MouseAdapter( 鼠标适配器) 6.MouseMotionAdapter( 鼠标运动适配器) 7.WindowAdapter( 窗口适配器) 2. 用内部类实现事件处理 内部类(inner class)是被定义于另一个类中的类,使用内部类的主要原因是由于: ◇ 一个内部类的对象可访问外部类的成员方法和变量,包括私有的成员。 ◇ 实现事件监听器时,采用内部类、匿名类编程非常容易实现其功能。 ◇ 编写事件驱动程序,内部类很方便。 因此内部类所能够应用的地方往往是在AWT的事件处理机制中。 例5.11 import java.awt.* ; import java.awt.event.*; public class InnerClass{ private Frame f; private TextField tf; public InnerClass(){ f=new Frame("Inner classes example"); tf=new TextField(30); } public voidi launchFrame(){ Label label=new Label("Click and drag the mouse"); f.add(label,BorderLayout.NORTH); f.add(tf,BorderLayout.SOUTH); f.addMouseMotionListener(new MyMouseMotionListener());/*参数为内部类对象*/ f.setSize(300,200); f.setVisible(true); } class MyMouseMotionListener extends MouseMotionAdapter{ /*内部类开始*/ public void mouseDragged(MouseEvent e) { String s="Mouse dragging: x="+e.getX()+"Y="+e.getY(); tf.setText; } } ; public static void main(String args[]) { InnerClass obj=new InnerClass(); obj.launchFrame(); } }//内部类结束 } 3.匿名类(Anonymous Class) 当一个内部类的类声名只是在创建此类对象时用了一次,而且要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类,由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父 类的构造方法,并且重写父类的方法。所谓的匿名就是该类连名字都没有,只是显示地调用一个无参的父类的构造方法。 例5.12 import java.awt.* ; import java.awt.event.*; public class AnonymousClass{ private Frame f; private TextField tf; public AnonymousClass(){ f=new Frame("Inner classes example"); tf=new TextField(30); } public void launchFrame(){ Label label=new Label("Click and drag the mouse"); f.add(label,BorderLayout.NORTH); f.add(tf,BorderLayout.SOUTH); f.addMouseMotionListener(new MouseMotionAdapter(){ //匿名类开始 public void mouseDragged(MouseEvent e){ String s="Mouse dragging: x="+e.getX()+"Y="+e.getY(); tf.setText; } } ); //匿名类结束 f.setSize(300,200); f.setVisible(true); } public static void main(String args[]) { AnonymousClass obj=new AnonymousClass(); obj.launchFrame(); } } 其实大家仔细分析一下,例5.11和5.12实现的都是完全一样的功能,只不过采取的方式不同。5.11中的事件处理类是一个内部类,而5.12的事件处理类是匿名类,可以说从类的关系来说是越来越不清楚,但 是程序也越来越简练。熟悉这两种方式也十分有助于大家编写图形界面的程序 /** 一个应用程序,用来演示内部类的使用 */ /** 类Outer */ class Outer{ private static int size; /** 内部类Inner的声明 */ public class Inner{ private int size; /** 方法doStuff() */ public void doStuff(int size){ size++; //存取局部变量 this.size++; //存取其内部类的成员变量 Outer.this.size++; //存取其外部类的成员变量 System.out.println(size+" "+this.size+" "+Outer.this.size); } }//内部类Inner结束 /** 类Outer中定义的实例方法testInner()方法 */ public void testInner(){ Inner i=new Inner(); i.doStuff(5); } /** main()方法 */ public static void main(String[] a){ Outer o=new Outer(); o.testInner(); } } |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |