内部类(Inner Class)

内部类(Inner Class)

内部类共有四种:
    1. 静态内部类(Static Inner Class):只能访问外部类的静态成员变量与静态方法,声明方式如下:
      public class OuterTest {
      	
      	private static String str;
      	
      	/**
      	 * 静态内部类
      	 * @author asus
      	 *
      	 */
      	public static class InnerClass
      	{
      		public void get()
      		{
      			str = "Hello World";
      			
      			System.out.println(str);
      		}
      	}
      }
      静态内部类的访问方式如下:
      		OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
      		
      		innerClass.get();

    2. 成员内部类(Member Inner Class):可以访问外部类的静态与非静态方法与成员变量。
      public class OuterClass {
      	
      	private static String str;
      	
      	/**
      	 * 成员内部类
      	 * @author asus
      	 *
      	 */
      	public class InnerClass
      	{
      		public void get()
      		{
      			str = "Hello World";
      			
      			System.out.println(str);
      		}
      	}
      }
      生成成员内部类的方式如下:
      		OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
      		
      		innerClass.get();
      public class OuterClass {
      	
      	private String str = "Hello World";
      	
      	/**
      	 * 成员内部类
      	 * @author asus
      	 *
      	 */
      	public class InnerClass
      	{
      		private String str = "Inner Class";
      		
      		public void get()
      		{
      			System.out.println(OuterClass.this.str);
      		}
      	}	
      }

      如果内部类与外部类的属性名称相同,内部类想访问外部类的属性需采用如下方式:
      public class OuterClass {
      	
      	private String str = "Hello World";
      	
      	/**
      	 * 成员内部类
      	 * @author asus
      	 *
      	 */
      	public class InnerClass
      	{
      		private String str = "Inner Class";
      		
      		public void get()
      		{
      			System.out.println(OuterClass.this.str);
      		}
      	}
      	
      	public static void main(String[] args) {
      		OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
      		
      		innerClass.get();
      	}
      }

    3. 局部内部类(Local Inner Class):定义在方法当中,只能访问方法中声明的final类型的变量。
      public class OuterClass {
      	
      	private String str = "Hello World";
      	
      	public void get()
      	{
      		final int num = 123;
      		
      		class InnerClass
      		{
      			public void get()
      			{
      				System.out.println(str + num);
      			}
      		}
      		
      		new InnerClass().get();
      	}
      	
      	public static void main(String[] args) {
      		OuterClass outerClass = new OuterClass();
      		outerClass.get();
      	}
      }

    4. 匿名内部类(Anonymous Inner Class):匿名内部类会隐式地继承一个父类或实现一个接口。
      import java.util.Date;
      
      public class OuterClass {
      	
      	public static String say(Date date)
      	{
      		return "Hello " + date;
      	}
      	
      	
      	public static void main(String[] args) {
      		
      		/*
      		 * 定义了一个内部类,该内部类隐式地继承了Date类
      		 * 并在say方法调用时,创建了一个继承自Date类的一个子类对象
      		 * 并将该子类对象的引用传递给say方法
      		 */
      		String str = OuterClass.say(new Date()
      		{
      		});
      		
      		System.out.println(str);
      	}
      }
      如果该匿名类未重写Date类的toString()方法将输出:Hello Tue Mar 04 22:06:43 CST 2014
如果重写了toString()方法:
import java.util.Date;

public class OuterClass {
	
	public static String say(Date date)
	{
		return "Hello " + date;
	}
	
	
	public static void main(String[] args) {
		
		/*
		 * 定义了一个内部类,该内部类隐式地继承了Date类
		 * 并在say方法调用时,创建了一个继承自Date类的一个子类对象
		 * 并将该子类对象的引用传递给say方法
		 */
		String str = OuterClass.say(new Date()
		{
			@Override
			public String toString() {
				return "World";
			}
		});
		
		System.out.println(str);
	}
}
结果将为:Hello World

当打印引用时,实际上会打印引用所指对象的 toString()方法的返回值 ,因为每个类都直接或间接地继承自Object,而 toString()方法是Object类里的一个实例方法 因此所有java对象都具有toString方法。 toString方法是一个”自我描述“方法,该方法总是返回该对象实现类的类名 +@+hashCode 值。

你可能感兴趣的:(java,内部类,Class,inner)