如何给一个类,使用equals方法

caddor2011 2014-06-06 03:58:28
1.问题

class A
{
private int x=3;
public static void main(String [] args)
{
new A().func(new A());
}
public void func(A a)
{
System.out.println(a.x);
}
}


编译运行上面程序,没有任何问题,在
new A().func(new A());
语句中,一共用new A()产生了两个对象,在第一个对象的func方法中成功地访问了第二
个对象的private 成员变量x。


这个例子怎么理解,尽管是2个匿名对象, 第1个对象访问了第2个对象的私有成员。

public void func(A a)
{
System.out.println(a.x);
}

this对象和对象a的关系是否可以理解为friend ? 所以,可以访问a的成员? 仅限于访问,

而非修改数据。

这是第1个问题。



第2个问题:

如何给一个类,使用equals方法? 比如:


class Person{
Person(int id, String nam)
{
}
void test()
{

}
};

在第2个问题中插入一个小问题,是否所有的对象 都可以使用==这个运算符进行比较?

3.
java有没有一种类似explict的用法?



比如void testfun(String str);

调用者这样使用testfun("nihao"); //ok ,

这里是否产生了一个匿名对象, 然后拷贝给了参数str ?

如果产生了了,那么如何防止,传入的String对象被修改,即c++中有const来修饰,

java中有什么?




...全文
266 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
caddor2011 2014-06-09
  • 打赏
  • 举报
回复
引用 4 楼 caddor2011 的回复:
[quote=引用 2 楼 soul_code 的回复:] 先回答第一个问题 在A类中声明了一个方法func 打印输出X的值 这就相当于get方法 对外提供了一个外部可以访问私有变量的方法,只要知道声明是get 和set方法,理解这个应该不难 第二个问题 可以直接重写equals()方法,修改成你需要的方法就OK了 至于你的小问题,所有的对象是可以用==比较的,但是比较的是对象的地址,如果要比较对象的值 还是先覆盖equals方法,在进行比较 第三个问题 给你举个例子 String s1 = "abc";//新创建, 字符串常量池中没有该串,则会这池中创建一个字符串“abc” String s2 = “abc”; 字符创常量池中已经存在“abc“。则s2会去指向常量池中的”adc'' 而不是去创建一个新的 String s3 = new String(”abc“);直接去堆中开辟一个新的空间,而不是去池中查找
对你的答案做了一个引申: class Test { public String str = "Hello"; public: Test() { } }; 现在有2个兑现,由于它们的str的值,都为"Hello"; 也就说,第一个Test对象创建的时候,new了一个String, 第2个Test对象,不会new String. 它们指向同一块内存空间。 好了第一个对象修改了str,那么是否第2个Test也会被影响到? [/quote] 有人吗?
yanyanem 2014-06-09
  • 打赏
  • 举报
回复
回答: 为了简化内存空间,String 的处理是个非常特殊的过程,你在new String 的时候仅仅将引用给引用者,而内容一致指向一块固定的内存,由JVM自己回收。 如果你修改了第一个str 不会影响到第二个。
sunbo624 2014-06-09
  • 打赏
  • 举报
回复
commons有EqualsBuilder和HashcodeBuilder
caddor2011 2014-06-06
  • 打赏
  • 举报
回复
引用 2 楼 soul_code 的回复:
先回答第一个问题 在A类中声明了一个方法func 打印输出X的值 这就相当于get方法 对外提供了一个外部可以访问私有变量的方法,只要知道声明是get 和set方法,理解这个应该不难 第二个问题 可以直接重写equals()方法,修改成你需要的方法就OK了 至于你的小问题,所有的对象是可以用==比较的,但是比较的是对象的地址,如果要比较对象的值 还是先覆盖equals方法,在进行比较 第三个问题 给你举个例子 String s1 = "abc";//新创建, 字符串常量池中没有该串,则会这池中创建一个字符串“abc” String s2 = “abc”; 字符创常量池中已经存在“abc“。则s2会去指向常量池中的”adc'' 而不是去创建一个新的 String s3 = new String(”abc“);直接去堆中开辟一个新的空间,而不是去池中查找
对你的答案做了一个引申: class Test { public String str = "Hello"; public: Test() { } }; 现在有2个兑现,由于它们的str的值,都为"Hello"; 也就说,第一个Test对象创建的时候,new了一个String, 第2个Test对象,不会new String. 它们指向同一块内存空间。 好了第一个对象修改了str,那么是否第2个Test也会被影响到?
caddor2011 2014-06-06
  • 打赏
  • 举报
回复
引用 2 楼 soul_code 的回复:
先回答第一个问题 在A类中声明了一个方法func 打印输出X的值 这就相当于get方法 对外提供了一个外部可以访问私有变量的方法,只要知道声明是get 和set方法,理解这个应该不难 第二个问题 可以直接重写equals()方法,修改成你需要的方法就OK了 至于你的小问题,所有的对象是可以用==比较的,但是比较的是对象的地址,如果要比较对象的值 还是先覆盖equals方法,在进行比较 第三个问题 给你举个例子 String s1 = "abc";//新创建, 字符串常量池中没有该串,则会这池中创建一个字符串“abc” String s2 = “abc”; 字符创常量池中已经存在“abc“。则s2会去指向常量池中的”adc'' 而不是去创建一个新的 String s3 = new String(”abc“);直接去堆中开辟一个新的空间,而不是去池中查找
原来java中的字符串只有一种,即:String , char [] ------这种根本就不是字符串。
coley-wu 2014-06-06
  • 打赏
  • 举报
回复
先回答第一个问题 在A类中声明了一个方法func 打印输出X的值 这就相当于get方法 对外提供了一个外部可以访问私有变量的方法,只要知道声明是get 和set方法,理解这个应该不难 第二个问题 可以直接重写equals()方法,修改成你需要的方法就OK了 至于你的小问题,所有的对象是可以用==比较的,但是比较的是对象的地址,如果要比较对象的值 还是先覆盖equals方法,在进行比较 第三个问题 给你举个例子 String s1 = "abc";//新创建, 字符串常量池中没有该串,则会这池中创建一个字符串“abc” String s2 = “abc”; 字符创常量池中已经存在“abc“。则s2会去指向常量池中的”adc'' 而不是去创建一个新的 String s3 = new String(”abc“);直接去堆中开辟一个新的空间,而不是去池中查找
caddor2011 2014-06-06
  • 打赏
  • 举报
回复
String str = new String("hell"); 到底产生了几个对象?

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧