认识内部类

1、内部类的编译器处理

虚拟机对于内部类是没有办法识别的,其区分是在编译器阶段。编译器会把一个包含内部类的外部类编译两个class,在虚拟机处理的时候处理这两个class。

内部类有两个特性:

1、外部类可以创建一个内部类对象, 即使是private的class。

因为编译器在编译的时候,内部类的class里面会生成一个包可见的构造函数,在外部类创建内部类的时候就是调用的这个包可见的构造函数。

2、内部类可以访问外部类所有的属性,包括私有属性。

因为在外部类的class中,编译器生成了一个访问私有变量的静态的方法,所以内部类可以访问外部类的私有变量。

 

 

public class Outter {
	
	public Inner in = new Inner();
	private int i=0;
	private int j=10;
	
	//内部类
	class Inner{
		void print(){
			System.out.println("i="+i);
			System.out.println("j="+j);
		}
	}
	
}


以上一个包含内部类的源码Outter.java,编译器编译后生成Outter.class和Outter$Inner.class两个class

 

 

 

 

2、成员内部类

作为外部类的成员,可以直接使用外部类的包括private在内的所有成员和方法。外部类要使用内部类的成员和方法的时候,需要创建一个内部类对象。

成员内部类不能含有static的变量或方法,因为成员内部类需要先创建外部类才能创建内部类。

 

在内部类需要引用外部类的时候,可以通过outer.this来引用外部类。

创建内部类:Outer.Inner inner = new Outer().new Inner();

 

 

public class Outter {
	
	public Inner in = new Inner();
	private int i=0;
	private int j=10;
	
	public static void main(String[] args) {
		//inner创建方法一
		Outter outer = new Outter();
		Outter.Inner inner = outer.new Inner();
		inner.print();
		
		//innner创建方法二
		Outter.Inner inner1 = outer.getInner();
		inner1.print();
	}
	
	public Inner getInner(){
		return new Inner();
	}
	
	
	//内部类
	class Inner{
		void print(){
			System.out.println("i="+i);
			System.out.println("j="+j);
		}
	}
	
}


3、局部内部类

 

定义在方法或方法内的作用域中的内部类,其编译和正常内部类没有区别,其区别在于只在定义的方法或者作用域中有用,在方法或作用域外没有用。

 

4、嵌套内部类(Static内部类)

一般我们定义static的时候都说静态变量,静态方法或者静态块。只有在内部类的时候可以有静态类的概念。

内部静态类对象不需要与外部类对象之间的联系。

静态内部类和普通内部类的区别:

1、静态内部类不需要有指向外部类的引用;非静态内部类需要有指向外部类的引用。

2、静态内部类只能访问外部类的静态成员,不能访问非静态成员;非静态内部类可以访问外部类的所有成员。

3、静态内部类可以脱离外部类被创建;非静态内部类不能脱离外部类被创建。

 

5、匿名内部类

参考:http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html

没有名字的内部类。

必须是继承且只继承一个父类或者实现且只实现一个接口。

 

写法:

 

new 父类构造器(参数列表)|实现接口()    
{    
 //匿名内部类的类体部分    
}

 

 

 

 

 

在使用匿名内部类的过程中,我们需要注意如下几点:
      1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
      2、匿名内部类中是不能定义构造函数的。
      3、匿名内部类中不能存在任何的静态成员变量和静态方法。
      4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
      5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

 

6、内部类的继承

 

public class InheritInner extends WithInner.Inner { 
	 
    // InheritInner() 是不能通过编译的,一定要加上形参 
    InheritInner(WithInner wi) { 
        wi.super(); 
    } 
 
    public static void main(String[] args) { 
        WithInner wi = new WithInner(); 
        InheritInner obj = new InheritInner(wi); 
    } 
} 
 
class WithInner { 
    class Inner { 
 
    } 
} 


7、内部类的覆盖

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值