内部类

一、在一个类内部定义的类;

二、类型:成员内部类、局部内部类(方法内部类)、匿名内部类、静态嵌套类;

三、用法

a)四种内部类的共性

1、内部类仍然是一个独立的类,在编译后,内部类会被编译成独立的.class文件,只是在前面加上外部类的类名和$符号;

2、内部类不能用普通的方式访问,内部类是外部类的一个成员,因此内部类可以自由访问外部类的成员变量,无论是否是private的;

3、内部类的this引用,内部类中同样使用this.成员变量,如果要使用外部类的成员变量,则使用外部类名.this.成员变量;

b)四种内部类的区别

1、成员内部类:它相当于外部类的一个成员变量或方法,可用修饰符为final、abstract、public、private、protected、static。形式如下:

Class Outer {

calss inner{}

}

编译上述代码会产生两个文件,Outer.class和Outer$inner.class。成员内部类不允许任何静态声明!能够访问成员内部类的途径是通过外部类对象或外部类中非 静态方法;

		//外部类
		class Outer {
  			 //内部类
   			class Inner {
     				 //内部类的方法
     				 public void myInner() {
        				 System.out.println(“Inner class”);
     				 }
  			 }

 			  //非静态方法访问内部类
   			public void getInner() {
     				Inner in = new Inner();
     				in.myInner();
   			}

   			//外部访问内部类
   			pulblic static void main(String args[]) {
    				 Outer out = new Outer();
     				Outer.Inner in = out.new Inner();
     				in.myInner();
   			}
		}
		2、局部内部类(方法内部类):在外部类某个方法中定义的类,与成员内部类不同,它相当于外部类的一个局部变量,修饰符只能用final和		abstract
			i:只能在定义在该内部类的方法中实例化,不可以在此方法外对其实例化
			ii:局部内部类对象不能使用该内部类所在方法的非final局部变量,因为方法的局部变量位于栈上,只存在于该方法的生命周期内。当			一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束后,在方法内创建的内部类对象可能仍然存在于堆中!
			iii:静态方法内的局部内部类没有this的引用		
			class Outer {
				   public void doSomething() {
					      final int a = 10;
					      class Inner {
						         public void myInner() {
							            System.out.println(a);
						         }
      						}
   				}
			}
			iiii:匿名内部类:没有名字的内部类
			class Car {
  				 public void drive() {
    					  System.out.println(“Driving a car!”);
 				  }
			}

			class Temp {
   				public static void main(String[] args) {
      					Car car = new Car() {
        					 pulbic void drive() {
            						System.out.println(“Driving another car!”);
         					}
      					};
     					 car.drive();
  				 }
			}
			iiiii:接口式的匿名内部类
			
			interface Face {
   				public void drive();
			}
			class Temp {
  				 public static void main(String[] args) {
     				 Face face = new Face() {
        				 public void drive() {
         				   System.out.println();
      					   }
      				};
   				   face.drive();
 				  }
			}
iiiii:参数匿名内部类:顾名思义,将匿名内部类当成参数使用。
iiiii:静态嵌套类:从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部。因此也被称为顶级嵌套类。静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类不能访问外部类的成员和方法。
class Outer {
   static class Inner{}
}

class Temp {
   public static void main(String[] args) {
      Outer.Inner n = new Outer.Inner();
   }
}

 
 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值