7--黑马程序员--技术总结之几个重要的关键字

----------------------ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

一.static关键字

          static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
        被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
        只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。 
        用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
        static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。

       static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名
       用static修饰的代码块表示静态代码块,当Java虚拟机加载类时,就会执行该代码块。

         1、static变量(静态变量)和实例变量
    按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。
两者的区别是:
    对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的,会浪费内存)。
    对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
所以一般在需要实现以下两个功能时使用静态变量:
   1)在对象之间共享值时,即当类中的成员需要被所有对象共享时,用static修饰
   2)方便访问变量时
代码示例:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class StaticDemo1 {  
  2.   
  3.     /**分别通过类和对象来读取静态变量  
  4.      * @黑马ZWF  
  5.      */  
  6.     public static void main(String[] args) {  
  7.         梯形 t = new 梯形(3.0f, 10.0f, 20);  
  8.         梯形.下底 = 200;        //通过类操作静态变量  
  9.         System.out.println("梯形的下底为" + t.获取下底() );  
  10.         t.修改下底(100);        //通过对象操作静态变量  
  11.         System.out.println("梯形的下底为" + t.获取下底() );  
  12.     }  
  13. }  
  14. class 梯形 {  
  15.     float 上底, 高;  
  16.     static float 下底;  
  17.     梯形(float x, float y, float h) {  
  18.         上底 = x;  
  19.         下底 = y;  
  20.         高 = h;  
  21.     }  
  22.     float 获取下底 () {  
  23.         return 下底;  
  24.     }  
  25.     static void 修改下底(float b) {  
  26.         下底 = b;  
  27.     }  
  28. }  

         2.静态方法
        类体中的方法分为实例方法和类方法两种,用static修饰的是类方法。当一个类创建了一个对象后,这个对象就可以调用该类的方法。那么实例方法和类方法有什么区别呢?
        当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。需要注意的是,当创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。实例方法必须通过对象来调用,当某个对象调用实例方法时,该实例方法中出现的成员变量被认为是分配给该对象的成员变量,其中的类变量和其他对象共享,所以,实例方法既可以操作实例变量也可以操作类变量。
        对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址。从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。类方法的入口地址直到程序退出才被取消。所以Java规定:类方法中出现的成员变量必须是被所有对象共享的变量(类变量),即类方法不可以操作实例变量,这样规定的原因是:在类创建对象之前,实例成员变量还没有分配内存。类方法也不可以调用其他的实例方法,这是因为在类创建对象之前,实例方法也没有入口地址。
        无论是类方法或实例方法,当被调用执行时,方法中的局部变量才被分配内存空间,方法调用完毕,局部变量即刻释放所占的肉存。在一个方法被调用执行完毕之前,如果该方法又被调用,那么,方法的局部变量会再次被分配新的内存空间,比如,方法在递归调用时,方法中的局部变量会再次被分配新的内存空间。在下面的代码示例中,我将通过递归调用类中的方法,计算出Fibinacii序列的第8项(Fibinacii序列的前两项是1,后续每项的值都是该项的前两项之和)

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class StaticDemo2 {  
  2.     /**通过递归调用类中的方法,计算出Fibinacii序列的第8项  
  3.      * @黑马ZWF  
  4.      */  
  5.     public static void main(String[] args) {  
  6.         // TODO Auto-generated method stub  
  7.         System.out.println("Fibinacii的第八项是" + Fibinacii.fibinacii(8));  //输出结果是21  
  8.     }  
  9. }  
  10.   
  11. class Fibinacii {  
  12.     public static int fibinacii(int n) {  
  13.         if (n == 1||n ==2)    //Fibinacii的前两项都是1  
  14.             return 1;  
  15.         else   
  16.             return fibinacii(n - 1) + fibinacii(n - 2); //通过自身的递归调用fibinacii方法得出结果  
  17.     }  
  18. }  


二.this关键字

        this是Java的一个关键字,表示某个对象o this可以出现在实例方法和构造方法中,但不可以出现在类方法中。this关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象。实例方法必须通过对象来调用,当this关键字出现在类的实例方法中时,代表正在调用该方法的当前对象。
        实例方法可以操作类的成员变量,当实例成员变量在实例方法中出现时,默认的格式为:
        this.成员变量
        当static成员变量在实例方法中出现时,默认的格式为:
        类名.成员变量
如:
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class ThisDemo {  
  2.     int x;  
  3.     static int y;    //定义静态变量y  
  4.     void f () {  
  5.         this.x=100;     //this.成员变量  
  6.         ThisDemo.y=200; //类名.成员变量  
  7.     }  
  8.           
  9. }  

         在上述A类中的方法f中出现了this关键字,this代表使用方法f的当前对象。所以,this.x就表示当前对象的变量x,当对象调用方法f时,将100赋给该对象的变量x。因此,当一个对象调用方法时,方法中的实例成员变量就是指分配给该对象的实例成员变量,而static变量和其他对象共享。因此,通常情况下,可以省略实例成员变量名字前面的“this.”以及static变量前面的“类名.”。如:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class ThisDemo {  
  2.     int x;  
  3.     static int y;    //定义静态变量y  
  4.     void f () {  
  5.         x=100;      //省略this关键字  
  6.         y=200;      //省略类名  
  7.     }         
  8. }  

       类的实例方法可以调用类的其他方法,对于实例方法调用的默认格式为:
       this.方法;
       对于类方法调用的默认格式为:
       类名.方法;
如:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class ThisDemo2 {  
  2.     void f () {  
  3.         this.g();   //this.方法名  
  4.         ThisDemo2.h(); //类名.方法名  
  5.     }  
  6.   
  7.     void g(){  
  8.         System.out.println("ok") ;  
  9.      }  
  10.     static void h() {  
  11.         System.out.println("hello") ;  
  12.      }  
  13. }  

         在上述B类中的方法f中出现了this关键字,this代表使用方法f的当前对象。所以,方法f的方法体中this.g()就是当前对象调用方法g,也就是说,当某个对象调用方法f过程中,又调用了方法go由于这种逻辑关系非常明确,因此一个实例方法调用另一个方法时可以省略方法名字前面的“this.”或“类名.”。如:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class ThisDemo2 {  
  2.     void f () {  
  3.         g();   //省略this   
  4.         h();   //省略类名  
  5.     }  
  6.   
  7.     void g(){  
  8.         System.out.println("ok") ;  
  9.      }  
  10.     static void h() {  
  11.         System.out.println("hello") ;  
  12.      }  
  13. }  
  14.    

        注:this关键字不能出现在类方法中,这是因为,类方法可以通过类名直接调用。

三.final关键字

     final关键字可以修饰类、成员变量和方法巾的参数。
     final类不能被继承,即不能有子类。如:
     final class A{ 
     ···
    )
        A就是一个final类。有时候是出于安全性的考虑,将一些类修饰为final类。例如:Java提供的String类,它对于编译器和解释器的正常运行有很重要的作用,对它不能轻易改变,
因此它被修饰为final类。
       如果一个方法被修饰为final方法,则这个方法不能被重写。
       如果一个成员变量被修饰为final的,就是常量,常量必须赋给初值,而且不能再发生变化。
       如果方法的参数被修饰为final的,该参数的值不能被改变。
       在下面的代码示例中,A类中szetArea方法的参数r使用final修饰。这种逻辑关系非常明确,因此一个实例方法调用另一个方法时可以省略方法名字前面的“this.”或“类名.”。如:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class FinalDemo {  
  2.     public static void main(String[] args) {  
  3.         A a = new A();  
  4.         System.out.println("半径为100的圆面积为:" + a.getArea(100));  
  5.     }  
  6. }  
  7.   
  8. class A {  
  9.   //final double PI,   //非法,因为没有给初值  
  10.     final double PI=3.1415926;// PI是常量且给定初值  
  11.     public double getArea(final double r) {    
  12.         //r=89;  非法,因为r已经被final修饰,不允许再改变r的值  
  13.         return PI *r * r;  
  14.     }  
  15. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值