【Java】内部类与外部类的互访使用小结
内部类又称为嵌套类,可以把内部类理解为外部类的一个普通成员。
内部类访问外部类
里面的可以自由访问外面的,规则和static一样。(访问非静态时必须先创建对象)
具体如下:
非静态内部类的非静态方法
直接访问
- public class Outter {
- int i = 5;
- static String string = "Hello";
- class Inner1{
- void Test1 (){
- System.out.println(i);
- System.out.println(string);
- }
- }
- }<span style="font-family:Arial,Helvetica,sans-serif"> </span>
静态内部类的非静态方法
因为静态方法访问非静态外部成员需先创建实例,所以访问i时必须先new外部类。
- public class Outter {
- int i = 5;
- static String string = "Hello";
- static class Inner2{
- void Test1 (){
- System.out.println(new Outter().i);
- System.out.println(string);
- }
- }
- }
静态内部类的静态方法
规则如上
- public class Outter {
- int i = 5;
- static String string = "Hello";
- static class Inner2{
- static void Test2 (){
- System.out.println(new Outter().i);
- System.out.println(string);
- }
- }
- }<span style="font-family:Arial,Helvetica,sans-serif"> </span>
外部类访问内部类
大方向:因为将内部类理解为外部类的一个普通成员,所以外面的访问里面的需先new一个对象。
非静态方法访问非静态内部类的成员:
new 内部类对象
- public class Outter {
- void Test1(){
- System.out.println(new Inner1().i);
- }
- class Inner1{
- int i = 5;
- // static String string = "Hello"; 定义错误!
- }
- }
静态方法访问非静态内部类的成员
静态方法Test2访问非静态Inner1需先new外部类;
继续访问非静态成员i需先new 内部类
所以访问规则为:new Outter().new Inner1().i。
- public class Outter {
- static void Test2(){
- System.out.println(new Outter().new Inner1().i);
- }
- class Inner1{
- int i = 5;
- // static String string = "Hello"; 定义错误!
- }
- }<span style="font-family:Arial,Helvetica,sans-serif"> </span>
非静态方法访问静态内部类的成员
先“外部类.内部类”访问至内部类。
若访问静态成员,则需先new再访问;若访问非静态成员,则可直接访问。
- public class Outter {
- void Test1(){
- Outter.Inner2 inner2 = new Outter.Inner2();
- System.out.println(inner2.i);
- System.out.println(inner2.string);
- System.out.println(Outter.Inner2.string);
- }
- static class Inner2{
- int i = 5;
- static String string = "Hello";
- }
- }<span style="font-family:Arial,Helvetica,sans-serif"> </span>
非静态方法访问非静态内部类的成员
先“外部类.内部类”访问至内部类,再new即可访问静态成员。
- public class Outter {
- void Test1(){
- Outter.Inner1 inner2 = new Outter.Inner1();
- System.out.println(inner2.i);
- }
- class Inner1{
- int i = 5;
- // static String string = "Hello"; 定义错误!
- }
- }
匿名内部类
匿名内部类访问外部成员变量时,成员变量前应加final关键字。
- final int k = 6;
- ((Button)findViewById(R.id.button2)).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- System.out.println(k);
- }
- });