内部类

内部类

定义:所谓内部类,不是指在一个java源文件中编写两个平行的类,而是在一个类的内部再定义另外一个类。再外部的类称为外部类,其内部编写的类称为内部类
内部类分为四种
一、成员内部类(实例内部类,非静态内部类)
注:成员内部类中不能写静态属性和静态方法

public class Test {
	private String name;
	private static int age;
	public void say(){}
	public static void go(){}
	public class InstanceInner{
		public void run() {
			System.out.println(Test.age);
			System.out.println(new Test().name);
		}
	}
}

成员内部类访问外部类的成员变量:
静态变量:外部类名.属性名
非静态:外部类名.this.属性名(new 外部类().属性名)
生成成员内部类对象:
外部类名.内部类名 变量名= new 外部类().new 成员内部类()
二、静态内部类
注:静态内部类中可以写静态属性和静态方法

public class Test {
	public static class InstanceInner{
	
	}
}

静态内部类访问外部类的成员变量:
静态:外部类名.属性名
非静态:new 外部类().属性
生成静态内部类对象
在外部类中: new 内部类()
在其他类中: new 外部类.内部类()
三、局部内部类
局部内部类是在方法内部声明的一个类
局部内部类中可以访问外部类的成员变量及方法
局部内部类中如果要访问该内部类所在方法中的局部变量,那这个局部变量必须是final修饰的

public class LocalOutterClass{
	public static void main(String[] args) {
		new LocalOutterClass().test(10);
	}
	private String name="bob";
	private static int age=10;
	public void say(){}
	public static void go(){}

	public void test(final int j){
		final int i = 10;

		class LocalInnerClass{
			private String name="jack";
			private int age=20;
			
			public void say(){
				System.out.println(name);//jack
				System.out.println(this.name);//jack
				System.out.println(LocalInnerClass.this.name);//jack

				System.out.println(LocalOutterClass.this.name);//bob
				System.out.println(LocalOutterClass.age);//10
				System.out.println(LocalInnerClass.this.age);//20
				LocalOutterClass.this.say();
				LocalOutterClass.go();

				System.out.println(i);//10
				System.out.println(j);//10
			}

		}

		LocalInnerClass lic = new LocalInnerClass();
		lic.say();
	}
}

局部内部类访问外部类的成员变量
静态:类名.属性
非静态:类名.this.属性
无法在外部类和其他类中生成内部类对象。

四、匿名内部类
匿名内部类是最常用的一个内部类
1.匿名内部类需要依托于其他类或者接口来创建,如果依托于类那么默认创建的匿名内部类就是这个类的子类,如果依托于接口那么创建的这个匿名内部类就是折光接口的实现类。
2.匿名内部类的声明必须是在使用new关键字的时候。匿名内部类声明及创建对象的时候必须一气呵成,并且之后不能反复使用,因为他没有名字。

A a = new A(){
						//实现A中的抽象方法
						//或者重写A中的普通方法
};
//B是一个接口
//依托于B接口创建一个匿名内部类对象
B b = new B(){
	//实现B中的抽象方法
};

3.匿名内部类除了依托的类或者接口之外,不能指定继承或者实现其他类或者接口,同时也不能被其他类所继承,因为没有名字。
4.匿名内部类中,我们无法写构造器,因为没有名字。
5.匿名内部类中我们一般除了重写上面的方法不会写其他的方法,因为外部不能直接调用。

public interface Test{
			void run();
		}
		public class OutterClass{
			private String name;
			private static int age;
			public void say(){}
			public static void go(){}
			
			public void test(){
				final int i = 90;

				Test t = new Test(){
					public void run(){
						System.out.println(OutterClass.this.name);
						System.out.println(OutterClass.age);
						OutterClass.this.say();
						OutterClass.go();

						System.out.println(i);
					}
				};
				t.run();
			}
		}
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值