java内部类详解
文章目录
一. 类的五大成员
属性、构造方法、一般方法、块、内部类
二 . 内部类
内部类分为4种:成员内部类、静态内部类、匿名内部类、局部内部类。
特点:可以共享外部类的成员(属性,方法)
1.成员内部类
public class Outer {
String name;
public void run() {
System.out.println("外部类方法");
}
//成员内部类
class MemberInner{
public void cat() {
name = "";
run();
}
}
}
/**
* 1. 成员内部类可以任意修饰符, 相当于一个普通成员
* 2. 成员内部类不能定义任何 static成员
* 3. 成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象
* 4. 格式 :Outer.MemberInner memberInner=new Outer().new MemberInner();
* 5. 内部类可直接访问外部类的私有成员,而不破坏封装
* 6. 成员内部类访问外部类的重名属性 Outer.this.name
*/
2.静态内部类
public class Outer {
String name;
public void run() {
System.out.println("外部类方法");
}
//静态内部类
static class MemberInner{
}
}
/**
* 1. 静态内部类可以任意修饰符, 相当于一个静态成员
* 2. 静态内部类可以定义任何成员
* 3. 只能访问外部类的静态成员
* 4. 格式 :Outer.MemberInner memberInner=new Outer.MemberInner();
* 5. 内部类可直接访问外部类的私有成员,而不破坏封装
*/
3. 局部内部类
public class Outer {
String name;
public void run() {
class MemberInner{
private String name;
}
MemberInner memberInter=new MemberInner();
}
}
/**
* 1. 作用域为方法体, 方法结束就回收
*/
4.匿名内部类
4.1 接口创建匿名内部类
public class Outer {
String name;
public void run() {
new Runnable(){
@Override
public void run(){
}
}.run();
}
}
/**
* 1. 一个没有名字的实现类
* 2. 匿名内部类本身是一个对象可以在方法中传递
* 3. 如果使用方法中的成员必须是 final 修饰
* 4. 对于匿名内部类的使用它是存在一个缺陷的,就是它仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,
* 该类的定义会立即消失,所以匿名内部类是不能够被重复使用
*/
4.1 类创建匿名内部类
public class Outer {
String name;
public void run() {
new Runnable(){
@Override
public void run(){
}
}.run();
}
}
/**
* 1. 一个没有名字的子类
* 2. 匿名内部类本身是一个对象可以在方法中传递
* 3. 如果使用方法中的成员必须是 final 修饰
* 4. 对于匿名内部类的使用它是存在一个缺陷的,就是它仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,
* 该类的定义会立即消失,所以匿名内部类是不能够被重复使用
*/
三. 内部类标识符
每个类都会产生一个.class文件,其中包含了如何创建该类型的对象的全部信息,内部类也必须生成一个 .class 文件,从而可以包含它自己的 Class 对象信息,这些类文件的命名有严格的规则:外部类名字+“$”+ 内部类名字