内部类总结

1. 内部类

   首先要了解什么是内部类,它是怎么定义的?查了一些资料,它是如下这么定义的。

定义:内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可以为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。

我认为使用内部类最主要的原因是:它可以提供继承多个具体的或抽象的类,有效的实现了“多重继承”。

   根据位置的不同,java中的内部类分为四种:

         <1>静态内部类 

         <2>成员内部类

     <3>局部内部类

         <4>匿名内部类

【1】静态内部类
  简单的说:将内部类申明为static,不能与外部类有相同的名字。
 只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。
 生成静态内部类对象的方式为:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
静态内部类演示:
public class StaticInner {

	int b = 5;
	private static int a = 4;
	// 静态内部类
	public static class Inner {
		public void test() {
			// 静态内部类可以访问外部类的静态成员
			// 并且它只能访问静态的
			System.out.println(a);
			//System.out.println(a + b);//编译异常
		}
	}
}
StaticInner.Inner inner = new StaticInner.Inner();
		inner.test();
【2】成员 内部类
  成员内部类作为外部的一个成员存在,与外部类的属性,方法并列,不用static修饰。
 它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以
 在外部类里面创建成员内部类的实例:   
this.new Innerclass();
  在外部类之外创建内部类的实例:
(new Outerclass()).new Innerclass();
  在内部类里访问外部类的成员:
Outerclass.this.member
成员内部类演示:
public class Outer {

	int b = 5;
	private int a = 4;
	// 静态内部类
	public class Inner {
		
		private int a = 8;
		
		public void test() {
			 // 直接访问外部类对象
            System.out.println(b);
            
            System.out.println(a);// 直接访问a,则访问的是内部类里的a

            // 如何访问到外部类里的a呢?
            System.out.println(Outer.this.a);
		}
	}
}
//先创建外部类,再创建内部类
		Outer.Inner inner = new Outer().new Inner();
		inner.test();
输出结果:
5
4
8
【3】局部 内部类
    局部内部类像局部变量一样,不能被public, protected, private和static修饰,只能访问方法中定义的final类型的局部变量。
public class Outer {
	
	int a = 1;
	public void doSomething() {
		int b = 2;
		final int c = 3;
		// 定义一个局部内部类
		class Inner3 {
			public void test() {		
				System.out.println(a);
				// 不可以访问非final的局部变量
				// System.out.println(b);
				// 可以访问final变量
				System.out.println(c);
			}
		}
		// 创建局部内部类的实例并调用方法
		new Inner3().test();
	}
}
【4】匿名 内部类
简单的说:匿名内部类就是没有名字的类。
使用匿名内部类的情况:
   1、只用到类的一个实例
   2、类在定义后马上用到
   3、类非常小
使用匿名内部类的主要原则:
   1、匿名内部类不能有构造方法
   2、匿名内部类不能定义任何静态成员、方法和类
   3、只能创建匿名内部类的一个实例
   4、一个匿名内部类一定在new的后面
匿名内部类演示:
public class Test {

	public static void main(String[] args) {
		// 匿名内部类new Inner(){}是Inner的继承,并同时实例化
		//类体中可以声明大部分类的功能
		Inner inner = new Inner() {
			public String toString() {
               return "Hello World!";
			}
		};
		System.out.println(inner);
	}

}
class Inner {
}
匿名内部类可以继承(实现)抽象类、接口
public class Test {

	public static void main(String[] args) {

		final int a = 1212;
		// 匿名类可以从类继承匿名类
		// 还可以重抽象类,接口继承,实现匿名类
		Inner inner = new Inner() {
			@Override
			public int add() {
				// TODO Auto-generated method stub
				return a + 2013;
			}
		};
		System.out.println(inner.add());
	}
}
interface Inner {
	int add();
}
匿名内部类是一种特殊的局部内部类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值