仅作为了解。。。
内部类就是一个类在另一个类的里面。
内部类的分类:
- 成员内部类
- 局部内部类
- 静态内部类
- 匿名内部类
成员内部类特点
-
成员内部类在成员位置
-
创建:1.在外部类里面:外部类名 name=new 外部类名();
2.在外部类外面:外部类名.内部类名 name=new 外部类名().new 内部类名(); -
调用:外部类.内部类.属性(方法)();
局部内部类特点
- 局部内部类不能用public或private所修饰
- 局部内部类作用域被限定在声明该类的方法块中
- 局部内部类可以对外界完全隐藏起来,除了所在的方法之外,对其他方法而言是不透明的
- 局部内部类不仅可以访问包含它的外部类的成员,还可以访问局部变量,但这些局部变量必须被final所修饰。
静态内部类特点
- 静态内部类不用实例化
- 静态内部类可以有静态成员和非静态成员
- 静态内部类只能调用外部的静态成员
- 外部类不可以定义为静态
- 创建:1.在非外部类中:外部类名.内部类名 name=new 外部类.内部类();
2.在外部类中:内部类名 name=new 内部类名(); - 外部类可以直接通过“外部类.内部类.属性(方法)”的方式直接调用。
匿名内部类
- 类似于匿名对象但是将类写在匿名对象后面
- 匿名内部类常用格式总结
new 父类或者接口(){
重写父类或者接口里的函数
一般就一两个
};
举个栗子
class outer{
void show()
{
System.out.println("这是外部类。。。");
}
//内部类在局部位置的测试
void method()
{
final int x=2; //当内部类在局部位置访问局部变量时 前要加final关键字
//内部类在局部位置
class ininer{
void input()
{
System.out.println("这是一个局部内部类。。。"+x);
}
}
ininer in=new ininer();
in.input();
}
private int num=1;
//内部类在成员位置
class iner{
void put()
{
System.out.println("这是一个内部类。。。"+num); //可以访问外部类的成员
}
}
}
class InclassDemo{
public static void main(String[] args)
{
//在成员位置的内部类
outer.iner a=new outer().new iner(); //ok,长得比较奇怪
a.put();
//在局部位置的内部类
outer out=new outer();
out.method();
}
}
匿名内部类
//格式一
package chapter09;
class USB{
void open() {};
void close() {};
}
class PC
{
void use(){
new USB(){
public void open(){
System.out.println("插上鼠标");
}
public void close(){
System.out.println("拔掉鼠标");
}
}.open();
}
}
class InerDemo{
public static void main(String[] args)
{
PC p=new PC();
p.use();
}
}
//格式二
package chapter09;
class USB{
void open() {};
void close() {};
}
class PC
{
void use(){
USB u=new USB(){
public void open(){
System.out.println("插上鼠标");
}
public void close(){
System.out.println("拔掉鼠标");
}
};
u.open();
u.close();
}
}
class InerDemo{
public static void main(String[] args)
{
PC p=new PC();
p.use();
}
}
匿名对象传值使用
class USB{
void open() {};
void close() {};
}
class PC
{
void use(USB u)
{
u.open();
u.close();
}
}
class InerDemo{
public static void main(String[] args)
{
PC p=new PC();
p.use(new USB() {
public void open(){
System.out.println("插上鼠标");
}
public void close(){
System.out.println("拔掉鼠标");
}
});
}
}