在类的内部定义的类称为内部类,根据内部类定义的位置可分为成员内部类和局部内部类。本课主要学习成员内部类。
创建一个类时,会定义类的成员变量和成员方法。成员变量的类型可以是基本数据类型,也可以是对象引用类型。对象引用类型一般指向同一包的类或从外部导入的类。
Java语言也允许在类的内部定义一个类,该类可以作为外部类(为了区分内部类和定义内部类的类,将定义内部类的类称为外部类)的成员变量。
定义内部类
定义内部类的语法如下:
public class 外部类名称 {
…………
public class 内部类名称 {
…………
}
…………
}在内部类可以随意访问外部类的成员变量和成员方法,访问权限不受限制。
案例1:建立Student类(学生类),在Student类内部定义Relation类(联系方式类)。
在PCoreUnit3项目新建student包,在student包下新建Student类。代码如下:
package student;
/**
* @ClassName: Student
* @Description: 包与类的高级特性(成员内部类)案例1
* @author 编程训练营
* @date
*
*/
public class Student {
// 定义成员变量name
String name;
// 定义内部类Relation
public class Relation {
// 定义成员变量phone
public String phone;
// 定义成员变量email
public String email;
// 定义构造方法
public Relation(String phone, String email)
{
this.phone = phone;
this.email = email;
}
}
}内部类的定义方式和外部类的定义方式完全相同,权限修饰符同样适用于内部类。在Student类内部定义了Relation类,Relation类定义了两个成员变量和一个构造方法,构造方法用于初始化成员变量。
内部类在外部类的使用
内部类可以作为外部类的成员变量使用,当外部类实例化对象时,内部类也要实例化,内部类实例化的对象会绑定在外部类对象上。内部类的实例化方式与其它类实例化方式相同,都是使用new运算符。
案例2:在Student类定义一个Relation类型的成员变量,并在Student类的构造方法中实例化该成员变量。
修改Student类的代码:
package student;
/**
* @ClassName: Student
* @Description: 包与类的高级特性(成员内部类)案例
* @author 编程训练营
* @date
*
*/
public class Student {
// 定义成员变量name
String name;
// 定义Relation类型的成员变量
Relation relation;
// 构造函数
public Student(String name,String phone,String email)
{
this.name = name;
relation = new Relation(phone,email);
}
// 定义内部类Relation
public class Relation {
// 定义成员变量phone
public String phone;
// 定义成员变量email
public String email;
// 定义构造方法
public Relation(String phone, String email)
{
this.phone = phone;
this.email = email;
}
}
}Student类在原来代码的基础上,添加了定义Relation类型成员变量的语句,并添加了构造方法,在构造方法内部实例化Relation对象,并将Relation对象引用赋值给变量relation。
外部类访问内部类
外部类不能直接访问内部类的成员变量和方法,这是因为内部类的成员变量和方法是在内部类定义的,使用范围也仅限于内部类。外部类可以通过在外部类定义的Relation对象引用来访问内部类的成员变量和方法。
案例3:在Student类定义一个show()方法,该方法输出学生姓名、联系电话和邮箱。
修改Student类的代码:
// 定义show()方法
public void show()
{
System.out.printf("姓名:%s\n",this.name);
System.out.printf("电话:%s\n",this.relation.phone);
System.out.printf("邮箱:%s\n",this.relation.email);
}Student类在原来代码的基础上,添加了show()方法,该方法输出学生姓名、联系电话和邮箱。Student类通过对象引用relation来访问内部类的成员变量和方法。
其它类访问内部类
内部类实例化的对象会绑定在外部类对象上,因此其它类在外部类对象作用范围内,也可以访问内部类的实例化对象。
案例4:在Student类添加成员变量relation的get()方法。建立StudentTest类,在StudentTest类中实例化Student对象,然后获取relation对象的引用,访问relation对象的成员变量。
Student类新添加的代码:
/**
* @return the relation
*/
public Relation getRelation() {
return relation;
}
StudentTest类的代码:
package student;
/**
* @ClassName: StudentTest
* @Description: 包与类的高级特性(成员内部类)案例
* @author 编程训练营
* @date
*
*/
public class StudentTest {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 实例化Student对象
Student student = new Student("张三","18678099089","zhangsan@163.com");
// 调用show()方法
student.show();
// 获取relation对象的引用
Student.Relation relation = student.getRelation();
System.out.println("访问relation对象的email成员变量:" + relation.email);
}
}Relation类是Student类的内部类,在其它类定义Relation类型的变量时,需要使用“外部类.内部类”的这种形式来定义,然后调用student对象的getRelation()方法获取relation对象的引用。
程序执行结果如下图所示:
