内部类概述

关键字:内部类

内部类:

1、内部类是指在一个外部类的内部再定义一个类。
2、内部类作为外部类的一个成员,并且依附于外部类而存在的。
3、内部类可为static,可用public、protected、private修饰。(外部类只能使用publi和default)。

分类

  在一个类(外部类)中直接定义的内部类(成员内部类)、
  局部内部类、
  静态内部类、
  匿名内部类。

 使用方法

在一个类中直接定义的内部类 (成员内部类)

  1、外部类不能直接访问内部类的的成员,必须通过创建内部类的实例对象访问。

  2、内部类作为外部类的成员,可以访问外部类的所有成员。

注:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两个类。例:对一个Outer的外部类和其内部定义Inner内部类。编译完成后出现Outer.class和Outer$Inner.class两类。

3成员内部类与普通的成员没什么区别,可以与普通成员一样进行修饰和限制。

4、内部类中不允许定义static变量。

5、内部类类似外部类的属性,因此访问内部类对象时总是需要一个创建好的外部类对象

public class OuterAndInnerTest {

	/**
	 * @param args
	 */
	private int out_x = 1;
	public int out_y =2;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		OuterAndInnerTest outer = new OuterAndInnerTest();
		
		Inner inner = outer.new Inner();   //此方法适用于外部类的static方法访问内部类
		inner.display();
		System.out.println("inner_x  : " + inner.inner_x);
		System.out.println("inner_y  : " + inner.inner_y);
		
		/*outer.test();*/
	}
	/*public void test()
	{
		Inner inner = new Inner();   //此方法适用于外部类的非static方法访问内部类
		System.out.println("inner_x  : " + inner.inner_x);
		System.out.println("inner_y  : " + inner.inner_y);
		inner.display();
	}*/
	class Inner
	{
		private int inner_x = 3;
		public	int inner_y =4;
//		public static inner_z = 5;   内部类中不能定义静态变量
		
		public void display()
		{
System.out.println("out_x   : " + OuterAndInnerTest.this.out_x); 
 //内部类对象通过外部类名.this.xxx’的形式访问外部类的属性与方法
			System.out.println("out_x  : " + out_x);
			System.out.println("out_y  : " + out_y);
		}
	}
}

在一个方法中定义的内部类 (局部内部类)

1、在方法中定义的内部类称为局部内部类。与局部变量类似,在局部内部类前不加修饰符public和private,其范围为定义它的代码块。其他用法和成员内部类相同。

2、内部类需要访问包含它的外部类方法或语句块的局部变量或参数,则该局部变量或参数必须是final

3、外部类的其他方法、其他类无法访问声明在方法内部或块内部的局部内部类

静态内部类

1、不能访问外部类的非静态成员,这是由Java语法中"静态方法不能直接访问非静态成员"所限定。

   2、在创建静态内部类对象时不需要外部类对象的存在。其实质是一个放置在别的类内部的普通类。关键字static只是说明其在创建对象时不依赖于外部类对象的存在,并不是说这个类本身是静态的。

3、静态内部类内部类的声明前面要加上static关键字,也不可以用private进行定义。

4、静态内部类与非静态内部类的区别是本质上的。非静态内部类是外部类对象组成的一部分,主要是辅助外部类对象工作的,与外部类对象存在对成员变量的共享关系。

匿名内部类

1、匿名内部类是一种特殊的局部内部类,这种内部类没有类名。该类适用于只使用一次并且不需要多次创建对象的类。

2、匿名内部类是唯一一种没有构造方法的类。因为其没有构造方法,使用范围非常有限。

  • 大部分匿名内部类用于接口回调。
  • 匿名内部类在编译的时候由系统自动起名为Out$1.class
  • 匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

3、语法规则:new <类或接口> <类的主体>

interface Print
{
	void print();
}
public class AnonymTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		AnonymTest anony = new AnonymTest();
		Print pr = anony.display();
		pr.print();
	}
	public Print display()
	{
		//匿名内部类的用法:创建一个实例对象,并且override它的一个函数
		return new Print() {
			public void print()
			{
				System.out.print("Hello World");
			}
		};
	}
}

继承:

如果一个类继承内部类,则创建该类的对象时需提供一个外部类的对象作为构造方法的参数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值