Logo

郎哥编程

成员内部类

2019-12-24 230

在类的内部定义的类称为内部类,根据内部类定义的位置可分为成员内部类和局部内部类。本课主要学习成员内部类。

创建一个类时,会定义类的成员变量和成员方法。成员变量的类型可以是基本数据类型,也可以是对象引用类型。对象引用类型一般指向同一包的类或从外部导入的类。

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对象的引用。

程序执行结果如下图所示:

image.png

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论