java内部类和匿名类从入门到深入.docx
- 文档编号:25660626
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:20
- 大小:17.74KB
java内部类和匿名类从入门到深入.docx
《java内部类和匿名类从入门到深入.docx》由会员分享,可在线阅读,更多相关《java内部类和匿名类从入门到深入.docx(20页珍藏版)》请在冰豆网上搜索。
java内部类和匿名类从入门到深入
1内部类
⏹内部类定义:
⏹在A类的内部但是所有方法的外部定义了一个B类,则B类就是A类的内部类,A是B的外部类
⏹内部类访问原则
⏹内部类的方法可以访问外部类所有的成员
⏹外部类的方法不可以直接访问内部类的成员
⏹内部类的优点:
⏹可以让一个类方便的访问另一个类中的所有成员
⏹增加程序的安全性,有效避免其他不相关类对该类的访问
⏹何时使用内部类
⏹如果一个A类要使用B类的所有成员,并且A类不需要被除B类以外的其他类访问,则我们应当把A类定义为B类的内部类
⏹classA{
⏹privateinti=1;
⏹privatevoidf(){
⏹}
⏹
⏹//B是A的内部类
⏹classB{
⏹publicintbi=10;
⏹
⏹//非静态的内部类可以访问外部类所有的成员
⏹publicvoidg(){
⏹System.out.printf("i=%d\n",i);
⏹f();
⏹}
⏹}
⏹
⏹publicvoidk(){
⏹//g();//error外部类的方法不可以直接访问内部类的成员
⏹//System.out.println(bi);//error外部类的方法不可以直接访问内部类的成员
⏹
⏹Bbb=newB();
⏹bb.g();
⏹}
⏹}
⏹publicclassTest{
⏹publicstaticvoidmain(String[]args){
⏹Aaa=newA();
⏹aa.k();
⏹}
⏹}
本程序证明了:
•外部类的方法不可以直接访问内部类的成员
•内部类的方法却可以访问外部类的所有成员
匿名类
⏹匿名类是一种特殊的内部类
⏹如果在一个方法内部定义了一个匿名类,则该匿名类可以访问
⏹外部类的所有成员
⏹包裹本匿名类的方法中的所有final类型的局部变量,非fianl类型的局部变量无法被匿名类访问
⏹importjava.awt.*;
⏹importjava.awt.event.*;
⏹publicclassTestWindow
⏹{
⏹publicstaticvoidmain(String[]args)
⏹{
⏹//如果把10行的final去掉,本程序在18行就会报错,
⏹//因为匿名类只能访问包裹它的方法中的final类型的局部变量
⏹finalFramef=newFrame();//10
⏹f.setSize(200,200);
⏹f.addWindowListener(
⏹newWindowAdapter()
⏹{
⏹publicvoidwindowClosing(WindowEvente)
⏹{
⏹f.setVisible(false);//18行
⏹System.exit(-1);
⏹}
⏹}
⏹);
⏹f.setVisible(true);
⏹}
⏹}
创建匿名类的三种方式
⏹继承父类
⏹实现接口
⏹实现抽象类
创建匿名类之实现接口
⏹假设A是接口名
⏹格式:
newA()
{
实现接口中方法的代码
};
⏹功能:
⏹生成一个实现了A接口的匿名类
创建匿名类之实现抽象类
⏹假设A是抽象类
⏹格式:
⏹newA()
⏹{
⏹实现了A类的所有抽象类的方法代码
⏹添加自己的方法或属性代码【不建议,因为没有实际意义】
⏹}
⏹功能:
⏹生成一个匿名类,该匿名类必须得实现了A类的所有抽象方法,当然该匿名类也可以定义自己的属性和方法
创建匿名类之继承父类
⏹假设A是个类名
⏹格式:
⏹newA()
⏹{
⏹重写了A类的方法代码
⏹添加自己的属性和方法【不建议,因为没有实际意义】
⏹}
⏹功能:
⏹生成一个A类的子类对象,该匿名类对象继承了A的所有非private成员
classA{
privateinti=1;
privatevoidf(){
System.out.println("哈哈");
}
//B是A的内部类
classB{
publicintbi=10;
//非静态的内部类可以访问外部类所有的成员
publicvoidg(){
System.out.printf("i=%d\n",i);
f();
}
}
publicvoidk(){
//g();//error外部类的方法不可以直接访问内部类的成员
//System.out.println(bi);//error外部类的方法不可以直接访问内部类的成员
Bbb=newB();
bb.g();
}
}
publicclassTest{
publicstaticvoidmain(String[]args){
Aaa=newA();
aa.k();
}
}
/*
假设A是接口名
newA()
{
实现接口中方法的代码
};
功能:
生成一个实现了A接口的匿名类
*/
interfaceIt
{
voidf();
//voidg();//如果该语句生效的话,21行到27行的代码中就必须的实现g方法
}
publicclassTestAnonyClass_1
{
publicstaticvoidmain(String[]args)
{
Itit=newIt()
{//21行
publicvoidf()
{
System.out.println("哈哈");
}
};//27行
//error
//Itit=newIt1()
//(//是{不是(
//publicvoidf()
//{
//System.out.println("哈哈");
//}
//);//是}不是)
//error
//Itit=newIt()
//(
//{
//publicvoidf()
//{
//System.out.println("哈哈");
//}
//}
//;
it.f();
}
}
/*
假设A是抽象类
newA()
{
实现了A类的所有抽象类的方法代码
添加自己的方法或属性代码【不建议,因为没有实际意义】
}
功能:
生成一个匿名类,该匿名类必须得实现了A类的所有抽象方法,
当然该匿名类也可以定义自己的属性和方法
*/
abstractclassA
{
abstractpublicvoidf();
publicvoidg()
{
}
}
publicclassTestAnonyClass_2
{
publicstaticvoidmain(String[]args)
{
Aaa=newA()
{
//f方法不可以被注释掉,因为f是抽象方法,匿名类必须的实现
publicvoidf()
{
System.out.println("FFFF");
}
//g方法可以被注释掉
publicvoidg()
{
System.out.println("GGGG");
}
publicvoidk()
{
}
};
aa.f();
aa.g();
//aa.k();
}
}
/*
在JDK1.6中的运行结果是:
-----------------------------
FFFF
GGGG
-----------------------------
*/
/*
假设A是个类名
newA()
{
重写了A类的方法代码
自己添加的属性和方法【【不建议,因为没有实际意义】】
}
功能:
生成一个A类的子类对象,该匿名类对象继承了A的所有非private成员
*/
classA
{
publicvoidf()
{
System.out.println("哈哈");
}
}
publicclassTestAnonyClass_3
{
publicstaticvoidmain(String[]args)
{
Aaa=newA()
{
//重写了父类A的方法
publicvoidf()
{
System.out.println("嘿嘿");
}
//可以定义自己的方法,但没有任何实际意义
publicvoidg()
{
System.out.println("GGGG");
}
};
aa.f();
//aa.g();//error
}
}
/*
在JDK1.6中的运行结果是:
-----------------------------
FFFF
GGGG
-----------------------------
*/
/*
2009年6月25日16:
14:
23
文本框内容相加方法一:
主函数代码过多
程序逻辑混乱
不推荐
*/
importjava.awt.*;
importjava.awt.event.*;
publicclassTestTF_1
{
publicstaticTextFieldtf1,tf2,tf3;
publicstaticvoidmain(String[]args)
{
Framef=newFrame();
tf1=newTextField(30);
tf2=newTextField(30);
tf3=newTextField(30);
Buttonbn=newButton("=");
Labellb=newLabel("+");
f.setLayout(newFlowLayout());
f.add(tf1);
f.add(lb);
f.add(tf2);
f.add(bn);
f.add(tf3);
bn.addActionListener(newMyMonitor());
f.pack();
f.setVisible(true);
}
}
classMyMonitorimplementsActionListener
{
publicvoidactionPerformed(ActionEvente)
{
intnum1=Integer.parseInt(TestTF_1.tf1.getText());
intnum2=Integer.parseInt(TestTF_1.tf2.getText());
intnum3=num1+num2;
TestTF_1.tf3.setText(num3+"");
}
}
/*
2009年6月25日16:
33:
20
文本框内容相加方法二:
通过在B类中定义A类的属性,就可以达到在B类访问A类成员的目的
但是通过这种方式无法访问A类私有成员
本方式既繁琐又有局限性,不推荐
*/
importjava.awt.*;
importjava.awt.event.*;
publicclassTestTF_2
{
publicstaticvoidmain(String[]args)
{
newTF().launch();
}
}
classTF
{
publicTextFieldtf1,tf2,tf3;
publicvoidlaunch()
{
Framef=newFrame();
tf1=newTextField(30);
tf2=newTextField(30);
tf3=newTextField(30);
Buttonbn=newButton("=");
Labellb=newLabel("+");
f.setLayout(newFlowLayout());
f.add(tf1);
f.add(lb);
f.add(tf2);
f.add(bn);
f.add(tf3);
bn.addActionListener(newMyMonitor(this));
f.pack();
f.setVisible(true);
}
}
classMyMonitorimplementsActionListener
{
publicTFtf=null;
publicMyMonitor()
{
}
publicMyMonitor(TFtf)
{
this.tf=tf;
}
publicvoidactionPerformed(ActionEvente)
{
intnum1=Integer.parseInt(tf.tf1.getText());
intnum2=Integer.parseInt(tf.tf2.getText());
intnum3=num1+num2;
tf.tf3.setText(num3+"");
}
}
/*
2009年6月25日16:
37:
28
文本框内容相加方法三:
把B当做A的内部类,则我们就可以在B类中轻松访问A类的所有成员,当然包括私有成员
推荐
*/
importjava.awt.*;
importjava.awt.event.*;
publicclassTestTF_3
{
publicstaticvoidmain(String[]args)
{
newTF().launch();
}
}
classTF
{
publicTextFieldtf1,tf2,tf3;
publicvoidlaunch()
{
Framef=newFrame();
tf1=newTextField(30);
tf2=newTextField(30);
tf3=newTextField(30);
Buttonbn=newButton("=");
Labellb=newLabel("+");
f.setLayout(newFlowLayout());
f.add(tf1);
f.add(lb);
f.add(tf2);
f.add(bn);
f.add(tf3);
bn.addActionListener(newMyMonitor());
f.pack();
f.setVisible(true);
}
classMyMonitorimplementsActionListener
{
publicvoidactionPerformed(ActionEvente)
{
intnum1=Integer.parseInt(tf1.getText());
intnum2=Integer.parseInt(tf2.getText());
intnum3=num1+num2;
tf3.setText(num3+"");
}
}
}
/*
2009年6月25日16:
37:
28
文本框内容相加方法三:
把B当做A的内部类,则我们就可以在B类中轻松访问A类的所有成员,当然包括私有成员
推荐
*/
importjava.awt.*;
importjava.awt.event.*;
publicclassTestTF_3
{
publicstaticvoidmain(String[]args)
{
newTF().launch();
}
}
classTF
{
publicTextFieldtf1,tf2,tf3;
publicvoidlaunch()
{
Framef=newFrame();
tf1=newTextField(30);
tf2=newTextField(30);
tf3=newTextField(30);
Buttonbn=newButton("=");
Labellb=newLabel("+");
f.setLayout(newFlowLayout());
f.add(tf1);
f.add(lb);
f.add(tf2);
f.add(bn);
f.add(tf3);
bn.addActionListener(newMyMonitor());
f.pack();
f.setVisible(true);
}
classMyMonitorimplementsActionListener
{
publicvoidactionPerformed(ActionEvente)
{
intnum1=Integer.parseInt(tf1.getText());
intnum2=Integer.parseInt(tf2.getText());
intnum3=num1+num2;
tf3.setText(num3+"");
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 部类 匿名 入门 深入
![提示](https://static.bdocx.com/images/bang_tan.gif)