当前位置: 技术问答>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成员的内部类必须使用来自顶层类的成员。
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中的结构体
该结构体只在该类中可实例化
void f()
{
struct str
{
ing number;
char name[20];
ing age;
};
struct str s;
s.number=10;
……
}
转换成java后就可以在一个类里定义一个内类,相当于c中的结构体
该结构体只在该类中可实例化
|
我认为在这方面java核心技术卷一讲的较清楚
实际中和少用到
只是在scjp中要求掌握
可能我还没有感到它的好处!
实际中和少用到
只是在scjp中要求掌握
可能我还没有感到它的好处!
|
在开发GUI程序时对简单的事件处理的监听器的实现一般都使用匿名内部类,
而且内部内很实用的,特别是在开发GUI程序的时候!
你在用JBUILDER的时候看看它生成的源程序的时候就会知道它的作用了,
几乎全是匿名内部类。
而且内部内很实用的,特别是在开发GUI程序的时候!
你在用JBUILDER的时候看看它生成的源程序的时候就会知道它的作用了,
几乎全是匿名内部类。