A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 飘落 中级黑马   /  2013-9-25 21:53  /  1591 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 飘落 于 2013-9-26 23:09 编辑
  1. import java.util.*;

  2. class TreeMapDemo {

  3.         public static void main(String[] args) {
  4.                
  5.                 TreeMap<Student,String> tm=new TreeMap<Student,String>();

  6.                 tm.put(new Student("S1",31),"sn001");
  7.                 tm.put(new Student("S2",11),"sn002");
  8.                 tm.put(new Student("S3",41),"sn003");
  9.                 tm.put(new Student("S4",11),"sn004");
  10.                 tm.put(new Student("S5",51),"sn005");
  11.                 tm.put(new Student("S6",91),"sn006");

  12.                 System.out.println(tm);
  13.         }

  14. }

  15. class Student implements Comparable<Student>
  16. {
  17.         private String name;
  18.         private int age;
  19.         
  20.         Student(String name,int age)
  21.         {
  22.                 this.name=name;
  23.                 this.age=age;
  24.         }
  25.         public void setName(String name)
  26.         {
  27.                 this.name=name;
  28.         }
  29.         public void setAge(int age)
  30.         {
  31.                 this.age=age;
  32.         }
  33.         public String getName()
  34.         {
  35.                 return name;
  36.         }
  37.         public int getAge()
  38.         {
  39.                 return age;
  40.         }
  41.         public String toString()
  42.         {
  43.                 return name+":"+age;
  44.         }
  45.         public int compareTo(Student s)
  46.         {
  47.                 int num=age-s.age;
  48.                 return num!=0?num:name.compareTo(s.name);
  49.         }
  50. }
复制代码
重写compareTo()时,代码里面写成s.age、s.name,为什么能正常运行?
因为变量age和name前面有private修饰,所以个人觉得写成s.getAge()、s.getName()才对。
然而,运行结果出乎我的预料。
求解释。

2 个回复

倒序浏览
用TreeMap建立集合对象来存储元素Student对象,你是说在Student类中实现了Comparable接口,而在Student类中,姓名name和年龄age的控制访问权限是private,而在类中下面实现Comparable接口的compareTo()方法时用的是s.name和s.age吧,这是因为访问权限修饰符private在本类中有效,可以使用本类中的成员的。下面是关于java中的四种访问权限修饰符的作用范围:

360软件小助手截图20130925224613.jpg (47.21 KB, 下载次数: 92)

访问权限修饰符

访问权限修饰符
回复 使用道具 举报
因为compareTo是student的成员函数,当然可以访问成员变量了啊,但是在外部函数中就无法使用s.age,和s.name了。你的思路是对的,也可以用s.getAge()和s.getName(),这个是在外部函数获取对象的成员变量对应的取值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马