变量的作用范围,构造函数,引用和对象
1. 成员变量 和 局部变量
public class A
{
int x=10;
A()
{
x=30;
int x=40;
x=10;
System.out.println(x);
System.out.println(this.x);
}
}
说起java里的成员变量跟局部变量的定义,那是非常简单。
最开始做这道题时,我就出错误了 |||—_—
分析如下:
1: int x =10;————— 此处的 x 是成员变量,值10
2: x = 30;—————— 此处的 x就是第1步里的那个成员变量,值变成30
3: int x =40;————— 此处定义了1个局部变量,值40
4: x = 10;—————— 此处的x是第3步里的局部变量,值变成10—————我出错的地方
因为此处,程序并没有写成 this.x,所以它就是那个局部变量。
5: 输出(x);——————— 局部变量,值10
6: 输出(this.x)————— 成员变量,值30
2.构造函数
1) 无参构造函数——没有参数。
如果所写类中没有构造函数,则编译器会自动创建一个无参构造函数。但是如果已经手动定义了一个构造函数(无论是否有参),编译器都不会自动创建无参构造函数了:
class Hat
{
Hat(int i) {}
Hat(double d) {}
}
现在,要是这样写 new Hat();那么编译器就会报错:没有找到匹配的构造函数。
class Super
{
public int i = 0;
public Super (string text)
{
i = 1;
}
}
public class Sub extends Super
{
public Sub (string text)
{
i = 2;
}
public static void main(string args[])
{
Sub sub = new Sub(“Hello”);
System.out.Println(sub.i);
}
}
此题最后编译不通过:
父类中有一个有参的构造函数,所以编译器不再提供无参的构造函数。
当 Sub sub = new Sub(“Hello”) 时,会去new一个父类的对象,而在子类的构造函数中,并没有手动添加个super调用他父类的现有的构造函数,编译器去寻找默认的,父类无参构造函数,就此题而言,找不到,就会编译不通过。
想编译通过的修改方案:a:父类中手动加上一个无参的构造函数(最好) b:子类中的构造函数中,手动加上一个super调用父类的现有的构造函数。
3。对象和引用
{
//构造函数的重载
{
12.}
所以,这个程序中,有4个对象,只有1个引用a1。了解了这个知识点,再来看下面这个程序:
class ValHold
{
public int i = 10;
}
public class ObParm
{
public static void main(String argv[])
{
ObParm o = new ObParm(); // new 了ObParm 类的一个对象,并把该对象的地址赋给了变量o
o.amethod();
}
public void amethod()
{
int i = 99;
ValHold v = new ValHold(); // A: new 了ValHold类的一个对象,并把该对象的地址赋给了变量v,即此处的v指向了该对象。
v.i=30; // A:处new的对象里的数据,变成了30。
another(v,i); // 此处的v自然是A:处定义的变量v。
System.out.println(v.i); //此时在运行完another()这个成源方法后,v所指向的对象里,数据已经变成20了
}//End of amethod
public void another(ValHold v, int i) // B: 此处新定义了一个变量v, 并copy了A处的v的值。也就是此处的v,也指向了A处的对象。
{
i=0;
v.i = 20; // A:处new的对象里的数据,变成了20。此处的v当然是B:处定义的变量v。
ValHold vh = new ValHold(); // C:new了ValHold类的新对象,并把该对象的地址赋值给了变量vh
v = vh; //此处最关键:把C:处的vh的值copy给了B:处定义的v:即B:处的v,此刻,指向了C:处定义的对象
System.out.println(v.i+ " "+i); //那么这个v自然就是B:处定义的变量v,v.i 也就是该v所指向的C:处的对象的数据
}//End of another
}
1) 10,0, 30
2) 20,0,30
3) 20,99,30
4) 10,0,20