标题: 关于接口的问题!为什么我的打印的是对象地址值呢? [打印本页] 作者: 7℃洋 时间: 2012-11-12 21:33 标题: 关于接口的问题!为什么我的打印的是对象地址值呢? class People {
private String name ;
private int age ;
private String sex ;
public People(){}
public People(String name , int age , String sex){
this.name = name ;
this.age = age;
this.sex= sex ;
}
public void setName (String name ){
this.name = name ;
}
public void setAge (int age){
this.age = age ;
}
public void setSex(String sex){
this.age = age ;
}
public String getName(){
return this.name;
}
public int getAge()
{
return this.age;
}
public String getSex() {
return this.sex ;
}
}
interface Filter {
public boolean filter(People people);
}
class MyFilter implements Filter {
public boolean filter(People people){
return people.getSex().equals("female") && people.getAge() > 20;
}
}
class HongNiang {
private People[] p ;
public HongNiang(){
p = new People[]{
new People("zhangSan", 23, "male"),
new People("liSi", 21, "female"),
new People("wangWu", 9, "male"),
new People("zhaoLiu", 26, "female"),
new People("tianQi", 84, "male"),
new People("jianBa", 23, "female"),
new People("heJiu", 59, "male"),
new People("biShi", 27, "female"),
new People("xiaoQiang", 12, "male"),
new People("wangCai", 25, "female")
};
}
public People[] getPeople(Filter filter){
People[] xiHuan = new People[5];
int cnt = 0 ;
for (int i = 0; i < p.length ; i++) {
if(filter.filter(p[i])){
xiHuan[cnt] = p[i];
cnt++ ;
}
if (cnt == 5) {
break ;
}
}
return xiHuan ;
}
}
class MainApp {
public static void main(String[] args){
HongNiang hn = new HongNiang();
People[] p = hn.getPeople(new MyFilter());
for (int i = 0; i < p.length; i++) {
if (p[i] != null) {
System.out.println(p[i]);
}
}
}
} 作者: 程宏志 时间: 2012-11-12 22:08
System.out.println(p[i]);
p = new People[]{
new People("zhangSan", 23, "male"),
new People("liSi", 21, "female"),
new People("wangWu", 9, "male"),
new People("zhaoLiu", 26, "female"),
new People("tianQi", 84, "male"),
new People("jianBa", 23, "female"),
new People("heJiu", 59, "male"),
new People("biShi", 27, "female"),
new People("xiaoQiang", 12, "male"),
new People("wangCai", 25, "female")
};
你打印的是平而在上面给数组p的元素p[i]进行赋值的是实例化对象,这时,你就应该考虑在引用型数据在内存中的运算原理。
p[i]是在栈内存中的,而你赋值的实例化对象是存储在堆内存中,它们之间是靠地址值来联系的,对内存中的地址传给栈中的引用对象,然后栈里的引用对象才指向堆中对应的实例而对象!简单的说,在栈内存中的引用对象的值实际上就是地址值,而你打印的却是类在栈内存中的引用对象,所以你打印的只能是地址值了!要是你要打印实例结果,你应该把数组遍历输出,那就没问题了!作者: 王阳 时间: 2012-11-13 21:04
@Override
public String toString(){
return "姓名 : "+this.name+" 性别 : "+this.sex+" 年龄 : "+this.age;
}
你那样输出肯定会输出内存地址的值的,你是想要输出成名字+性别+年龄的吧? 只要在Person类里复写这个方法就可以了。作者: 王阳 时间: 2012-11-13 21:18
补充一下,之所以会打印出地址值,也就是类名+@+hashcode 是以为所有对象的最高及父类为Object,因为你这个Person没有显示父类,所以默认的父类就为Object
查阅下API1.6文档就可以看到里面toString方法,因为你输出的是对象,但是在输出时候会默认调用那个父类的toString方法。作者: 黑马吕世成 时间: 2012-11-13 21:37
楼上正解,顶一个!作者: 张综 时间: 2012-11-13 22:14
其实这个写成getString或者toString 都行。都能解决你的问题。作者: 一身顺利 时间: 2012-11-14 03:22
需要覆盖Person类的toString()方法。作者: 陈军 时间: 2012-11-14 13:37 本帖最后由 陈军 于 2012-11-14 13:40 编辑