内部类和嵌套类

匿名类的作用主要在于实现多继承、闭包,回调。生成的.class形式为outer$inner.class

以下是多继承的例子。
class A {}
class B {}

class P1 extends A{
	class C extends B{
		//...
	}
}

内部类和嵌套类区别

普通内部类通过引用实例与外部建立联系,所以普通内部类不能有static的变量活方法。

static在编译分配空间,而内部类依赖于外部类的实例。

接口内部类

接口中的任类何都自动是public和static。因为类是static的,只是将嵌套类置于接口的命名空间内,
这并不违反接口的规则。

内部类继承

内部类必须有实例,内部类的构造器必须链接到指向外围类对象的引用,所以在继承内部类时那个指向外围类对象的“秘密的”引用必须被初始化,而在导出类(子类)中不再存在可连接的默认对象,要解决这个问题,必须使用特殊的语法来明确说明他们之间的关联:
public class TEST {
	public static void main(String[] args){
		Outer o = new Outer();
		SubInner si = new SubInner(o);
		si.func();
	}
}

class Outer{
	class Inner{
		void func(){
			System.out.println("Outer.Inner.func");
		}
	}
}

class SubInner extends Outer.Inner{
	SubInner(Outer o){ //内部类的导出类(子类)的构造函数必须是外围类的引用,并且在构造器中要调用外围构造器.super方法。
		o.super();
	}
}


内部类.this和.new

在创建内部类的时候,必须先创建外部类的对象,然后以outobject.new Inner()的形式来创建。如此也解决了内部类的作用域问题。
如果是嵌套类,即Inner是Static的,则创建方法就不一样,不需要外部类的对象。Outer.Inner i = new Outer.Inner();

class OuterClass
{
	int data = 3;
	
	class InnerClass
	{
		void func()
		{
			//访问外围类的成员
			System.out.println("InnerClass.func "+ "data:" + data);
		}
	}
	
	InnerClass getInnerClass()
	{
		return new InnerClass();
	}
	
	OuterClass getSelf()
	{
		return OuterClass.this;
	}
}

static class StaticOuterClass
{
	static class InnerClass
	{
	}
}
public class NewTest
{
	public static void main(String[] arg)
	{
		
		OuterClass t = new OuterClass();
		//通过OuterClass.this来返回当前实例对象
		t.getSelf().getInnerClass().func();
		
		//创建内部类不可以直接通过new OuterClass.InnerClass
		//必须使用外部类的实例,通过.new语法来实现
		OuterClass.InnerClass nt = t.new InnerClass();
		nt.func();
	}
}

<完>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值