课堂笔记学习java(初级)第四节课

来源:互联网 发布:js 从数组中删除元素 编辑:程序博客网 时间:2024/05/16 08:13

第四节课

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.fibinacii(7));//  可见还没哟创建Fibi的对象时就可以调用fibinacii()方法,因为属于static修饰的类变量
   }
}

 

 

 


包是java中有效的管理类的一个机制,包有类似于目录结构的层次结构.通过import关键字可以在程序中使用包

语法格式:
import<包名>.*;   //包含包中的所有类
import<包名><类名>//包含包中的指定类

例如:

import java.awt.*;      //包含java.awt包中的所有类
import java.awt.JButton;//包含java.awt包中的JButton类

既然知道了怎么使用,那如何制作包呢,可以通过关键字package声明包语句.package语句作为java源文件的一个条语句,指明该源文件定义的类的所在包.

语法格式:
package 包名;

如果源文件中省略了package语句,那么源文件中定义命名的类将被隐含的认为是无名包的一部分,即源文件中定义命名的类在同一个包中,但该报没有名字而已.
包还可以是一个合法的表示符,也可以是若干个标识符加"."分割而成,如

package sunrise;
package sunrise.com.cn

程序如果使用了包的语句,如

package desney.tom;

那么目录必须包含有如下结构,如
C:/cartoon/desney/tom

并且要将源文件保存在目录C:/cartoon/desney/tom中,才能使用这个包,然后编译源文件:
C:/cartoon/desney/tom/javac 源文件.java

jacac C:/cartoon/desney/tom/源文件.java

从一个例子体会此过程:

 

程序代码:


package desney.tom;
public class PrimNumber
{   public void getPrimnumber(int n)
{  int sum=0,i,j;
       for(i=1;i<=n;i++)  
{  for(j=2;j<=i/2;j++)
{  if(i%j==0)
                   break;
          }
          if(j>i/2)
            System.out.print(" "+i);
       }
     }
public static void main(String args[])
{  PrimNumber p=new PrimNumber();
       p.getPrimnumber(20);
    }
}

 

 

 

保存上述源文件到C:/cartoon/desney/tom下,然后编译

C:/cartoon/desney/tom/javac PrimNumber.java

运行程序时必须到desney/tom的上一层目录cartoon中来运行,如

C:/cartoon/java desney.tom.PrimNumber
因为起了报名,类PrimNumber的全名应该为desney.tom.PrimNumber

导入这个包时也要注意名称
 

程序代码:

import desney.tom.PrimNumber;

 


所以用package可以把认可类都打包然后在其他程序中使用,于c或c++中的头文件有着相似的效果,差别就是java中的包里只能是类

注意:使用import可以导入包中的类.在编写源文件时,除了自己编写的类外,经常需要使用java提供的去多类,这些类可能不在一个包中.在学习java时,使用已经存在的类,避免一切从头做起,这是面向对象编程的一个重要方面.


总结:具体的把static修饰的变量和方法的使用方法做了介绍;对java中包有了初步认识