黑马程序员技术交流社区

标题: 关于arraylist的一点疑问 [打印本页]

作者: tangxiaobo1991    时间: 2014-3-19 11:52
标题: 关于arraylist的一点疑问
在看老毕的视频,看到arraylist的练习的时候,有一个例子是将人的对象装进容器中,然后去除姓名和年龄相同的对象。视频中讲contains底层默认调用equals方法(下面代码的红色部分),可是equals是非静态的,而 singleElenment()是静态的方法,所以就相当与在静态中调用了非静态的方法equals(),其源代码如下:

import java.util.*;
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Person))
                        return false;
                        Person p=(Person)obj;
                        return this.name.equals(p.name)&&this.age==p.age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}

class ArrayListDemo2
{
        public static void main(String[] args)
        {
                ArrayList al=new ArrayList();
                al.add(new Person("lisi01",31));
                al.add(new Person("lisi02",32));
                al.add(new Person("lisi03",33));
                al.add(new Person("lisi04",34));
                al.add(new Person("lisi04",34));
                al=singleElement(al);
               
                Iterator it=al.iterator();
                while(it.hasNext())
                {
                        Person p=(Person)it.next();
                        sop(p.getName()+"..."+p.getAge());
                }
        }
       
        public static ArrayList singleElement(ArrayList al)
        {
                ArrayList newAl=new ArrayList();
                Iterator it=al.iterator();
                while(it.hasNext())
                {
                        Object obj=it.next();
                        if(!(newAl.contains(obj)))//默认调用equals,而equals是非静态,怎么能在静态函数中调用呢??
                        newAl.add(obj);
                }
                return newAl;
        }
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}


作者: 方青木    时间: 2014-3-19 12:00
contains底层默认调用的确是equals方法
是通过对象调用的
newAl.contains(obj)
此处传进去一个对象,就是通过这个对象来调用equals方法来和集合中的元素进行比较
作者: tangxiaobo1991    时间: 2014-3-19 12:13
方青木 发表于 2014-3-19 12:00
contains底层默认调用的确是equals方法
是通过对象调用的
newAl.contains(obj)

对啊,可是问题是现在这个对象就在静态方法中阿!!
作者: 方青木    时间: 2014-3-19 12:44
public static ArrayList singleElement(ArrayList al)
我们是把主函数中的al传递给上面的函数。

作者: tangxiaobo1991    时间: 2014-3-19 13:02
方青木 发表于 2014-3-19 12:44
public static ArrayList singleElement(ArrayList al)
我们是把主函数中的al传递给上面的函数。
...

对阿,主函数也是静态的阿!!所以呢???
作者: 青木郎    时间: 2014-3-19 16:29
就是方法是静态的, ArrayList newAl=new ArrayList();,在方法中你调用了ArrayList对吧 ,这个类以及他的方法都在java包中封装好的,是能用jvm中内部的东西的,如果按你的思想static方法中是不能写东西的

作者: jkenny    时间: 2014-3-19 17:18
逻辑错了,如果你怎么想那么(contains)也不是静态的啊,你怎么能调用(contains)。
newAl 是你new出来的对象啊,它不是静态的,所以当然能调用非静态方法啊。

看上面怎么都解释的。。。

简单一句话:newAl不是静态的(静态方法不能调用非静态方法)
作者: syusikoku    时间: 2014-3-19 17:29
Object中的equals默认是使用==进行比较的。我们在比较字节码是同一份的时候使用到了这个。而且我刚看了Contains的源码,它也是使用==做为判断两个对象是否是同一个的依据。
作者: leon_hm    时间: 2014-3-19 17:37

  1. public class TestMain {

  2.         public static void main(String[] args) {
  3.                
  4.                 String str=" main";
  5.                 str = str.substring(1); //通过对象调用
  6.                 //str = substring(1);  这样直接调用是不行的
  7.                 System.out.println(str);
  8.         }

  9. }
复制代码

楼主的问题是,静态方法中不能调用非静态方法吧。
我上面这段代码,main函数也是静态的。但是可以调用substring这样的非静态方法。
其实准确的说应该不能直接调用。
比如str = substring(1); 这种写法是不行的,除非定义一个静态的substring方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2