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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我为你着迷 金牌黑马   /  2014-12-28 14:27  /  1049 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 我为你着迷 于 2014-12-28 14:41 编辑

import java.util.*;
class GenericDemo7
{
        public static void main(String[] args)
        {
                TreeSet<Student> ts=new TreeSet<Student>(new Comp());
               
                ts.add(new Student("abc03"));
                ts.add(new Student("abc02"));
                ts.add(new Student("abc06"));
                ts.add(new Student("abc01"));
               
                Iterator<Student> it=ts.iterator();
                while(it.hasNext())
                {
                        System.out.println(it.next().getName());
                }
               
               
                TreeSet<Worker> ts1=new TreeSet<Worker>(new Comp());
                 
                ts1.add(new Worker("abc--03"));
                ts1.add(new Worker("abc--02"));
                ts1.add(new Worker("abc--06"));
                ts1.add(new Worker("abc--01"));
               
                Iterator<Worker> it1=ts1.iterator();
                while(it1.hasNext())
                {
                        System.out.println(it1.next().getName());
                }
        }
}

class Comp implements Comparator<Person>
{
        public int compare(Person p1,Person p2)
        {
                return p2.getName().compareTo(p1.getName());
        }
}

class Person
{
        private String name;
        Person(String name)
        {
                this.name=name;        
        }        
        
        public String getName()
        {
                return name;
        }
        
        public String toString()
        {
                return "person:"+name;        
        }
}

class Student extends Person
{
        Student(String name)
        {
                super(name);
        }
}

class Worker extends Person
{
        Worker(String name)
        {
                super(name);        
        }
}

大家好,这句话里边的getName()不太懂 System.out.println(it.next().getName()); 为什么it.next()可以调用getName()方法呢?他们之间存在着调用关系吗?
还有我想问下是不是父类定义好了功能子类可以直接拿过来用,所以你在new Student("abc03")
的时候可以直接用父类的功能而不需要覆盖呢?
如果不加getName()方法的话。
打印结果是
Person:afw01
Person:afw03
Person:afw05
Person:afw06
前边为啥带个Person:呢。
如果加上了就没有了,这是为啥呀 ,想不明白。有很多疑问
哪位大神或者版主能帮我解答一下啊  谢谢了 黑马币尽情奉上啊。


11 个回复

倒序浏览
it.naxt().getName();  是因为it.next() 代表的是一个对象在调用getName()方法
子类可以直接调用父类中非私有的方法,
不加getName(),输出挂着Person:   是因为it.next()调用了默认的方法toString()
加上后直接调用getName()获取name

评分

参与人数 1黑马币 +20 收起 理由
我为你着迷 + 20 谢谢你

查看全部评分

回复 使用道具 举报
找寻小龙猫 发表于 2014-12-28 15:11
it.naxt().getName();  是因为it.next() 代表的是一个对象在调用getName()方法
子类可以直接调用父类中 ...

嗯   内个就是  哥们我想问下你是怎么看出来it.next() 代表的是一个对象呢   还有it.next()到底是怎么调用了默认的方法toString呢   他们是怎么执行的呢   
回复 使用道具 举报
我看了一下你的代码,我来给你解释一下为什么可以调用getName,首先我们看你的集合里面装的是对象,通过迭代器,也即是it.next()我们得到了里面的对像,通过对象我们当然可以调用对象对应的方法了,如果里面装的是 Student这个类的对象,我们就可以通过对象调用getName()这个方法了。

评分

参与人数 1黑马币 +20 收起 理由
我为你着迷 + 20 赞一个!

查看全部评分

回复 使用道具 举报
没加泛型前,集合里存的类型都是Object类型的,当你加了泛型后,集合里存的都是泛型的那个类型的。
而迭代器是一个个取出集合里的东西,it.next()返回的是一个对象,所以它可以直接调用.getName()方法。

评分

参与人数 1黑马币 +20 收起 理由
我为你着迷 + 20 很给力!

查看全部评分

回复 使用道具 举报
帮你通俗的解释一下,没有加泛型以前,从集合里取出来的所有元素都是object类型,所以你要显示强转。
但是加泛型以后,从集合取出元素时,编译器会自动帮你加上强制转换。
你为啥那么多分???

评分

参与人数 1黑马币 +20 收起 理由
我为你着迷 + 20

查看全部评分

回复 使用道具 举报
dede风 中级黑马 2014-12-28 18:40:44
7#
呵呵,太厉害了

评分

参与人数 1黑马币 +10 收起 理由
我为你着迷 + 10

查看全部评分

回复 使用道具 举报
kerner 发表于 2014-12-28 18:30
帮你通俗的解释一下,没有加泛型以前,从集合里取出来的所有元素都是object类型,所以你要显示强转。
但是 ...

因为在论坛里泡的时间久了 所以就这么多分了
回复 使用道具 举报
先混一个经验
回复 使用道具 举报
蛋卷 中级黑马 2014-12-28 23:48:42
10#
厉害   。。。。
回复 使用道具 举报
:(学到泛型看了两遍还是晕晕的
回复 使用道具 举报
我为你着迷 发表于 2014-12-28 17:21
嗯   内个就是  哥们我想问下你是怎么看出来it.next() 代表的是一个对象呢   还有it.next()到底是怎么调 ...

it.next()是通过迭代器来获取集合中的元素,也就是得到集合中的对象
在打印it.next()时,因为你已经定义了对象的输出方法toStirng(),所以it.next()会去调用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马