内部类
在一个类的内部或方法的内部声明的类,叫做内部类。语法格式: [访问修饰符] [static] class 类名{}
可以简单的把内部类理解成一个变量,只不过这个变量的数据类型是class,使用时需要创建对象后再使用。
分类:
成员内部类:直接声明在类中的内部类(同成员变量)局部内部类:生命在方法中的内部类(同局部变量)
静态内部类:使用static修饰的内部类(同静态变量)
匿名内部类:没有名字的内部类
匿名内部类的语法格式: new 类名/抽象类名/接口名(){ // 重写方法 }
实例:/**
* 国家类:演示内部类的使用
* @author 学霸联盟 - 赵灿
*/
class Country {
// 声明一个公共的字符串类型的成员变量(属性)president(总统)
public String president;
// 声明一个公共的成员内部类City(城市)
// 注意:这里不是方法,方法在名称后面要有小括号
public class City {
// 声明一个公共的String类型的province(市长)
public String province = "张三";
//非静态内部类中不能使用static声明成员
public void method(){
System.out.println("非静态内部类的非静态方法");
}
}
/*
* 创建一个公共的没有返回值的方法promote(升职)
* 因为变量province属于City类,所以要使用变量province,
* 需要先创建City类的对象,然后用City类的对象才能调用province属性
*/
public void promote() {
// 创建Family对象f
City city = new City();
// 将对象f的householder属性值赋值给president属性
// 执行后president的值也是“张三”
president = city.province;
//声明一个局部内部类,只能在该方法的内部使用,外部无法使用
class localInnerClass{ }
}
//静态内部类
public static class Province{
public static void staticMethod(){
System.out.println("静态内部类的静态方法");
}
public void method(){
System.out.println("静态内部类的非静态方法");
}
}
}
/**
* 测试类:测试内部类的使用
* @author 学霸联盟 - 赵灿
*/
public class InnerClassDemo{
public static void main(String[] args) {
//直接调用静态内部类的静态方法
Country.Province.staticMethod();
//创建静态内部类的对象
Country.Province cp = new Country.Province();
//只能使用对象调用非静态方法
cp.method();
//创建非静态内部类的对象时,必须先创建外部类的对象
Country c = new Country();
//使用外部类的对象去创建内部类的对象
Country.City cc = c.new City();
//调用非静态内部类的非静态方法
cc.method();
}
}
运行结果:
静态内部类的静态方法
静态内部类的非静态方法
非静态内部类的非静态方法