关于内部类的剖析
Posted amoswong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于内部类的剖析相关的知识,希望对你有一定的参考价值。
内部类根据使用不同的修饰符或者定位的位置不同,可以分为四种:
① 实例内部类: 内部类没有使用static修饰
② 静态内部类: 内部类使用了static修饰
③ 局部内部类: 在方法中定义的内部类
④ 匿名内部类: 适合于仅使用一次的类,属于局部内部类的特殊情况
外部类的访问修饰符:要么用public,要么缺省。
内部类看作是外部类的一个成员,好比字段,那么内部类可以使用public/缺省/protected/private修饰
还可以是static修饰
------------------------------------------------------------------------------
实例内部类:
没有使用static修饰内部类,说明内部类属于外部类的对象,而不是属于外部类。
特点:
1:创建实例内部类前,必须存在外部类对象,通过外部类对象创建内部类对象(当存在内部类对象时,一定存在外部类对象)
1 public class InstanceClass { 2 3 //创建一个内部类对象 4 Outter.Inner inner = new Outter().new Inner();//方法一 5 //创建一个内部类对象 6 Outter outter = new Outter(); 7 Outter.Inner inner2 = outter.new Inner();//方法二 8 }
2:实例内部类可以直接访问外部类成员
class Outter{ String name = "amos"; class Inner{ public void getOutterName(){ System.out.println(name); } } }
3.外部类必须通过内部类的实例去访问内部类的成员
class Outter{ public void getAge() { System.out.println(new Outter().new Inner().age); } class Inner{ String name = "wong"; }
}
4.如果实例内部类和外部类存在同名的字段或方法abc,那么在内部类中
this.abc表示访问内部类成员
外部类.this.abc:表示访问外部类成员
class Outter{ String name = "Outter"; class Inner{ String name = "Inner"; public void getName() { String name = "local"; System.out.println(name);//local System.out.println(this.name);//Inner System.out.println(Inner.this.name);//Outter } } }
-----------------------------------------------------------------------------------------------------------------------------------------------------------
静态内部类:
使用static修饰的内部类
特点:
1.在创建静态内部类的实例时,不必创建外部类的实例
Outter.Inner inner = new Outter.Inner();
2.静态内部类可以直接访问外部类的静态成员
package innerSubclassTest; class Outter{ static String name = "Outter"; static class Inner{ public void getOutterName() { System.out.println(name);//直接访问外部类静态变量name } } }
必须通过外部类的实例去访问外部类的实例成员。
class Outter{ int age = 18; static class Inner{ public void getAge() { System.out.println(new Outter().age); } } }
3.在静态内部类中可以定义静态成员和实例成员
4.测试类可以通过完整的类名直接访问静态内部类的静态成员。
以上是关于关于内部类的剖析的主要内容,如果未能解决你的问题,请参考以下文章