码迷,mamicode.com
首页 > 其他好文 > 详细

内部类简单介绍

时间:2016-05-12 19:18:31      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

       内部类就是在一个类中再定义一个类,内部类可以起到包装隐藏的作用,不允许同一包中的其他类来访问该类,内部类的方法可以访问所以外部类的数据。Think in Java中:每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个接口的实现,对内部类是没有影响的。

【1】成员内部类

【2】静态内部类

【3】局部内部类

【4】匿名内部类


成员内部类

       成员内部类也是最为普通的内部类,他是外部类的一个成员,所以可以无限制的访问外部类中是所以变量和方法,但是外部类访问内部类必须通过内部类的实例也就是对象才能访问。成员内部类不能访问任何的static变量和方法。

<span style="font-size:18px;">package OneWeek;
public class OrdOuter {
	private String name = "zhangsan";
	private int age = 999;
	private int score = 10000;
	public String getNameAge(){
		return "姓名:"+this.name+" 年龄:"+this.age;
	}
	public class Inner{
		private int score = 100;
		public void test(){
			System.out.println("内部类访问外部类的name:"+name);
			System.out.println("内部类访问外部类的age:"+age);
			
			System.out.println("访问内部类的score:"+score);
			System.out.println("访问外部类的score:"+OrdOuter.this.score);
		}
	}
	public static void main(String args[]){
		OrdOuter out = new OrdOuter();
		Inner in = out.new Inner();
		System.out.println(out.getNameAge());
		in.test();
	}
}</span>


静态内部类

       前面提到static可以修饰成员变量、方法、代码块,他还可以修饰内部类,我们称之为静态内部类。静态内部类和普通的成员内部类是不同的,普通的成员内部类在编译之后会隐含保存着一个指向外部类的引用,而静态内部类是没有的,也就是说他的创建不需要依赖外部类,他不能使用任何外部类中的非静态变量和方法。

<span style="font-size:18px;">package OneWeek;
public class StaOuter {
	private static String name = "zhangsan";
	private static int age = 999;
	private static int score = 10000;
	public static String getNameAge(){
		return "姓名:"+name+" 年龄:"+age;
	}
	public static class Inner{
		private static int score = 100;
		public void test(){
			System.out.println("内部类访问外部类的name:"+name);
			System.out.println("内部类访问内部类的score:"+Inner.score);//访问相同的变量时要加类名
			System.out.println("内部类访问外部类的score:"+StaOuter.score);
		}
	}
	public static void main(String args[]){
		Inner in = new Inner();
		//System.out.println(in.getNameAge());//不能直接访问外部类中的静态方法		
		in.test();
	}
}</span>


局部内部类

       局部内部类也叫方法内部类,其实就是将内部类定义在方法之中,限制了其有效范围,方法内部类只在方法的内部可见,也就是只能再该方法中使用。

<span style="font-size:18px;">package OneWeek;
public class MetOuter {
	private String name = "张三";
	private int age = 666;
	public String getNameAge(){
		return "姓名:"+name+" 年龄:"+age;
	}
	public void show(){
		class Inner{
			private String name = "李四";
			private int age = 999;			
			public String getNameAge(){
				return "姓名:"+name+" 年龄:"+age;
			}
		}
		Inner in = new Inner();//只能在该方法中调用该类
		System.out.println(in.getNameAge());
	}
	public static void main(String args[]){
		MetOuter out = new MetOuter();
		out.show();// 调用的也是内部类中的变量
	}
}</span>

匿名内部类

       匿名内部类必须继承一个父类或者实现一个接口,同时其没有class关键字,是通过new来生成一个对象的引用。匿名类中不能定义构造函数,匿名类中不能有static变量和方法,匿名内部类不能是抽象的,他必须实现继承的类或者是实现接口的所有抽象方法。

<span style="font-size:18px;">package OneWeek;
public class OutClass {
	public InnerClass1 getInnerClass(final int num){//外部类中的方法
		return new InnerClass1(){//匿名内部类的创建
			int n = num*6;
			public int getNumber(){//实现抽象类中的方法,或者是接口中的方法
				return n;
			}
		};	
	}
	abstract class InnerClass1{//需要实现的抽象类或者接口
		abstract int getNumber();
	}
	
	public static void main(String args[]){
        OutClass out = new OutClass();  
        InnerClass1 inner = out.getInnerClass(2); //直接调用方法 
        System.out.println(inner.getNumber());  
	}
}</span>

       匿名内部类通过new 的方式来创建,只不过上面的例子是将new 的创建和外部类方法的返回相结合了。

我们给匿名内部类传递的参数也是final类型,其目的是保证参数的一致性,内部类的属性和外部类方法的参数时不相同的,外部看起来一样但却是可以独立变换的,如上边例子中的fianl int num,外部类方法中的参数num传递给了内部类中的n,为了保证这两个的一致性,必须使用final。

内部类简单介绍

标签:

原文地址:http://blog.csdn.net/jinhuoxingkong/article/details/51355992

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!