java 内部类

 为什么需要内部类?
java内部类有什么好处?为什么需要内部类?

真正的原因是这样的,java中的内部类和接口加在一起,可以解决常被C++程序员抱怨java中存在的一个问题 没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。

(1) 内部成员类(非static内部类)
外部类必须先于内部类实例创建!在外部类的非Static成员函数中可以像普通类一样使用内部成员类,这是因为如果调用了这个成员函数说明外部类一定已经存在实例了。
但是在外部类中的static成员函数中,外部类实例不一定建立了,所以要先建立外部类,然后再建立内部类。对于其他类要访问某个类中的内部类一样,也要先建立外部类

package com.zgd;

public class OutClass {
	
	class InnerClass{
		private int x = 0;

		public int getX() {
			return x;
		}

		public void setX(int x) {
			this.x = x;
		}

		@Override
		public String toString() {
			return "InnerClass [x=" + x + "]";
		}

		public InnerClass(int x) {
			super();
			this.x = x;
		}
		
	}
	
	//在外部类的非Static方法中,可以像使用普通类一样使用内部类
	public InnerClass getInnerClass(){
		InnerClass inner = new InnerClass(2);
		return inner;	
	}
	
	public static void main(String[] args) {
//		InnerClass inner3 = new InnerClass(2);
//		this is wrong!? 因为要新建内部类实例必须要先建立外部类实例
//		在外部类的static函数中必须使用“外部类.内部类”的形式访问
//		而新建内部类必须通过 "外部类实例.new 内部类()" 方法来实现
		
		OutClass out = new OutClass();
		OutClass.InnerClass inner = out.new InnerClass(1);
		System.out.println(inner);
		
		
//		但是在外部类的非static函数中可以像使用普通类一样使用内部类,因为如果调用了非static成员函数
//		说明外部类肯定已经新建了实例,否则是不可能调用非static成员函数的
		OutClass.InnerClass inner2 = out.getInnerClass();
		System.out.println(inner2);
		
	}

}

以上内部类的作用仅仅是名字隐藏和组织代码的一种结构和功能,但是内部类还有其他更重要的功能,内部类有外围类所有元素的访问权限,通过指向外部类的指针实现:“外部类名.this”(这一点C++没有)。在新建内部类时,内部类会秘密地获取一个指向外部类的引用,后期可以通过这个引用去访问外围类。

外部类名.this 外部类对象的引用!

System.out.println("Print in inner Outer.index=" + pouter.this.index);
System.out.println("Print in inner Inner.index=" + this.index);
(2)匿名内部类:特别是返回一个接口interface的实例对象时特别有用

Comparator接口便是一个很好的例子,在Collections需要得到最大值时依赖于接口中的compare方法,这样一个临时类的需要产生,用匿名类再方便不过了!

Map.Entry<PhoneNum, String> temp = Collections.max(list, new Comparator<Map.Entry<PhoneNum, String>>() {

   @Override
   public int compare(Entry<PhoneNum, String> o1,
     Entry<PhoneNum, String> o2) {
    // TODO Auto-generated method stub
    return o1.getKey().getAreaNum() - o2.getKey().getAreaNum();
    //return 0;
   }
   
  });
(3)嵌套类:如果成员内部类不需要和外部类有联系,可以声明为static,这样的内部类成为嵌套类。

因为嵌套类是static的,所以创建嵌套类时不需要创建外部类;由于是static,可能未创建外部类所以不能引用外部类的非static成员;另外嵌套类中可以包含static数据,而普通内部类由于不是static所以不能包含。而且嵌套类也不再具有指向外围类的指针.this了!

 (4)为什么需要内部类???
内部类实现接口和外部类实现接口之间的差别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值