首先回顾内部类和匿名内部类的定义
内部类:
将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类、嵌套类)
.访问特点:
1)内部类可以直接访问外部类中的成员,包括私有成员
2)而外部类要访问内部类中的成员必须要建立内部类的对象
一般用于类的设计,分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容,这是就是还有的事物定义成内部类来描述。
class Outer{
private int num=3;
class Inner{//内部类
void show(){
System.out.println("show run..."+num);//内部类可以直接访问外部类的成员
}
}
public void method(){
Inner in=new Inner();//外部类要访问内部类,必须建立内部类的对象
in.show();
}
}
public class InnerClassDemo {
public static void main(String[] args){
Outer outer=new Outer();
outer.method();
}
}
2.带修饰符的内部类:
特点:
如果内部类是私有的,访问不到
package com.bsoft.InnerClass;
class Outer{
private int num=3;
/***
* 普通内部类
* @author Administrator
*
*/
class Inner{//内部类
void show(){
System.out.println("show run..."+num);//内部类可以直接访问外部类的成员
}
}
public void method(){
Inner in=new Inner();//外部类要访问内部类,必须建立内部类的对象
in.show();
}
/**
* 带修饰符的内部类
* @author Administrator
*
*/
private class InnerPrivate {
void show(){
System.out.println("show run..."+num);//内部类可以直接访问外部类的成员
}
}
public void method2(){
Inner in=new Inner();//外部类要访问内部类,必须建立内部类的对象
in.show();
}
}
在外访问:
package com.bsoft.InnerClass;
public class InnerClassDemo {
public static void main(String[] args){
Outer outer=new Outer();
outer.method();
/**
* 初始化内部类对象
*/
Outer.Inner inner = new Outer().new Inner();
inner.show();
// Outer.InnerPrivate 由于是私有的 ,所以访问不到
}
}
看图片更加清楚:
3.静态内部类
特点:内部类是静态的,不能访问非静态成员
若要访问 num也必须是static型
/***
* 静态内部类
*/
static class Inner3{//内部类
void show(){
//内部类是静态的,不能访问非静态成员
// System.out.println("show run...."+num);
System.out.println("show run...."+staticNum);
}
}
外部调用如下:
/**
* 静态内部类调用
*/
//如果是静态内部类,相当于外部类,Outer.inner3 in = new Outer.inter3();
//如果内部类是静态的,成员时静态的
Outer.Inner3 staticIn = new Outer.Inner3();
staticIn.function();
等同于
/**
* 静态内部类调用
*/
//如果是静态内部类,相当于外部类,Outer.inner3 in = new outer.inter();
//如果内部类是静态的,成员时静态的
Outer.Inner3.function();
匿名内部类:
匿名内部类是内部类的简写形式,
必须有前提:内部类必须继承或者实现一个外部类或者接口
匿名内部类其实就是一哥匿名子类对象
格式:new 父类 or 接口(){子类内容}
package com.bsoft.util;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class JfreamXsjyb extends JFrame{
JButton OKButton ;
public JfreamXsjyb() {
OKButton = new JButton("确定");
OKButton.addActionListener(new myOKButtonListener());
}
class myOKButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getActionCommand()=="确定"){
createLableAndInput();
}
}
}
public void createLableAndInput(){
/***
* dosomeThing
*/
}
}