现在的位置: 首页 > 综合 > 正文

理解 java 内部类

2013年08月10日 ⁄ 综合 ⁄ 共 1991字 ⁄ 字号 评论关闭

1、内部类基础知识:

一般定义在java类内部的类成为内部类

内部类可以分为:定义在方法体外部的类、定义方法内部的类、静态内部类(只能定义在方法外部),匿名内部类

说明:

定义在方法外面的类:

类的成员变量(静态、非静态)可以访问,为了保证能够正确的引用的类的成员变量,所以必须先实例化外部类的对象,才可以实例化内部类的对象

访问权限可以任何,可以把它看成类的成员变量,这样理解就好多来了。

定义在方法体内的类;

类的成员变量(静态、非静态)可以访问,为了保证能够正确的引用的类的成员变量,所以必须先实例化外部类的对象,才可以实例化内部类的对象

访问权限不可以有,把他看成方法的局部变量就可以了。

静态内部类:

只能访问类的静态成员变量

访问权限任何

匿名内部类:

类的成员变量(静态、非静态)可以访问,为了保证能够正确的引用的类的成员变量,所以必须先实例化外部类的对象,才可以实例化内部类的对象

访问权限不可以有

2、内部类的作用

内部类可以很好的隐藏类,一般类不允许有private protect default访问权限。

内部类可以实现多重继承,弥补了java不能多继承的特点

3、例子

package com.ajun.test.innerclass.example;

/**
 * 水果内容
 * @author Administrator
 *
 */
public interface Contents {
	 String value();
}

package com.ajun.test.innerclass.example;

/**
 * 水果目的地
 * @author Administrator
 *
 */
public interface Destination {

	//目的地
	String readLabel();
}

package com.ajun.test.innerclass.example;

public class Goods {

	private String des="is ruit!!";
	
	//方法外部
	private class Content implements Contents{
	    private String name = "apple "+des;
		@Override
		public String value() {
			return name;
		}
	}
	
	//方法外部
	private class GDestination implements Destination{
		private String label ;
		private GDestination(String label){
			this.label= label;
		}
		@Override
		public String readLabel() {
			return label;
		}
	}
	
	
	//匿名内部类
	public Destination getdestination(final String label){
		return new Destination(){
			@Override
			public String readLabel() {
				return label;
			}
		};
	}
	
	public Destination dest(String s){
		return new GDestination(s);
	}
	
	public Contents  content(){
		return new Content();
	}
	
	public Destination dest2(String s){
		class GDestination implements Destination{
				private String label;
				private GDestination(String label){
					this.label= label;
				}
				@Override
				public String readLabel() {
					return label;
				}
		}
		return new GDestination(s);
   }
	
}

package com.ajun.test.innerclass.example;

public class Test {

	public static void main(String [] a){
		Goods gs = new Goods();
		Contents c = gs.content();
		Destination d = gs.dest("Beijing");
		System.out.println(c.value());
		System.out.println(d.readLabel());
		Destination d1 = gs.getdestination("Shanghai");
		System.out.println(d1.readLabel());
		System.out.println(gs.dest2("Tianjin").readLabel());
	}
}

其中Content和Gdestination得到了很好的隐藏,外面调用的时候,根本就不知道调用的是具体哪个类,使这个类拥有多继承的特性。

输出;

apple is ruit!!
Beijing
Shanghai
Tianjin

抱歉!评论已关闭.