2019独角兽企业重金招聘Python工程师标准>>>
一、内部类Inner class
在一个类内部定义的类,可以有两种定义方式:
1. 定义在外部类里面,作为外部类的成员变量,此时可以用public, protected, default, private等访问修饰符修饰,其实际意义就是等价于外部类的一个成员变量。
package com.wbf;
public class Outer {
//public, protected, private等访问修饰符都可以,此时的Inner1就等价于Outer类的成员变量
//当我们在外部类的外面要创建Inner1的实例对象时,必须先创建外部类的实例对象,再通过外部类实例对象去创建内部类实例对象才行。见class My test1()
public class Inner1 {
}
}
class My {
void test1() {
Outer outer = new Outer();
Outer.Inner1 inner1 = outer.new Inner1();
Outer.Inner3 inner3 = new Outer.Inner3();
}
}
2. 定义在外部类的某个方法里面,此时就不是外部类的成员变量了,而是外部类这个方法的局部变量,不可以用访问修饰符修饰,只可以用static, final修饰。这种内部类既然等价于方法的局部变量,就和局部变量一样,即在方法内部先定义,方法后续的语句才可以使用。分有名内部类和匿名内部类:
package com.wbf;
public class Outer {
int out_x = 0;
public void method() {
Inner1 inner1 = new Inner1();
//方法内部定义的内部类不可以有访问修饰符
//这种内部类就等价于方法内部的局部变量,此时的修饰符只可以用final, abstract
//这种内部类既然等价于方法的局部变量,就和局部变量一样,即在方法内部先定义,方法后续的语句才可以使用。
//同时也说明这种内部类的作用域就是定义的方法,方法外部无法访问
class Inner2 {
public void method() {
out_x = 3;
}
}
Inner2 inner2 = new Inner2();
}
}
class My {
void test2() {
Outer.Inner3 inner3 = new Outer.Inner3();
}
}
package com.wbf;
public class Outer {
//方法内部定义的匿名内部类
public void start() {
new Thread(new Runnable() {
public void run() {
}
}).start();;
}
}
二、静态嵌套类
有两种:
1. 在外部类中定义的成员变量内部类加上static关键字修饰,即变为静态嵌套类
package com.wbf;
public class Outer {
//方法外部定义的内部类,加上static关键字,就变为static nested class,静态嵌套类
//在外部类的外面不需要创建外部类的实例对象就可以就可以直接创建static nested class,见class My test2()
public static class Inner3 {
}
}
class My {
void test2() {
Outer.Inner3 inner3 = new Outer.Inner3();
}
}
2. 在外部类的static方法中定义的内部类,即为静态嵌套类
package com.wbf;
public class Outer {
static int x = 10;
public static void method2() {
final int y = 20;
int z = 30;
//静态方法中定义的内部类也是static nested class,但是此时这个内部类就不可以用static修饰了,只可以用abstract, final修饰
class Inner4 {
public void method() {
x++; //访问外部类中的静态成员变量
//y++; //The final local variable y cannot be assigned, since it is defined in an enclosing type
//z++; //Cannot refer to the non-final local variable z defined in an enclosing scope
}
}
}
}