目录
1.静态内部类
1.1概念
被static修饰的内部类是静态内部类
class Outer {
static class Inner{
}
}
这个Inner就是静态内部类
1.2特点
1.2.1不能直接访问外部类的非静态成员
(外部类静态成员和内部类所有成员都能访问)
class Outer{
public int a=1;
//静态内部类
static class Inner{
public void func(){
System.out.println(a);
}
}
}
public class Test {
public static void main(String[] args) {
Outer.Inner inner=new Outer.Inner();
inner.func();
}
}
java: 无法从静态上下文中引用非静态 变量 a
不能直接访问外部类的非静态成员,但是可以通过创建对象来访问外部类的非静态成员
class Outer{
public int a=1;
//静态内部类
static class Inner{
public void func(){
Outer outer=new Outer();
System.out.println(outer.a);
}
}
}
1.2.2外部类可以访问静态内部类中所有的成员
class Outer{
static class Inner{
public int a=4;
private int b=5;
public static int c=6;
}
public void func1(){
Inner inner=new Inner();
System.out.println(inner.a);
System.out.println(inner.b);
System.out.println(Inner.c);
}
}
public class Test {
public static void main(String[] args) {
Outer outer=new Outer();
outer.func1();
}
}
注:静态变量用类名访问
1.2.3创建静态内部类对象时,不需要先创建外部类对象
Outer.Inner inner=new Outer.Inner();
inner.func();
2.实例内部类
2.1概念
未被static修饰的成员内部类。
class Outer{
class Inner{
}
}
}
这个Inner就是实例内部类
2.2特点
2.2.1在实例内部类中不能定义静态的成员变量
class Outer{
class Inner{
public static int a=6;
public void func() {
System.out.println(a);
}
}
}
public class Test {
public static void main(String[] args) {
//实例内部类
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.func();
}
}
java: 内部类Outer.Inner中的静态声明非法
修饰符 'static' 仅允许在常量变量声明中使用
如果要定义就加final变成常量
class Outer{
class Inner{
public static final int a=6;
public void func() {
System.out.println("InnerClass::func");
System.out.println(a);
}
}
}
public class Test {
public static void main(String[] args) {
//实例内部类
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.func();
}
}
2.2.2在实例内部类中可以直接访问外部类中任意访问限定符修饰的成员
class Outer{
public int a=1;
private int b=2;
public static int c=3;
class Inner{
public void func() {
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
}
2.2.3如果外部类和实例内部类中具有相同名称成员时,优先访问的是内部类自己的
class Outer{
public int a=1;
private int b=2;
public static int c=3;
class Inner{
public int a=4;
public void func() {
System.out.println(a);
}
}
}
4
2.2.4在实例内部类中,this包含非静态内部类和外部类
访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问
class Outer{
public int a=1;
class Inner{
//就近原则
public int a=2;
public void func() {
System.out.println(this.a);
System.out.println("=======");
System.out.println(Outer.this.a);
}
}
}
2
=======
1
2.2.5实例内部类对象必须在先有外部类对象前提下才能创建
public static void main(String[] args) {
//实例内部类
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.func();
}
3.局部内部类
3.1概念
定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用
class Outer {
public void func() {
class Inner {
}
}
}
这个Inner就是局部内部类
3.2特点
3.2.1局部内部类只能在所定义的方法体内部使用
class Outer {
int a = 1;
public void func() {
class Inner {
public void test() {
System.out.println(a);
}
}
Inner inner = new Inner();
inner.test();
}
}
不在所定义的方法体内部使用会报错
public class Test{
public static void main(String[] args) {
Out.Inner inner = null;
}
}
java: 不是语句
3.2.2不能被public、static等修饰符修饰
class Outer {
public void func() {
static class Inner {
}
}
}
class Outer {
public void func() {
public class Inner {
}
}
}
java: 非法的表达式开始