Java内部类的小结

内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹相同。
*内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default)。
 
注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。)

一般来说,有4中内部类:成员内部、静态内部类、局部内部类、匿名内部类。

一、成员内部类:

 1.成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。创建内部类对象,可以使用Outer.Inner inner = outer.new Inner()。
 2.要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的,了解这一点,就可以明白更多事情,在此省略更多的细节了。
 3.在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象。

public class Outer {

	private int id;
	private String name;

	private void show() {
		System.out.println("This is outer class");
	}

	class Inner1 {
		
		public Inner1(int id, String name){
			Outer.this.id = id;
			Outer.this.name = name;
		}
		
		public void show() {
			System.out.println("id:" + id + ";name:" + name);
			System.out.println("This is inner1 class");
			Outer outer = new Outer();
			outer.show();
		}
	}
}
public class Test {

	public static void main(String[] args) {
		Outer outer = new Outer();
		Outer.Inner1 inner = outer.new Inner1(1,"wwy");
		System.out.println("-----------成员内部类-----------");
		inner.show();
	}
}

二、局部内部类
 1.局部内部类只在方法体中有效,就像定义的局部变量一样,在定义的方法体外不能创建局部内部类的对象。
 2.方法定义局部内部类同方法定义局部变量一样,不能使用private、protected、public等访问修饰说明符修饰,也不能使用static修饰,但可以使用final和   abstract修饰。
 3.方法中的内部类可以访问外部类成员,static方法中定义的内部类可以访问外部类定义的static成员。
public class Outer {

	public void showInner() {
		
		class Inner2 {
			
			private int id;
			private String name;
			
			private Inner2(int id, String name){
				this.id = id;
				this.name = name;
			}
			
			public void show() {
				System.out.println("id:" + id + ";name:" + name);
				System.out.println("This is inner2 class");
			}
		}
		Inner2 inner2 = new Inner2(1, "wwy");
		inner2.show();
	}
}
public class Test {

	public static void main(String[] args) {
		Outer outer = new Outer();		
		System.out.println("-----------局部内部类-----------");
		outer.showInner();
	}
}

三、静态内部类
 1.与类的其他成员相似,可以用static修饰内部类,这样的类称为静态内部类。
 2.静态内部类与静态方法相似,只能访问外部类的static成员,不能直接访问外部类的实例变量与方法,只有通过对象引用才能访问。由于static内部类不具有任何对外部类实例的引用,因此static内部类中不能使用this关键字来访问外部类中的实例成员,这与一般类的static方法相通。
public class Outer {

	private static String birthday;
	
	public static class Inner3{
		
		public Inner3(String birthday){
			Outer.birthday= birthday;
		}
		
		public void show() {
			System.out.println("birthday:" + birthday);
			System.out.println("This is inner3 class");
		}
	}
}

public class Test {

	public static void main(String[] args) {
		System.out.println("-----------静态内部类-----------");
		Inner3 inner3 = new Inner3("1999-01-01");
		inner3.show();
	}
}

四、匿名内部类

 定义类的最终目的是创建一个类的实例,但是如果某个类的实例只是用一次,则可以将类的定义与类的创建,放到与一起完成,或者说在定义类的同时就创建一个类,以这种方法定义的没有名字的类成为匿名内部类。

 声明和构造匿名内部类的一般格式如下:

new ClassOrInterfaceName(){
    /*类体*/
}

    1.匿名内部类可以继承一个类或实现一个接口,这里的ClassOrInterfaceName是匿名内部类所继承的类名或实现的接口名。但匿名内部类不能同时实现一个接口和继承一个类,也不能实现多个接口。如果实现了一个接口,该类是Object类的直接子类,匿名类继承一个类或实现一个接口,不需要extends和implements关键字。
 2.由于匿名内部类没有名称,所以类体中不能定义构造方法,由于不知道类名也不能使用关键字来创建该类的实例。实际上匿名内部类的定义、构造、和第一次使用都发生在同样一个地方。此外,上式是一个表达式,返回的是一个对象的引用,所以可以直接使用或将其复制给一个对象变量。

public class Outer {

	public Object inner4(String address) {
		final String finalAddress = address;
		return new Object() {
			public String toString() {
				return "address:" + finalAddress;
			}
		};
	}
}
public class Test {

	public static void main(String[] args) {
		Outer outer = new Outer();
		System.out.println("-----------匿名内部类-----------");
		System.out.println(outer.inner4("China"));
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值