刚学Java不久,遇到几个问题,想不明白,请教各位大大,见笑了!
classs Letter{
char c;
}
public class PassObject{
static void f(Letter y){
y.c = 'z';
}
public static void main(String [] args){
Letter x = new Letter()
x.c = 'a';
print("1: x.c:" + x.c);
f(x);
print("2: x.c:" + x.c);
}
}
________________________________________________
public class EqualsMethod{
public static void main(String [] args){
Integer n1 = new Integer(20);
Integer n2 = new Integer(20);
System.out.println(n1.equals(n2));
}
}
________________________________________________
class Value{
int i;
}
public class EqualsMethod2{
public static void main(String [] args){
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 60;
System.out.println(v1.equals(v2));
}
}
________________________________________________
我的疑惑:
在第一段代码中
①对"c"的调用是不是一定要采用*.c的方式;
②方法f(Letter y)的参数列表是什么意思?我只明白f(int y),表示可以传一个变量一进来,且类型为int类型,可是这里Letter为一个类,我就不明白了;
③f(x);语句我不明白,此处"x"为一个对象引用,将他传入方法f()里,那么方法f()是不是就变成x.c = 'z'这样了呢?
在第二段代码中
我很容易理解“n1.equals(n2)”代表的是比较n1与n2的实际内容的值,而非引用地址。
在第三段代码中
我就不明白了,为什么不想等了呢?
________________________________________________
希望有大大能帮我分析一下 第一段代码 以及 第三段代码的方法调用及赋值是怎样进行的,以及他们的内存分配是怎样的。
阿莉丫哆菓咋一玛斯!!!
Java方法调用别名与内存分配问题
答案:3 悬赏:0
解决时间 2021-12-21 21:36
- 提问者网友:无依无靠的距离
- 2021-12-20 21:07
最佳答案
- 二级知识专家网友:桃花别处起长歌
- 2021-12-20 22:13
①对"c"的调用是不是一定要采用*.c的方式;
对于Letter类,你是这样定义的
classs Letter{char c;}
说明c是Letter类的一个属性,凡是属性,都是使用 “实例名.属性名” 的方式访问。
你在main方法中写了
Letter x = new Letter()
就是创造了一个Letter类的实例,实例名就是x。因为访问类的属性的规则是 “实例名.属性名”
因此使用x.c
②方法f(Letter y)的参数列表
方法参数的定义格式为 方法名(参数类型 参数名)
一个方法的参数可以是基本数据类型,也可以是应用数据类型。基本数据类型就是int、short 、byte、long等。引用数据类型,你可以就将其理解为类。
因此,对于你说的int,是基本数据类型;而方法中传入一个对象也是可以的,是引用数据类型。
③f(x);
其定义格式为
static void f(Letter y){ y.c = 'z'; }
而调用的时候,是这样写的
Letter x = new Letter() x.c = 'a'; print("1: x.c:" + x.c); f(x); print("2: x.c:" + x.c);
你调用这个方法的时候,传入的是x,也就是传入的是一个对象。也就是y代表的就是x
因此:y.c='Z'的本质就是x.c='z'
4、equals
Integer n1 = new Integer(20);Integer n2 = new Integer(20);System.out.println(n1.equals(n2));
equals方法比较的不是两个对象的内容,而是两个对象在内存中的地址,我们知道,两个对象内容可以相同,但是地址一定是不同的。
而这里,之所以相等,是因为Integer类中复写了equals方法,使得其不再是比较地址,而是比较内容。
对于
Value v1 = new Value(); Value v2 = new Value(); v1.i = v2.i = 60; System.out.println(v1.equals(v2));
由于Value是你自己定义的对象,由于你没有覆盖equals方法,所以比较的是地址。所以不相等。
对于Letter类,你是这样定义的
classs Letter{char c;}
说明c是Letter类的一个属性,凡是属性,都是使用 “实例名.属性名” 的方式访问。
你在main方法中写了
Letter x = new Letter()
就是创造了一个Letter类的实例,实例名就是x。因为访问类的属性的规则是 “实例名.属性名”
因此使用x.c
②方法f(Letter y)的参数列表
方法参数的定义格式为 方法名(参数类型 参数名)
一个方法的参数可以是基本数据类型,也可以是应用数据类型。基本数据类型就是int、short 、byte、long等。引用数据类型,你可以就将其理解为类。
因此,对于你说的int,是基本数据类型;而方法中传入一个对象也是可以的,是引用数据类型。
③f(x);
其定义格式为
static void f(Letter y){ y.c = 'z'; }
而调用的时候,是这样写的
Letter x = new Letter() x.c = 'a'; print("1: x.c:" + x.c); f(x); print("2: x.c:" + x.c);
你调用这个方法的时候,传入的是x,也就是传入的是一个对象。也就是y代表的就是x
因此:y.c='Z'的本质就是x.c='z'
4、equals
Integer n1 = new Integer(20);Integer n2 = new Integer(20);System.out.println(n1.equals(n2));
equals方法比较的不是两个对象的内容,而是两个对象在内存中的地址,我们知道,两个对象内容可以相同,但是地址一定是不同的。
而这里,之所以相等,是因为Integer类中复写了equals方法,使得其不再是比较地址,而是比较内容。
对于
Value v1 = new Value(); Value v2 = new Value(); v1.i = v2.i = 60; System.out.println(v1.equals(v2));
由于Value是你自己定义的对象,由于你没有覆盖equals方法,所以比较的是地址。所以不相等。
全部回答
- 1楼网友:废途浑身病态
- 2021-12-20 23:58
package console;
class Letter{
char c;//static char c; 2
}
public class PassObject{
static void f(Letter y){//对象是可以作为函数参数的
y.c = 'z';//没错,你说得很对
}
public static void main(String [] args){
Letter x = new Letter();
x.c = 'a';//是的,除非改成2
System.out.println("1: x.c:" + x.c);
f(x);
System.out.println("2: x.c:" + x.c);
}
}package console;
class Value{
int i;
}
public class EqualsMethod2{
public static void main(String [] args){
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 60;
v1.i = 60;//等价写法
v2.i = 60;
System.out.println(v1.equals(v2));
}
}
- 2楼网友:蜜罐小熊
- 2021-12-20 23:26
method参数letter 是指的传入一个类型为letter的参数x
letter在最上方已经声明,是一个类
而method本身声明为静态static,所以可以直接调用,完整的是passobject.method(y)
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯