`

Java中的Static困惑

    博客分类:
  • Java
阅读更多

其实很简单的一个问题,被大家搞复杂了,实在看不下去。

1. 关于main方法是static方法,但是为什么非要是static。
      

    原因就是,如果一个类她定义了main方法的话,那么她的main方法会在这个类的构造函数运行之前被调用。
    由于main方法运行的时候尚未在JVM里生成相应对象(构造函数未被执行),所以要声明为static。

2. 这就涉及到下面的问题,和其他任何方法一样,static方法可以创建或使用与其它类型相同的被命名对象,因此static

    方法常常拿来做‘牧羊人’的角色,负责看护与其隶属同一类型的实例群。”其实作者的意思是说,按照GOF(模式四  

    人帮) 的观点,单实例工厂类的生产方法,应该是static的。
      
    关于‘牧羊人’的意思是指,在面向对象的语言里,最高级首先是元类,元类(meta class)下面是类,类下面才是对

    象。对于虚拟机来说,类是元类的对象,static方法是类的方法,而不是对象的方法。

    所以,对象就相当于“羊”,
    类就相当于“羊圈”盛放和标示“羊”,拿出来一只羊,就要问问,你是哪个羊圈里的? 
    static方法相当于“羊圈里的狗”,专门来管理羊。
    而元类才是幕后的‘牧羊人’。


    thinking作者本科是读物里的,后来才转过来读软件工程(那时候学的是c),可能是半路出家的原因,对面向对象的机

    制,在理解上有出入。

3. 关于“static方法就是没有this的方法”这句话

      其实这句话是废话,this是对象的引用。而static方法是一个类的方法,不是哪个特定对象的方法,所以在static方法里使用this引用每意义。

4. 关于static方法和static属性是不是存储在一个地方的

      我爱死这个问题了。
      我可以负责任的说,他俩肯定不能存到同一个内存地址里面去(笑),虚拟地址除外。
      其实他们俩不属于哪个特定的对象,所以不会出现在为哪个特定对象分配的内存块里。
      刚才说了,static方法和static属性属于类,所以他俩是被存到相应的类的内存空间里。
      为什么类还有自己的内存空间?是因为特定的类是特定的元类的对象。也就是说,类是某个其它类的对象。而这个元类

      并未开放给应用程序员。

 

      其实static是个非常古老的关键字,古老到比这里大部分朋友的年龄还老。

 

      http://www.ixpub.net/thread-803970-3-1.html

分享到:
评论
1 楼 我爱3G 2011-03-24  
你的羊圈、羊,还有狗的比喻真

相关推荐

    学习JAVA的步骤 java 学习 步骤

    然而,在Java中有一些关键字的使用可能会让人感到困惑,例如`public`、`protected`、`private`和`static`等。理解这些关键字何时使用、为什么使用以及如何使用是非常重要的。 #### 三、深入面向对象编程特性 面向...

    java入门实例 java入门实例

    然而,更推荐的方法是创建一个名为“JAVA_HOME”的环境变量,指向JDK的根目录,然后在Path变量中使用 `%JAVA_HOME%\bin;%PATH%`。这样不仅方便以后使用JUnit、Ant等工具,还能简化路径引用。 现在,你可以开始编写...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    几个有意思的java程序,考考你的java功底

    书中提供了七个具有特殊行为的短小Java程序,并以多项选择题的形式提问:“这些程序会打印出什么?”随后揭示答案,并讲解问题的成因以及如何修复。 #### 知识点详解 ### 谜题:`SimpleQuestion` #### 源代码解析...

    InterlliJ IDEA2020新建java web项目找不到Static Web的解决

    在使用IntelliJ IDEA 2020版本开发Java Web项目时,可能会遇到一个问题,即在创建新项目的过程中找不到“Static Web”选项。这可能是由于IDEA的版本更新导致的界面变化,使得部分用户在尝试构建传统的Web应用程序时...

    Java初学者容易混淆的知识点

    然而,Java的复杂性和细节之处往往让新手感到困惑,特别是在处理一些看似相似但实则含义迥异的概念时。以下是根据提供的文件信息,深入解析Java初学者容易混淆的知识点: ### 1. main()方法的语法格式 `public ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    java输入语法

    与C语言相比,Java的输入方式更加复杂且功能强大,这使得初学者可能会感到有些困惑。本文将详细介绍两种常用的Java输入方式:通过`java.util.Scanner`类和`java.io.BufferedReader`类实现。 #### 二、`java.util....

    张孝祥Java就业培训教程.pdf

    作者从事了多年的软件开发和培训教学,非常清楚那些容易使新手困惑的问题,在学习过程中会碰到的拦路虎,作者结合了多年实际开发与教学经验,收集了众多学员在学习中常提到的问题,对平时讲课的内容进行了精心整理。...

    浅析Java引用类型和方法参数传递

    通过具体实例,我们将揭示值类型与引用类型之间的差异,并解释在实际编程过程中可能遇到的一些常见困惑。 #### 二、Java的数据类型 Java语言支持两种主要的数据类型:**值类型**和**引用类型**。值类型主要包括基本...

    Java JDK 配置;Java全编译

    对于初学者而言,Java的初次接触往往伴随着不少挑战,尤其是配置环境和编译运行第一个程序的过程中遇到的各种错误信息,常常令人感到困惑甚至沮丧。本文旨在通过详细的步骤指导,帮助初学者克服这些困难,并顺利进入...

    java puzzles.pdf

    Java Puzzles是一种特殊的学习方式,通过解决一些令人困惑或意想不到行为的代码片段来加深对Java语言特性的理解。这种方式不仅能帮助开发者避免常见的编程陷阱,还能在轻松愉快的过程中学习。 #### 二、重要知识点...

    2022年java学习心得体会_JAVA实训的心得.docx

    对于Java中的关键字如public、protected、private、static等,以及面向对象的特性如继承、构造器、抽象类、接口、多态等,都需要通过大量的实践和思考来深入理解。 其次,有效的学习策略是至关重要的。作者在学习...

    java解惑95个谜题.doc

    Java编程语言中,有一些微妙的陷阱和特性可能会导致程序员困惑,尤其是在处理数学运算和数据类型时。以下是对这两个Java谜题的深入解析: 谜题1:奇数性 在这个问题中,我们有一个方法`isOdd(int i)`,它通过检查`i...

    “礼让”原则学习Java对象初始化顺序.pdf

    Java 对象初始化顺序是指在 Java 程序中,对象的初始化过程中发生的顺序问题。这是 Java 编程语言的基础知识点之一,但是许多学生在学习和使用时总是感到困惑和困难。 二、JVM 执行过程中的“礼让”原则 JVM 在...

    Java零基础 - 环境变量PATH配置.md

    3. **编译程序**:在命令行中,导航到包含`HelloWorld.java`文件的目录,并使用命令`javac HelloWorld.java`进行编译。 4. **运行程序**:编译成功后,使用命令`java HelloWorld`运行程序。 #### 五、总结 通过...

    java puzzle_sun.pdf

    本次讲座的目标是让参与者了解到编程中的一些奇特现象,特别是Java语言中的特性。通过有趣的例子,使参与者能够在享受乐趣的同时避免常见的编程陷阱。 ##### 学习目标 - 避免常见的编程陷阱 - 在学习过程中获得乐趣...

    Java外文翻.doc

    尽管这可能导致初学者感到困惑,但实际上这种设计方法有助于限制类的过度增长。 - **版本演变**: 从 Java 1.0 版本开始,Java 对其 I/O 类库进行了重大改进,最初是面向字节的,后来加入了面向 Unicode 字符的类库以...

    计算机二级考试备考经验:JAVA学习路径(二).docx

    但需要注意的是,关键字如public、protected、private、static的用法可能会引起困惑。这些关键字的理解对于编写符合面向对象原则的代码至关重要。《Thinking in Java》这本书对此有详细的阐述,可以帮助加深理解。 ...

Global site tag (gtag.js) - Google Analytics