Java中static、this、super、final(1)

来源:互联网 发布:淘宝店铺怎么搜索 编辑:程序博客网 时间:2024/05/06 15:02
本篇旨在帮助准备学习Java以及刚接触Java的朋友认识、掌握和使用staticthissuperfinal这几个关键字的使用。Java博大精深,我也是一位正在学习和使用Java的爱好者,文中难免有不妥之处,欢迎指正。
一、static
    
请先看下面这段程序: 
     
  1.    public class Hello{   
  2.      public static void main(String[] args){ //(1)   
  3.        System.out.println("Hello,world!");   //(2)   
  4.      }   
  5.    }  
    看过这段程序,对于大多数学过Java 的从来说,都不陌生。即使没有学过Java,而学过其它的高 级语言,例如C,那你也应该能看懂这段代码的意思。它只是简单的输出“Hello,world”,一点别的用处都没有,然而,它却展示了static关键 字的主要用法。 
    1处,我们定义了一个静态的方法名为main,这就意味着告诉Java编译器,我这个方法不需要创建一个此类的对象即可使用。你还得你是怎么运行这个程序吗?一般,我们都是在命令行下,打入如下的命令(加下划线为手动输入)

    javac Hello.java   java Hello
    Hello,world!
     就是你运行的过程,第一行用来编译Hello.java这个文件,执行完后,如果你查看当前,会发现多了一个Hello.class文件,那就是第一行产 生的Java二进制字节码。第二行就是执行一个Java程序的最普遍做法。执行结果如你所料。在2中,你可能会想,为什么要这样才能输出。好,我们来分解 一下这条语句。(如果没有安装Java文档,请到Sun的官方网站浏览J2SE API)首先,System是位于java.lang包中的一 个核心类,如果你查看它的定义,你会发现有这样一行:public static final  PrintStream out;接着在进一步,点击PrintStream这个超链接,在METHOD页面,你会看到大量定义的方法,查找 println,会有这样一行:
    public void println(String x)
    。好了,现在你应该明白为什么我们要那样调用了,outSystem的一个静态变量,所以可以直接使用,而out所属的类有一个println方法。

    静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。如下所示:  
  6.  class Simple{   
  7.     static void go(){   
  8.       System.out.println("Go...");   
  9.     }   
  10.    
  11.  public class Cal{   
  12.    public static void main(String[] args){   
  13.      Simple.go();   
  14.    }   
  15.   
  16. 调用一个静态方法就是类名.方法名”,静态方法的使用很简单如上所示。一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。
    静态变量
    静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了。看下面这段代码:

    1. class Value{   
    2.   static int c=0;   
    3.   static void inc(){   
    4.     c++;   
    5.   }   
    6.   
    7. class Count{   
    8.   public static void prt(String s){   
    9.     System.out.println(s);   
    10.   }   
    11.   public static void main(String[] args){   
    12.     Value v1,v2;   
    13.     v1=new Value();   
    14.     v2=new Value();   
    15.     prt("v1.c="+v1.c+"  v2.c="+v2.c);   
    16.     v1.inc();   
    17.     prt("v1.c="+v1.c+"  v2.c="+v2.c);     
    18.   }   
    19.   

    结果如下:
    v1.c=0  v2.c=0
    v1.c=1  v2.c=1
    由此可以证明它们共享一块存储区。static变量有点类似于C中的全局变量的概念。值得探讨的是静态变量的初始化问题。我们修改上面的程序:

    1. class Value{   
    2.   static int c=0;   
    3.   Value(){   
    4.     c=15;   
    5.   }   
    6.   Value(int i){   
    7.     c=i;   
    8.   }   
    9.   static void inc(){   
    10.     c++;   
    11.   }   
    12.   
    13. class Count{   
    14.   public static void prt(String s){   
    1.     System.out.println(s);   
    2.   }   
    3.     Value v=new Value(10);   
    4.     static Value v1,v2;   
    5.     static  
    6.       prt("v1.c="+v1.c+"  v2.c="+v2.c);   
    7.       v1=new Value(27);   
    8.       prt("v1.c="+v1.c+"  v2.c="+v2.c);   
    9.       v2=new Value(15);   
    10.       prt("v1.c="+v1.c+"  v2.c="+v2.c);   
    11.     }   
    12.     
    13.   public static void main(String[] args){   
    14.     Count ct=new Count();   
    15.     prt("ct.c="+ct.v.c);   
    16.     prt("v1.c="+v1.c+"  v2.c="+v2.c);   
    17.     v1.inc();   
    18.     prt("v1.c="+v1.c+"  v2.c="+v2.c);   
    19.     prt("ct.c="+ct.v.c);   
    20.   }   
    21.   


    运行结果如下:
    v1.c=0  v2.c=0
    v1.c=27  v2.c=27
    v1.c=15  v2.c=15
    ct.c=10
    v1.c=10  v2.c=10
    v1.c=11  v2.c=11
    ct.c=11
     个程序展示了静态初始化的各种特性。如果你初次接触Java,结果可能令你吃惊。可能会对static后加大括号感到困惑。首先要告诉你的是, static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中所表现的,虽然v出现在v1v2的前面,但是结果却是 v1v2的初始化在v的前面。在static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被 第一次装载时。如果你能读懂并理解这段代码,会帮助你对static关键字的认识。在涉及到继承的时候,会先初始化父类的static变量,然后是子类 的,依次类推。非静态变量不是本文的主题,在此不做详细讨论,请参考Think in Java中的讲解。
    静态类
    通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。如下代码所示:

    1. public class StaticCls{   
    2.   public static void main(String[] args){   
    3.     OuterCls.InnerCls oi=new OuterCls.InnerCls();   
    4.   }   
    5.   
    class OuterCls{   
    1.   public static class InnerCls{   
    2.     InnerCls(){   
    3.       System.out.println("InnerCls");   
    4.     }   
    5.    }   
    6.   

    输出结果会如你所料:
    InnerCls
    和普通类一样。内部类的其它用法请参阅Think in Java中的相关章节,此处不作详解。
     
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 显卡玩不起吃鸡怎么办 u盘内存是假的怎么办 新买的电脑应该怎么办 海尔一体机电脑开不开机怎么办 苹果笔记本系统坏了怎么办 苹果笔记本电脑电池坏了怎么办 苹果笔记本电脑屏幕坏了怎么办 平板开关键坏了怎么办 平板电脑电池坏了怎么办 平板电脑充电口坏了怎么办 平板电脑系统坏了怎么办 平板电脑充电器坏了怎么办 平板电脑触摸屏坏了怎么办 平板电脑关不了机怎么办 平板电脑触摸屏没反应怎么办 平板电脑声音太小怎么办 平板电脑频碎了怎么办? 淘宝直播展示频道排后怎么办 网店头像改不了怎么办 被骗了7500追不回来怎么办 steam中国版原来的游戏怎么办 老公买驾照被骗妻子应该怎么办 被淘密码骗了怎么办 逛街手机没电了怎么办 电脑登入密码忘了怎么办 晚上睡不好觉经常做梦怎么办 开淘宝店开始零销量怎么办 淘宝店开直通车后销量怎么办 淘宝直播一开始直播没人该怎么办 淘宝店铺访客数据下滑怎么办 2个ctrl键都失灵怎么办 淘宝上搜索不到很久以前订单怎么办 关键词找不到了是不是被降权怎么办 购买小程序关键词想退款怎么办? 浏览器审查元素不拆分关键词怎么办 拼多多商品想重新编辑怎么办 新开店铺没有销量怎么办 新开的店铺没有销量怎么办 淘宝的商品权重下降是怎么办 360n5手机耗电快怎么办 怪兽充电宝丢了怎么办