java学习笔记(五)内部类

一、内部类概述

(1)内部类定义

将一个类的定义放在另一个类的定义里面,这就是内部类。
创建内部类代码演示如下:

public class Outer{
	private int time;
	class Inner{
		public void timeIn() {
			time ++;
		}
	}
	public int getTime() {
		return time;
	}
	public void setTime(int time) {
		this.time = time;
	}
}
内部类对象的创建

创建内部类对象需要先创建外围类对象(除了静态内部类即嵌套类,其他内部类对象的创建都需要先创建外部类对象)。借助.new创建内部类对象,借助.this创建对外部类对象的引用

public class Demo01 {
	public static void main(String[] args) {
		//创建内部类对象
		Outer outer = new Outer();
		Outer.Inner inner = outer.new Inner();
		inner.timeIn();
		System.out.println(outer.getTime());
	}
}
class Outer{
	private int time;
	class Inner{
	//返回Outer.this,是对外部类对象的引用
		public Outer outer(){
		return Outer.this;
		}
		public void timeIn() {
			time ++;
		}
	}
	public int getTime() {
		return time;
	}
	public void setTime(int time) {
		this.time = time;
	}
}
内部类特点
  • 1、内部类看起来像是一种代码隐藏机制,但它不仅仅是这样的,它了解外围类,并可以与之通信;
  • 2、内部类可以访问外围类的所有成员变量和成员方法,即使是私有的;
  • 3、普通的内部类对象隐式地保存了一个对象指向创建它的外部类对象。

二、局部内部类

局部内部类是定义在方法体里面的内部类。创建局部内部类的理由有如下:

  • 1、我们实现了某类型的接口,于是可以创建并返回对其的引用;
  • 2、我们需要解决一个复杂的问题,想创建一个类来辅助解决方案,但不希望这个类公共可用
    对局部内部类需要注意的地方:
  • 方法中定义的内部类,局部内部类不能修改局部变量的值
  • 局部内部类中访问局部变量,该变量必须是final的(jdk更新后即使方法体内的变量没有final修饰,局部内部类中依然可以访问)
class Outer2{
	private int time;
	public void f(final int innerTime2) {
		final int innerTime = 10;
		class Inner2{
			public void fun() {
				System.out.println(innerTime);
				System.out.println(innerTime2);
				time++;
			}
		}
		Inner2 inner = new Inner2();
		inner.fun();
	}
	public int getTime() {
		return time;
	}
	public void setTime(int time) {
		this.time = time;
	}
}

三、匿名内部类

public class Demo02{
	public static void main(String[] args) {
	//匿名内部类
		new MyRunnable(){
			@Override
			public void run() {
				System.out.println("匿名内部类:Run...");
			}
		}.run();
	}
}
interface MyRunnable{
	public void run();
}
class MyRunnableImpl implements MyRunnable{
	@Override
	public void run() {
		System.out.println("Run...");
	}
}

new MyRunnable(){
public void run() {
System.out.println(“匿名内部类:Run…”);
}
}.run();
这个代码看起来有点奇怪,我们想创建一个新的对象,又在此处写了类的定义,这就是匿名内部类。
它没有名字,也没有构造器(毕竟它没有名字,又怎么会有构造器),匿名内部类我们只能使用一次,而且它只能继承一个类或实现一个接口,不能既继承类又实现接口。匿名内部类在工厂方法如果只需要单一的工厂对象,那么匿名内部类是不错的选择。

四、嵌套类

如果不需要内部类对象与外部类对象之间有联系,我们可以在内部类定义前加“static”,使之成为静态内部类,即嵌套类。

public class Outer{
	private int time;
	//嵌套类
	static class Inner{
		static int date;
		public void timeIn() {
			time ++;
		}
	}
	public int getTime() {
		return time;
	}
	public void setTime(int time) {
		this.time = time;
	}
}

加了static后的内部类与普通内部类的区别如下:

  • 1、要创建嵌套类对象不需要外部类对象;
  • 2、不能从嵌套类的对象中访问非静态的外部类对象;
  • 3、普通内部类的字段和方法只能放在类的外部层次上,也就是说普通内部类不能有static数据和static字段,也不能包含嵌套类,但嵌套类可以.
  • 4、前面我们说到有一个.this引用可以链接到外部类,那是普通内部类有的,嵌套类并没有,这使它看起来像一个静态方法。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值