前言
之前我们都只知道,类中有方法,并且类与类之间是独立分开定义的,所以初接触内部类,感觉好新奇,所以就总结了这篇博客。
内容
定义
将一个类定义在另一个类里面,里面的类称为内部类,外面的类称为外部类。
使用位置
一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用,比如:人身体里面有一颗心脏,离开心脏人无法独立存活,心脏离开人体也不能继续活力运动,又比如汽车内部有一个发动机,汽车离开发动机就跑步起来,发动机离开汽车就没有动力移动。
内部类种类
按照定义划分:
1. 成员内部类:定义在了成员为止(类中方法外称为成员位置)
定义格式:
class 外部类 {
// 成员变量
// 成员方法
class 内部类 {
// 成员变量
// 成员方法
}
}
在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构,比如汽车类Car中包含发动机Engine,这时,Engine就可以使用内部类来描述,定义在成员位置。
举例:
class Car { //外部类
class Engine { //内部类
}
}
访问特点:
内部类可以直接访问外部类的成员,包括私有成员。
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
举例:
//定义类:
public class Body {
public boolean live = true;
public void walk() {
System.out.println("散步");
}
class Heart {
public void jump() {
// 直接访问外部类成员
if (live) {
System.out.println("心脏在跳动");
} else {
System.out.println("心脏不跳了");
}
}
}
}
//定义测试类:
public class Demo04 {
public static void main(String[] args) {
// 外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
// 创建的是内部类对象
// Body.Heart heart = new Body().new Heart();
// heart.jump();
// 创建方式2:先创建外部类,再创建内部类
// 创建外部类对象
Body b = new Body();
// 创建内部类对象
Body.Heart heart = b.new Heart();
// 调用内部类方法
heart.jump();
// 调用外部类方法
b.live = false;
// 调用内部类方法
heart.jump();
}
}
//输出结果:
//心脏在跳动
//散步
//心脏不跳了
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类名
和$符号 。
比如:
Body$Heart.class
2. 局部内部类:定义在方法类
定义格式:
class 外部类名 {
数据类型 变量名;
修饰符 返回值类型 方法名(参数列表) {
// …
class 内部类 {
// 成员变量
// 成员方法
}
}
}
在定义好局部内部类后,直接就创建对象
访问特点:
内部类可以直接访问外部类的成员,包括私有成员。
/*
局部内部类格式
class 外部类名 {
数据类型 变量名;
修饰符 返回值类型 方法名(参数列表) {
// …
class 内部类 {
// 成员变量
// 成员方法
}
}
}
*/
class Chinese {
String name = "凤姐";
public void walk() {
System.out.println(name + "散步");
}
public void eat() {
// 筷子
class Chopsticks {
int length = 30;
public void use() {
System.out.println("使用筷子" + length);
// 局部内部类可以直接访问外部类的成员
walk();
System.out.println(name);
}
}
// 在定义好局部内部类后,直接就创建对象
Chopsticks c = new Chopsticks();
c.use();
}
}
// 测试类
public class Demo06 {
public static void test() {
// 放法中的变量,其他方法不能直接调用
// public static int b = 10;
int a = 10;
System.out.println(a);
}
public static void main(String[] args) {
// System.out.println(a);
Chinese c = new Chinese();
c.eat();
}
}
局部内部类编译后仍然是一个独立的类,编译后有 还 有 一 个 数字。
Chinese1Chopsticks.class
总结
内部类面向对象程序设计中,可以在一个类的内部定义另一个类。嵌套类分为两种,即静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。
end
谢谢您的阅读!
下一篇博客将为您介绍匿名内部类