Java中的内部类的概念以及使用方法

内部类的概念与分类

1、内部类的概念:如果一个类的内部包含另一个类,那么这就是一个类内部包含另一个类

2、内部类的分类
① 成员内部类
② 局部内部类 (包含匿名内部类)


成员内部类的定义格式及使用

1、格式如下:

	修饰符 class 外部类名称 {
		修饰符 class 内部类名称 {
			类体
		}
		类体
	}

注意事项:
内部类使用外部类的成员变量和成员时可以随意访问,但是外部类使用内部类的成员变量和成员方法时需要内部类对象

2、两种调用内部成员的方式
① 间接方式:
通过外部类的对象,调用外部类的方法,立面间接使用内部类
② 直接方式:

外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();

内部类的同名变量的访问

这里举例说明:

public class Outer {
	int num = 10;
	public class Inner {
	int num = 20;
	public void methodInner(){
		int num = 30;
		System.out.println(num);
		System.out.println(this.num);
		System.out.println(Outer.this.num);
	}
}

输出结果分别为30,20,10。

我们需要注意
内部类的方法中想访问外部类的成员变量时,我们需要用这样的格式:外部类名称.this.外部类的成员变量名称


局部内部类定义格式及使用

1、定义格式如下:

修饰符 class 外部类名称 {
	修饰符 返回值类型 外部类方法名称(参数列表) {
		class 局部内部类名称 {
			// ...
		}
	}
}

2、局部内部类的描述
如果一个类时定义在一个方法内部的,那么这就是一个局部内部类。
3、局部内部类的使用
“局部”,只有当前所属的方法才能使用它,出了这个方法外面就不能用了。不能通过别的方法进行调用。


内部类所能使用的权限修饰符小结

1、外部类能使用的权限修饰符:public/(default)
2、成员内部类能使用的权限修饰符:public/protected/(default)/private
3、局部内部类能使用的权限修饰符:什么都不写(default)


局部内部类的final问题

这里我们需要注意,内部局部类如果希望访问所在方法的局部变量,那么这个局部变量必须时有效final的

public class MyOuter {
	public void methdOuter() {
	// 在外部类的方法中定义了一个局部变量,
	// 虽然这个局部变量没有加上final但是他也是一个有效的final
		int num = 10;
	// final int num = 10;Java8以前必须这样写
	// 如果再写一行num = 20;,那么内部局部类的方法就无法访问这个变量
		class MyInner {
			public void methodInner () {
				System.out.println(num);
			}
		}
	}
}
	

局部内部类访问所在方法的局部变量为什么必须是常量?

1、内部局部类创建出来的对象再堆内存当中
2、局部变量再内存中跟着方法走,在栈内存当中
3、方法运行结束之后会立刻出栈,局部变量也会跟着消失
4、但是局部内部类中new出来的对象会在堆内存中持续存在,知道垃圾回收自动消失
5、所以我们可以理解,当方法运行完后,方法出栈带着变量一起消失,但是堆内存中的对象还存在,而这个对象想调用已经出栈了的变量显然是不可以的
6、我们要求必须是常量,是因为我们最终调用的是复制出来的常量,这样可以保证复制出来的和原先的局部变量保持一直

局部内部类中的匿名内部类

匿名内部类就是省略了接口单独创建一个实现类用来实例化的文件或者单独创建子类文件和实例化的这个过程
1、什么情况下使用匿名内部类
如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下我们可以省略掉该类的定义,使用匿名内部类

2、匿名内部类的定义格式

// ① 接口的实现类的匿名内部类定义格式
接口名称 对象名称 = new 接口名称(){
// 大括号中是类体,省略了创建一个实现类的过程
	覆盖重写所有的抽象方法
}
// ② 父类的子类的匿名内部类定义格式
父类名称 对象名 = new 父类名称(){
// 大括号中是类体,省略了创建一个子类的过程
	覆盖重写所有的抽象方法
}

大括号中才是匿名内部类

3、匿名内部类的注意事项
(1)对格式“new 接口名称() {…}”进行解析:
        ① new代表创建对象的动作
        ② 接口名称就是匿名内部类需要实现哪个接口
        ③ {…}这才是匿名内部类的内容
(2)匿名内部类在创建对象时只能使用唯一一次,如果想多次创建一样的内容,需要重复写。
(3)匿名内部类省略的是类名称,而不是对象名称,匿名内部类和匿名对象并不一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值