目录
public class InnerClass {
String name;
private Integer age;
static String hobby;
/**
* 成员内部类
* 1、成员内部类中只能定义非静态属性和方法
* 2、成员内部类中可以访问外部类的成员,私有的可以,静态的也可以
*/
public class MemberInnerClass {
//static int num; 报错
int age = 20;
public void test() {
//当本类中没有该属性,则会去外部类中寻找该属性,访问外部类属性
System.out.println("访问外部类的成员变量:" + name); // => null
//当本类中有该属性,此时访问的是内部类的 age,this代表的是 MemberInnerClass
System.out.println("访问内部类的成员变量:" + age); // => 20
System.out.println("访问外部类的私有成员变量:" + InnerClass.this.age);// =>null
System.out.println("访问外部类的静态成员变量:" + hobby); // => null
}
}
}
成员内部类的创建方式
静态内部类的创建方式
/**
* 局部内部类:定义在外部类方法中
* 1、局部内部类中只能定义非静态属性和方法
* 2、局部内部类中可以访问外部类的成员,私有的可以,静态的也可以
* 3、局部内部类只能在方法内创建对象
* 4、局部内部类只能访问 局部常量
* 在jdk1.7版本中,如果局部变量在局部内部类中使用必须要显式的加上final
* 在jdk1.8版本中,final是默认加上的
* 因为局部变量在方法结束后,就会被销毁,而局部内部类的对象却要等到内存回收机制进行
* 销毁所以如果是常量的话,那么常量就会被存放在常量池中,
*/
public void method() {
int n = 10;
int m = 10;
m=20;
final int[] nums = {1};
final InnerClass innerClass = new InnerClass();
class LocalInnerClass {
public void test() {
//局部变量被访问时默认添加了 final 关键字
System.out.println("访问外部类的方法的局部变量:" + n);
/* Variable 'n' is accessed from within inner class,
needs to be final or effectively final
报错,n 可以被内部类访问,需要是常量值或有效的常量值
因为 m 在外部已经被修改了,它不再是有效的常量值 */
System.out.println("访问外部类的方法的局部变量:" + m);
// n=20; 常量不能被修改
/*不报错,因为 final 修饰的基本数据类型的数值不能被改变,
但是被 final 修饰的引用变量它的引用对象不能改变,
但是其中的属性可以改变*/
nums[0] = 20;
innerClass.name = "张三";
//nums=new int[10]; 报错 常量值不能更改
//innerClass=new InnerClass(); 报错
System.out.println("访问外部类的成员变量:" + name);
System.out.println("访问外部类的私有成员变量:" + age);
System.out.println("访问外部类的静态成员变量:" + hobby);
}
}
//只能在被创建的方法中创建该类
LocalInnerClass localInnerClass = new LocalInnerClass();
localInnerClass.test();
}
/**
* 匿名内部类:本身就是一个对象
* 1、匿名内部类本身就是一个对象
* 2、一般在匿名内部类中不会定义属性和方法,因为没有意义
* 3、匿名内部类的父类一般都是抽象类或者是接口
* 4、访问变量机制和局部内部类一致
* 匿名内部类的应用场景
* 如果一个方法的参数是接口,且这个接口只需要实现一次,那么就可以使用匿名内部类
* 这个接口的实现每一次都不相同,就可以使用匿名内部类
*/
public void test() {
int n = 10; // 默认添加了 final
//例如创建一个线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// n=20; 报错
System.out.println("访问外部类的成员变量:" + name);
System.out.println("访问外部类的私有成员变量:" + age);
System.out.println("访问外部类的静态成员变量:" + hobby);
}
});
}