`

黑马程序员--java基础复习--内部类和匿名类

 
阅读更多

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ---------------------

  内部类是指在一个外部类的内部再定义一个类,内部类是作为外部类的成员而存在的,其依附于外部类。

  为什么需要内部类呢?每个内部类可以独立的继承继承一个接口的实现,当然也可以实现不同的接口,所以无论外部类是否已经继承该接口的实现,对于内部类没有影响。所以相当于一个类继承了某接口的实现,在其内部又有个内部类继承了另外一个接口的实现,这算多继承的一种实现吧。

   为什么可以把它看做多继承实现呢?因为内部类一般定义出来只是给外部那个类使用的,基本上没有谁会定义一个内部类还想把他给外部类之外的类使用,要使用的话也会非常麻烦的。

   内部类分为成员内部类,局部内部类,静态内部类和匿名内部类

  成员内部类:顾名思义就是外部类的一个成员,可以有不同的访问修饰符,在使用局部内部类的时候,需要有一个外部类的对象供其依附:

public class Test {
	private String str = "22222";

	public static void main(String[] args) {		
		new Test().f();
	}

	public void f() {
		new Inner().f();//默认this.new Inner().f();
	}

	private class Inner {
		public void f() {
			System.out.println("ssss" + str);
		}
	}

}

 

成员内部类中不可以定义静态成员,这大概是因为成员内部类要实例化必须先有外部类对象,如果要实例化多个内部类对象,还公用一个静态成员,那么将静态成员分给外部类的普通成员更合理吧。

2、局部内部类

  在方法中定义的内部类,与局部变量类似,局部内部类不能有访问修饰符,但它可以访问当前代码块的常量(用final修饰的局部变量),和外围类的所有成员

 

public class Test {
	private String str = "22222";

	public static void main(String[] args) {		
		new Test().g(1);
		
	}	
	
	public void g(final int i){
		class Inner_1{
			public void f(){
				System.out.println(str + i);
			}
		}
		
		new Inner_1().f();
	}

}

 

3、静态内部类,和静态成员一样理解,普通的内部类对象隐含地保存了一个引用只想创建它的外部类对象,而静态内部类就不需要有外部类对象存在,直接用外部类名就可以创建了,在静态内部类中不能访问外部类的非静态成员。

4、匿名内部类,这种类多用在事件处理上

在使用匿名内部类时,要记住以下几个原则: 
 ·匿名内部类不能有构造方法。   
 ·匿名内部类不能定义任何静态成员、方法和类。   
 ·匿名内部类不能是public,protected,private,static。   
 ·只能创建匿名内部类的一个实例。 
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。   
 ·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

 (粘自网络

如果匿名类的几类有带参数的构造函数,是可以写new ClassA(参数){}因为参数不在匿名类内部直接被使用

 

java中的枚举用的就是内部类来实现:

package exercise;

public class TestTraffic {
	public static void main(String[] args) {
		TrafficLamp lamp = TrafficLamp.GREEN;

		System.out.println(lamp + ":" +lamp.getTime());
		System.out.println(lamp.nextLamp() + ":" + lamp.nextLamp().getTime());
	}

	public enum TrafficLamp {
		GREEN(45) {
			public TrafficLamp nextLamp() {
				return YELLOW;
			}
		},//相当于匿名类,并实现了抽象方法
		RED(30) {
			public TrafficLamp nextLamp() {
				return GREEN;
			}
		},
		YELLOW(5) {
			public TrafficLamp nextLamp() {
				return GREEN;
			}
		};//定义3个枚举变量,相当于通过TrafficLamp来实例三个交通灯颜色,这段代码必须放到最前边

		private final int time;
		
		//定义TrafficLamp的构造方法
		private TrafficLamp(int time) {
			this.time = time;
		}
		
		//定义一个抽象方法,每次实例该枚举的时候,都必须实现该方法
		public abstract TrafficLamp nextLamp();

		public int getTime() {
			return time;
		}
	}
}

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics