当前位置:  技术问答>java相关

请问java内部类有何用?很重要吗?thinking in java 看的我如入云雾,实在头大~

    来源: 互联网  发布时间:2015-03-01

    本文导语:  | 内部类,有时叫做嵌套类,被附加到JDK1.1及更高版本中。内部类允许一个类定义被放到另一个类定义里。内部类是一个有用的特征,因为它们允许将逻辑上同属性的类组合到一起,并在另一个类中控制一个类的...


|
内部类,有时叫做嵌套类,被附加到JDK1.1及更高版本中。内部类允许一个类定义被放到另一个类定义里。内部类是一个有用的特征,因为它们允许将逻辑上同属性的类组合到一起,并在另一个类中控制一个类的可视性。
6.14.1  内部类基础
    下述例子表示使用内部类的共同方法:
1. import java.awt.*;
2. import java.awt.event.*; 
3. public class MyFrame extends Frame{ 
4.     Button myButton;
5.     TextArea myTextArea;
6.     int count;; 
7.
8.     public MyFrame(){
9.         super("Inner Class Frame");
10.      myButton = new Button("click me");
11.      myTextArea = new TextArea(); 
12.      add(myButton,BorderLayout,CENTER); 
13.      add(myTextArea,BorderLayout,NORTH);
14.      ButtonListener bList = new ButtonListener(); 
15.      myButton.addActionListener(bList); 
16.  } 
17.  class ButtonListener implements ActionListener{ 
18.    public void actionPerformed(ActionEvent e){ 
19.    count ++ 
20.      myTextArea.setText("button clicked" + {
21.          count + "times");
22.    }
23.  }// end of innerclass ButtonListener
24.
25.  public static void main(String args[]){ 
26.    MyFrame f = new MyFrame();
27.    f.setSize(300,300);
28.    f.setVisible(true);
29.  }
30. } // end of class MyFrame 

    前面的例子包含一个类MyFrame,它包括一个内部类ButtonListener。编译器生成一个类文件,MyFrame$ButtonListener.class以及toMyFrame.class。它包含在MyFrame.class中,是在类的外部创建的。

6.14.2  如何做内部类工作?
    内部类可访问它们所嵌套的类的范围。所嵌套的类的成员的访问性是关键而且很有用。对嵌套类的范围的访问是可能的,因为内部类实际上有一个隐含的引用指向外部类上下文(如外部类“this”)。
1. public class MyFrame extends Frame{
2.     Button myButton;
3.     TextArea myTextarea;
4.     public MyFrame(){
5.       ......................
6.       ......................
7.       MyFrame$ButtonListener bList = new 
8.                MyFrame$ButtonListener(this); 
9.       myButton.addActionListener(bList); 
10.    }
11.    class MyFrame$ButtonListener implements 
12.    ActionListener{
13.    private MyFrame outerThis;
14.    Myframe$ButtonListener(MyFrame outerThisArg){ 
15.       outerThis = outerThisArg; 
16.    }
17.    
18.    public void actionPerformed(ActionEvent e) { 
19.    outerThis.MyTextArea.setText("buttonclicked"); 
20.    ......................
21.    ......................
22.    }
23.    public static void main(String args[]){
24.      MyFrame f = new MyFrame();
25.      f.setSize(300,300);
26.      f.setVisible(true);
27.    }
28. } 
    有时可能要从static方法或在没有this的某些其它情况下,创建一个内部类的一个实例(例如,main)。可以如下这么做:
public static void main(String args[]){
    MyFrame f = new MyFrame();
    MyFrame.ButtonListener bList =
           f.new ButtonListener(); 
    f.setSize(50,50);
    f.setVisible(true); 
}

6.14.3  内部类属性

内部类属性    类名称只能用在定义过的范围中,除非用限定的名称。    内部类的名称必须与所嵌套的类不同。    内部类可以被定义在方法中。    任何变量,不论是本地变量还是正式参数,如果变量被标记为final,那么,就可以被内部类中的方法访问。
    内部类有如下属性:
    类名称只能用在定义过的范围中,除非用在限定的名称中。内部类的名称必须与所嵌套的类不同。
    内部类可以被定义在方法中。这条规则较简单,它支配到所嵌套类方法的变量的访问。任何变量,不论是本地变量还是正式参数,如果变量被标记为final,那么,就可以被内部类中的方法访问。
内部类可以使用所嵌套类的类和实例变量以及所嵌套的块中的本地变量。
内部类可以被定义为abstract.
    属性
    只有内部类可以被声明为private或protected,以便防护它们不受来自外部类的访问。访问保护不阻止内部类使用其它类的任何成员,只要一个类嵌套另一个。
    一个内部类可以作为一个接口,由另一个内部类实现。
    被自动地声明为static的内部类成为顶层类。这些内部类失去了在本地范围和其它内部类中使用数据或变量的能力。
    内部类不能声明任何static成员;只有顶层类可以声明static成员。因此,一个需求static成员的内部类必须使用来自顶层类的成员。

|
内部类的一个重要功能就是内部类可以方便的访问外部类的变量和方法,而这些方法可能在外部是不能允许访问的。
应该说内部类是比较重要的!

|
GUI开发的listener经常会用到内部类~

|
例如C语言中一个函数要对学生的信息操作
void f()
{
 struct str
 {
   ing number;
   char name[20];
   ing age;
  };
  struct str s;
  s.number=10;
  ……
}
转换成java后就可以在一个类里定义一个内类,相当于c中的结构体
该结构体只在该类中可实例化

|
我认为在这方面java核心技术卷一讲的较清楚
实际中和少用到
只是在scjp中要求掌握
可能我还没有感到它的好处!

|
在开发GUI程序时对简单的事件处理的监听器的实现一般都使用匿名内部类,
而且内部内很实用的,特别是在开发GUI程序的时候!
你在用JBUILDER的时候看看它生成的源程序的时候就会知道它的作用了,
几乎全是匿名内部类。

    
 
 

您可能感兴趣的文章:

  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • 请问JAVA如何定义常量实行多个JAVA程序共用?
  • 请问java2与java1.1差别大不大
  • 初学JAVA,请问各位哪本数据结构(JAVA版)比较好?
  • 急!请问有分析java程序性能瓶颈的工具吗?例如,统计 java 程序中函数调用次数?
  • 请问Java的各位仁兄那个Java 2 Runtime Environment在哪里安装的?
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • 请问Java能干什么,java vm的速度是在是太慢!
  • 我没用过Java,请问各位大侠Java中除了/*...*/用作注释外,还有什么符号可用于注释符?
  • 请问Java TM Programming Language中的TM(在Java的右角上)是什么意思啊?
  • 请问大家用什么开发java程序,我基本上学会了java语法,不知用什么来开发它?
  • 请问:java 入门以及学好Java要看哪些书籍阿????
  • 请问哪里有java docs 的下载,中文版的,它是java的类库手册么?
  • 请问java高手,谁知道java怎么用 *.dll ???
  • 请问::大家用Java是做application还是applet?我要是学Java,重点放在那儿部分?
  • 请问各位大虾,小弟今天开始学jsp了,这学期我们有java课,所以已经下载了jdk(好象是1.2),请问我的98环境怎么配置jsp环境呀?我的jdk可以运行.java程序,别的我就不知道了....谢谢!
  • 请问:在哪里能找到JAVA编译器和解释器?我是一个初学者。我想学JAVA。
  • 各位,我是一个JAVA的初学者,想买有关JAVA的参考书,请问什么书好?
  • 我是一名JAVA初学者,请问哪里有比较好的JAVA的源程序下载
  • 请问java程序中的import为什么有的用java.….*,而有的又用java.….…,有什么区别吗?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问《Think in Java》的作者的网站网址是多少?
  • 请问哪里可以下载thinking in java 中的源代码?
  • 请问在thinking java中如何导入import com.bruceeckel.util.*
  • 请问到哪儿能下载think in java.的电子版。
  • 请问那位大侠有已被翻译出的Thinking in Java2第二版的文稿
  • 请问各位高手哪里有thinking in java的电子书下载?要E文的!!谢谢
  • 请问大家看完think in java用多少时间呀?
  • 请问哪位大虾做过Thinking in Java 2/e的exercises? 求教!这是我能给的最大分值,抱歉
  • 请问:我知道路由器的telnet密码,但忘记了enable 密码,请问如何是好?
  • 请问那里有SYBASE的jbdb 2.0下载;jspsmartupload可以直接将文件上传到数据库,请问如何使用
  • 请问最新的reahat9.0是基于什么核心的?2.4?2.6?请问那里能下载?
  • 请问:请问哪里有关于linux基本操作命令讲解的资料下载,最好是幻灯片格式的.
  • 请问,我试图用#admintool&图形工具命令来安装sun workshop5.0,为什么进入的却是用户管理界面?请问具体该如何在solaris下安装应用软件
  • 请问在Redhat 9里,我从登录就是图形介面,请问如何在图形介面内进入命令行方式呢,谢谢
  • 请问玩过SOLARIS的高手门,在不正常关机后,就不能启动到windows公用桌面了,只能在命令提示模式下了,请问怎么解决这个问题啊?急~!~!
  • 请问:我在redhat下装了bochs-2.2.1-1.rpm,.装了后,想设置一下,但找不到bochsrc.fda.bxrc,请问这个文件在哪个曰录下啊。
  • 请问:在配置Qt时,很多文档都说在.profile,.login里加东西,但是我好像没有发现有这两个文件上,请问这些文件在哪个目录下啊
  • 请问:在GCC里的C程序里的变量的声明是不是只能在前面,而且相同类型的变量的声明只能放在一起?如果不是,请问怎么样可以解决这个问题.
  • 主机是WIN2000,我用的是LUNIX,请问是否可以共享上网? 如果可以请问如何设置? 500分答谢,龟儿食言!
  • 请问linux下GUI开发的问题!
  • 请问出现fstab文件丢失该怎么修复呀?
  • 请问这个方法如何调用?
  • 请问一个奇怪的问题!
  • 请问在网页中打开的新窗口,如何让其居中。
  • 请问我该学什么了
  • 请问安装zhcon,cxterm问题
  • 非常急! 请问daemontools 在red hat 9下的安装问题? 在线等待
  • 我没用过Java,请问各位大侠Java中除了/*...*/用作注释外,还有什么符号可用于注释符? iis7站长之家


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3