unicorn的java课堂笔记(四)

作者在 2006-10-07 02:55:00 发布以下内容

第四节课

static的用法和包

上次课提到了static关键字,下面介绍一下具体的用法

1.实例变量和类变量

我们已经知道一个类可以使用new关键字可以创建多个不同的对象,这些对象被分配不同的内存空间.具体说的话,不同的对象的实例变量将被分配不同的内存空间,如果类中的成员变量有类变量,那么所有对象的这个类变量都分配分配给相同的一处内存,改变其中一个对象的这个类变量会影响其他对象的这个类变量,也就是说对象共享类变量.如

程序代码:

class Takecare
{
static int x;
int y;
}

class A
{
Takecare A1=now Takecare();
Takecare A2=now Takecare();


//在此代码中如果给x赋值那么,A1.x 和A2.x指的是同一个内存空间,无论那个对象修改都是对一个x进行操作
}

当java程序执行时,类的字节码文件被加载到内存,如果该类没有创建对象,类的实例成员变量不会被分配内存.但是类中的类变量被加载到内存时,会被分配相应的内存空间.简单的说就是,没创建对象当类加载到内存时候,只有类变量(static)会被分配内存空间,只有创建对象时候实例变量才会被分配空间的.

像上面的例子里,在没有创建Takecare的对象时候,Takecare::x是有空间的即此时可以访问的,当且仅当Takecare A1=now Takecare()时A1.y才会有内存空间.

通过下面的例子体会一下,不同的对象会共享一个底

程序代码:


class 梯形  
{   float 上底,高;
    static float 下底;
梯形(float x,float y,float h)
{   上底=x; 下底=y; 高=h;
    }
float 获取下底()
{   return 下底;
    }
void 修改下底(float b)
{   下底=b;
    }
}
class Example4_7
{   public static void main(String args[])
  {  梯形 laderOne=new 梯形(3.0f,10.0f,20),laderTwo=new 梯形(2.0f,3.0f,10);
       梯形.下底=200;                 //通过类名操作类变量
       System.out.println("laderOne的下底:"+laderOne.获取下底());
       System.out.println("laderTwo的下底:"+laderTwo.获取下底());
       laderTwo.修改下底(60);         //通过对象操作类变量
       System.out.println("laderOne的下底:"+laderOne.获取下底());
       System.out.println("laderTwo的下底:"+laderTwo.获取下底());
    }
}

2.实例方法和类方法

和实例变量和类变量的描述时是一样,当类的字节码加载到内存是类方法的入口地址就会被加载到相应的内存空间,即此时可以访问;而当且只有创建对象之后,实例方法的入口地址才会被加载到内存中,这是才可以调用.

既然知道了实例方法和类方法开始生效的时间,可以知道他们可以调用何种类的成员变量:

1)类方法因为是在创建对象之前就已经生效了,这时候实例变量还没有被分配内存空间,只有类变量被分配了内存空间,所以类方法只能调用被分配内存空间的变量即变量;

2)实例方法是在创建对象之后才开始生效的,这是无论是类变量还是实例变量都已经被分配了内存空间,所以实例方法生效后可以调用变量和实例变量.

程序代码:


class Fibi
{   public static long  fibinacii(int n)
{   long c=0;
        if(n==1||n==2)
           c=1;
        else
           c=fibinacii(n-1)+fibinacii(n-2);
         return c;
    }
}
public class Example4_8
{  public static void main(String args[])
{  System.out.println(Fibi.fibinaci
转帖&&连载 | 阅读 951 次
文章评论,共1条
海啸南风(作者)
2006-10-07 08:28
1
噢,看来被误会大了!

我们学校教java,不过我一直都很喜欢c++,所以为了适应现在的形势和学校的安排,我决定必须学好java,不过以我现在的水平来说,只是个初学者。

更严重的是,这些课堂笔记是我从bc-cn论坛上转来的,不是自己原创的,看来我得对转来的东西做点儿说明了,不然万一作者找上门来……^_^。我转载的目的是对比自己的老师和别人的老师所教内容的区别,同时也学习一下别人总结知识的方法,要是被作者误会剽窃目的那就不好了。

我自己“原创”的东西都在各种语言开拓和算法总结里面,其实也就是自己练手时写的一些东西,呵呵,好像没什么可观赏性,所以“原创”两个字加引号了:)。



很高兴认识你,欢迎常来这里转转,也可以加我qq:89390189,一起交流吧!

By the way,“人不可貌相”是指哪个“貌”呢,估计你应该是没见过我吧?至今为止应该是不存在见过我的人还对我说过“人不可貌相”这句话,呵呵,你说这是为什么呢[emot]13[/emot]

呵呵,欢迎光临!
游客请输入验证码