sophia0405

当你跌到谷底时,那正表示,你只能往上,不能往下!

 

变量的作用范围,构造函数,引用和对象

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。对象和引用               

1.public class A

        //构造函数的重载
2.        A(){}
3.        A(int x){}
4.        A(int x,String m){}
5.        A(String x,int m){} 
        
6.        public static void main(String[] s)
        {
7.            A  a1=new A(); ———— a1中存储的是 new A()的地址,而new A() 才是真正的该类的对象。
8.            a1=new A(10);
9.            a1=new A(10,”hello”);
10.            a1=new A(“hello”,10);
11.        }
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

 答案自然就清楚了吧 ^_^
            

posted on 2008-01-20 14:59  土猫敢死队  阅读(862)  评论(1编辑  收藏  举报

导航