内部类可以分为:静态内部类(嵌套类)和非静态内部类。非静态内部类又可以分为:成员内部类、方法内部类、匿名内部类
静态内部类和非静态内部类说明
- 静态内部类可以有静态成员,而非静态内部类则不能有静态成员。
- 静态内部类可以访问外部类的静态变量,而不可访问外部类的非静态变量。
- 非静态内部类的非静态成员可以访问外部类的非静态变量。
- 静态内部类的创建不依赖于外部类,而非静态内部类必须依赖于外部类的创建而创建。
/**
* @Title 内部类学习
* @author ljy
* @Date
*/
public class InternalLearn{
private int noStaticInt = 1;
private static int STATIC_INT = 2;
public void fun() {
System.out.println("外部类方法");
}
public class InnerClass {
//static int string = "1"; 这么写不行 编译报错
public void innerFun() {
// 非静态内部类 可以访问外部的静态以及非静态的东西
System.out.println(STATIC_INT);
System.out.println(noStaticInt);
}
}
public static class StaticInnerClass {
//static int string = "1";//可以
public void fun() {
// 静态内部只可以访问外部的静态以及非静态的东西
System.out.println(STATIC_INT);
//System.out.println(noStaticInt); 编译报错
}
}
public static void main(String[] args) {
// 非静态内部类必须先创建外部类创建内部类
InternalLearn.InnerClass innerClass = new InternalLearn().new InnerClass();
// 静态内部类的创建方式
InternalLearn.StaticInnerClass staticInnerClass = new InternalLearn.StaticInnerClass();
}
}
局部内部类
如果一个类只被当前类使用,我们可以叫他局部内部类,可以直接把内部类写到方法是
注意点:
- 局部内类不能用 public,protected,private 访问修饰符进行声明。
- 局部内部类对外完全隐藏,除了创建这个类的方法可以访问它,其他的地方是不允许访问的。
- 对比成员内部类,局部内部类还可以访问局部变量,但该变量必须声明为 final,且在内部类中不允许对该变量重新赋值
package ljy.com.learn.lambdaLearn;
import ljy.com.learn.lambdaLearn.service.LambdaLoginCallBack;
/**
* @Title 内部类学习
* @author ljy
* @Date
*/
public class InternalLearn{
private int NOT_STATIC = 1;
private static int STATIC_PAR = 2;
public void functionInnerClass(String params) {
final int count=1;
class FunctionInnerClass {
private void fun() {
// 可以使用 静态非静态 以及传入参数
System.out.println(STATIC_PAR);
System.out.println(NOT_STATIC);
System.out.println(params);
//count++; //代码报错不能修改
//如果要是用 count 必须是 final修饰的
}
}
FunctionInnerClass functionClass = new FunctionInnerClass();
functionClass.fun();
}
public static void main(String[] args) {
new InternalLearn().functionInnerClass("ljy");
}
}
#####################结果#############
2
1
ljy
Process finished with exit code 0