`
林奇峰
  • 浏览: 42145 次
  • 性别: Icon_minigender_1
  • 来自: 濮阳
社区版块
存档分类
最新评论

静态方法为何不能调用非静态成员?

    博客分类:
  • j2se
 
阅读更多

我很久以前就知道静态方法不能调用非静态成员,但是从没想过为什么?只知道书上这么说的。

今天忽然想了一下,豁然开朗:

那么静态方法为何不能调用非静态成员?

首先要从静态方法是如何被调用的呢说起? 类名.静态方法();

          非静态方法是如何被调用的呢? 实例变量名.非静态方法();

           实例变量名.非静态方法();       非静态方法中的this是指代调用此方法的实例变量,(非静态方法中直接调用成员变量或成员方法其实默认是用 this.成员 做替换),this是当前实例变量。既然this是实例变量那么  类名.静态方法(); 假设静态方法能调用非静态成员,那么静态方法中就可以出现this,既然能出现this,那么this指代什么呢?指代当前类名?

矛盾了吧?所以静态方法不能调用非静态成员。

 

既然提到this,我就多说一句:如果子类实例变量调用父类成员(属性和方法),父类中的this指代该子类实例变量,和上面 “this是当前实例变量”这句话不矛盾吧!

2
5
分享到:
评论
2 楼 edr_ 2013-10-05  
cyruscript 写道
变量只有在内存中占有一席之地时才能被访问.

静态方法不能调用非静态成员,原因就是静态成员与非静态成员在内存中被实例化的时机不同。
静态成员在类加载的时候就会分配内存,就已然存在;而非静态成员即对象成员,那得等到对象实例化时才出来,在类加载时是不存在的。那在类加载时去引用一个不存在的成员,当然是不行的。

正解!
1 楼 cyruscript 2013-10-05  
变量只有在内存中占有一席之地时才能被访问.

静态方法不能调用非静态成员,原因就是静态成员与非静态成员在内存中被实例化的时机不同。
静态成员在类加载的时候就会分配内存,就已然存在;而非静态成员即对象成员,那得等到对象实例化时才出来,在类加载时是不存在的。那在类加载时去引用一个不存在的成员,当然是不行的。

相关推荐

    C++静态成员函数不能调用非静态成员变量(详解)

    本文将深入探讨为什么C++的静态成员函数不能调用非静态成员变量,并通过示例进行解释。 首先,我们需要理解静态成员的概念。静态成员属于类本身,而不是类的任何特定实例。这意味着,不论创建了多少个类的实例,...

    通过函数指针调用C++非静态成员函数

    在C++编程中,通过函数指针调用非静态成员函数是一种高级技巧,主要用于实现回调、动态绑定等场景。本文将详细探讨如何在Visual C++ 6.0 (VC6.0) 和Borland C++ Builder 6.0 (BCB6.0) 中实现这一功能。 #### 一、...

    C#静态方法与非静态方法的比较

    - **成员访问**:静态方法只能访问静态成员(包括静态字段、静态属性和静态方法),不能直接访问实例成员;实例方法可以访问所有成员(静态和实例)。 #### 三、代码示例与实践 **1. 获取当前方法所在的类名** 在...

    静态成员与静态方法

    需要注意的是,静态方法不能访问非静态成员变量,例如: public class AB{ int a; static void setA(int aa){ System.out.println(a); //错误,不能访问非静态成员变量 } public static void main(String args...

    C++非静态成员函数完全可以作为线程函数

    一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。...本例就是自己的研究成果,使用非静态的成员函数作为线程函数,还能修改类的非静态的数据成员。

    java基础常识与概念

    静态方法为什么不能调用非静态成员? 静态方法和实例方法有何不同? 重载和重写的区别 什么是可变长参数? 基本数据类型 Java 中的几种基本数据类型了解么? 基本类型和包装类型的区别? 包装类型的缓存机制了解么? ...

    PHP中静态方法(static)与非静态方法的使用及区别.docx

    3. 访问限制:静态方法和属性不能直接访问非静态的成员,因为它们可能在没有实例的情况下被调用。 了解这些区别有助于优化代码设计,选择最适合的方法来处理不同场景下的问题。在实际开发中,合理使用静态和非静态...

    静态成员间的调用实例(基础)

    然而,静态成员调用非静态成员(实例成员)时需要额外的考虑。实例成员依赖于类的实例,因为它们存储在堆上,每个实例都有自己的一份副本。 例如,我们有以下类定义: ```csharp public class MyClass { public ...

    C++静态成员函数访问非静态成员的几种方法

    大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C++灵活性下面,类还具备了静态成员和静态函数,即 ...

    (js)静态与非静态方法

    在JavaScript中,静态方法与非静态方法是面向对象编程中的两个基本概念,它们在类的定义和实例化过程中扮演着重要角色。理解这两者之间的区别对于编写高效、可维护的代码至关重要。 ### 静态方法 #### 定义 静态...

    php面对对象中static静态属性和静态方法的调用_.docx

    此外,静态方法也可以调用非静态方法,只要不使用 `$this`,而是通过类名或对象实例来调用,如 `self::say()` 或 `$p1->say()`。 在示例代码中,我们看到 `$p1->say()` 调用了非静态方法 `say()`,这个方法可以访问...

    Java中静态方法和非静态方法的区别.docx

    非静态方法的内存并不固定在 RAM 中,所以我们需要一个类对象来调用非静态方法。要调用该方法,我们需要编写方法名称,后跟类对象名称语法。 五、绑定流程 在静态方法中,该方法使用编译时或早期绑定。因此,我们...

    浅谈PHP中静态方法和非静态方法的相互调用

    静态方法不能访问非静态成员,因为静态方法属于类本身,而非静态方法属于类的对象。静态方法通常用于执行与类的任何具体实例无关的操作。 2. 非静态方法(non-static method): 非静态方法也称为实例方法,需要先...

    PHP静态调用非静态方法的应用分析

    静态方法不能访问类的非静态成员变量 `$this`,因为 `$this` 指向的是当前对象实例,而在静态上下文中并不存在。 在PHP中,静态调用非静态方法虽然语法上是合法的,但通常会导致编码标准化警告...

    java方法调用

    - 这种情况下,由于静态方法无法直接访问非静态成员,需要先创建一个类的实例,然后通过该实例来调用非静态方法。 - 调用格式:`ClassName instance = new ClassName(); methodName(参数1, 参数2, ...);` - 示例...

    关于C++静态成员函数访问非静态成员变量的问题

    总之,C++的静态成员函数不能直接访问非静态成员变量,因为它们没有`this`指针。要解决这个问题,可以将变量改为静态,或者通过传递对象实例的指针或引用给静态成员函数。理解这些概念对于编写高效且健壮的C++代码至...

    C#中静态与非静态方法比较

    - **非静态方法**:可以访问类中的任何成员,无论是静态成员还是非静态成员。 - **静态方法**:只能访问类中的静态成员。这是由于静态方法在类实例化之前就可以被调用,因此无法访问尚未分配内存的非静态变量。 ###...

    .NET的静态与非静态的区别分析

    总结来说,静态成员(包括静态类、静态构造函数、静态方法和静态字段)主要关注类级别的行为和数据,它们不依赖于对象实例,而非静态成员则与对象实例紧密关联,代表了对象的状态和行为。理解这些区别对于编写高效、...

    从JVM内存管理的角度谈谈静态方法和静态属性

    当调用非静态方法时,必须先创建对象实例,这样栈中才会有一个指向堆中对象实例的指针。这个指针使得实例方法能够访问并修改对象的属性。 静态属性同样不依赖于任何对象实例,它们属于类本身,而不是类的任何实例。...

Global site tag (gtag.js) - Google Analytics