【Java】内部类与外部类的互访使用小结

内部类又称为嵌套类,可以把内部类理解为外部类的一个普通成员。

内部类访问外部类

里面的可以自由访问外面的,规则和static一样。(访问非静态时必须先创建对象)

具体如下:

非静态内部类的非静态方法

直接访问

  public class Outter {
  	int i = 5;
  	static String string = "Hello";
  	
  	class Inner1{
  		void Test1 (){
  			System.out.println(i);
  			System.out.println(string);
  		}
  	}
  } 

静态内部类的非静态方法

因为静态方法访问非静态外部成员需先创建实例,所以访问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);
  		}
  	}
  } 

 外部类访问内部类

大方向:因为将内部类理解为外部类的一个普通成员,所以外面的访问里面的需先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";  定义错误!
  	}
  } 

非静态方法访问静态内部类的成员

先“外部类.内部类”访问至内部类。

若访问静态成员,则需先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"; 
  	}
  } 

非静态方法访问非静态内部类的成员

先“外部类.内部类”访问至内部类,再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);
			}
		});


相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页