内部类
概念:一个类中又书写其他的类,包含在内的类,属于内部类
作用:
内部类的作用:让某个类只能让本类内部能够访问到,其他的类访问不到。
例如:
package com.insideClassPart;
public class Student {
private String name;
private int age;
private Address address;
// 内部类Address类,属于某个实例级别的,作为实例的属性来使用
private class Address{ // 同时通常将内部类私有
private String city;
private String country;
private String zone;
}
}
内部类分类
内部类分类为:普通内部类 (实例级别),静态内部类,局部内部类,匿名内部类。
内部类的编译后的文件名格式:外部类$.内部类.class
普通内部类
实例级别,作为实例的属性来使用,依托外部类。
package com.insideClassPart;
public class Student {
public String name;
public int age;
public Address address;
// 内部类Address类,属于某个实例级别的,作为实例的属性来使用
// 普通内部类
public class Address{ // 同时通常将内部类私有 private 修饰
private String city;
private String country;
private String zone;
}
}
package com.insideClassPart;
public class Test01 {
public static void main(String[] args) {
Student stu = new Student();
stu.name = "aqua";
stu.age = 18;
// 当内部类的修饰符为 public时
stu.address = stu.new Address();
// 临时new一个Student对象,再new一个内部类对象
Student.Address address = new Student().new Address();
}
}
静态内部类
package com.insideClassPart;
// 外部类
public class Pet {
private String name;
private int age;
// 实例级别
public void eat(){
System.out.println("外部类-实例-吃饭");
}
// 静态方法
public static void sleep(){
System.out.println("外部类-静态-睡觉");
}
// 静态内部类
public static class Address{
private String country;
private String city;
// 实例方法
public void printCountry(){
// 创建外部类对象
Pet pet = new Pet();
// 访问外部类实例方法
pet.eat();
// 访问外部类属性
pet.name = "九月";
// 访问内部类属性
this.city = "杭州";
System.out.println("内部类-实例-打印国家");
System.out.println(pet.name);
System.out.println(city);
}
// 静态方法
public static void printCity(){
System.out.println("内部类-静态-打印城市");
}
}
}
package com.insideClassPart;
// 测试静态内部类
public class Test02 {
public static void main(String[] args) {
// 只要访问权限允许,可以通过类名直接访问静态内部类中方法或创建对象
Pet.Address address = new Pet.Address();
System.out.println("address = " + address);
// 访问静态内部类中的方法
address.printCountry(); // 实例级别
Pet.Address.printCity(); // 静态级别,推荐
// address.printCity(); // 静态级别 不推荐这种方式访问
}
}
局部内部类
局部内部类,首先回顾局部变量写在方法中,则局部内部类也写在方法中。
访问范围只能在这个方法内访问到。
public class Outer2 {
private String field1;
private int field2;
public void m1(){
System.out.println(field1);
System.out.println(field2);
int a = 100;
class Inner2{
private String field1;
private int field2;
public void m2(){
// a = 123 // 报错
System.out.println(a);
System.out.println("局部内部类中的m2方法");
}
}
Inner2 inner2 = new Inner2();
inner2.m2();
}
public static void main(String[] args) {
Outer2 outer2 = new Outer2();
outer2.m1();
}
}
注意:
在局部内部类中访问外部类方法中的局部变量时,此局部变量将默认以final修饰。(可通过class文件查看)。表示在局部内部类中,只能访问外部方法中的局部变量,不能修改外部方法中的局部变量;
原因:
因为 外部类中的局部变量 将随着方法的执行完毕 出栈 而内部类对象可能不会立即被回收掉,所以在局部内部类在中 修改一个已经出栈的数据 是行不通的。