为什么静态方法不能访问非静态方法?

2021-02-25 17:26发布

16条回答
一朵大红花
2楼 · 2021-02-26 08:19

1、静态方法是属于类的,即静态方法是随着类的加载而加载的

非静态方法是属于对象的,对象是在类加载之后创建的

2、静态方法先于对象存在,所以先存在静态方法,在存在非静态方法

3、就好比现在去调用未来未知的方法,肯定是不符合逻辑的,所以静态不能调用非静态方法

三岁奶猫
3楼 · 2021-02-26 10:53

所以说静态方法会随着类的加载而被加载。当你new一个对象时,该对象存在于对内存中,this关键字一般指该对象,但是如果没有 new对象,而是通过类名调用该类的静态方法也可以。

梦到内河_
4楼 · 2021-02-26 16:11

1、静态方法是属于类的,即静态方法是随着类的加载而加载的

非静态方法是属于对象的,对象是在类加载之后创建的

2、静态方法先于对象存在,所以先存在静态方法,在存在非静态方法

3、就好比现在去调用未来未知的方法,肯定是不符合逻辑的,所以静态不能调用非静态方法


灰机带翅膀
5楼 · 2021-02-26 16:17

       这个要从java的内存机制去分析,首先当你New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区的地方,然后 再在堆内存中创建对象。所以说静态方法会随着类的加载而被加载。当你new一个对象时,该对象存在于堆内存中,this关键字一般指该对象,但是如果没有 new对象,而是通过类名调用该类的静态方法也可以。

       程序最终都是在内存中执行,变量只有在内存中占有一席之地时才会被访问,类的静态成员(静态和方法)属于类本身,在类加载的时候就会分配内存,可以 通过类名直接去访问,非静态成员(变量和方法)属于类的对象,所以只有在类的对象禅师(创建实例)的时候才会分配内存,然后通过类的对象去访问。

       在一个类的静态成员中去访问非静态成员之所以会出错是因为在类的非静态成员不存在的时候静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。

       假如静态方法可以访问非静态方法:首先静态方法是你在new一个对象的时候首先将静态方法随着class文件一起,被放入到堆中的方法区。然后才会在堆中创建一个对象。也就是说静态方法已经存在类,非静态方法还没有,如果你静态方法调用的非静态方法一直没有被创建,那么就会报错。。。。。jvm肯定不会冒这个风险,让你调用一个可能不存在的方法,所以就索性在你调用的时候就报错。。。。避免以后不必要的麻烦。



猫的想法不敢猜
6楼 · 2021-02-28 12:23

静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存,非静态方法是属于对象的,对象是在类加载之后创建的静态方法先于对象存在,当你创建一个对象时,程序为其在堆中分配内存,一般是通过this指针来指向该对象。静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。因此在对象未存在时非静态方法也不存在,而静态方法自然不能调用一个不存在的方法。


猜不到结尾
7楼 · 2021-02-28 13:04

非静态方法的是可以直接访问对象的变量的,这意味着,对象的变量不一样,运行这个非静态方法的结果可能就不一样。这是很有意义的,比如我有1块钱(状态),那我就可以买辣条(操作),你有1毛钱,那你就买不到辣条。因为人买辣条的操作需要跟他的钱关联。

静态方法的意义在于不依赖对象的状态,是类所有。静态方法不能访问非静态方法,就是因为静态方法不可以跟对象的状态有关系,而非静态方法是可以跟对象状态产生关联的。


py大白
8楼 · 2021-03-04 16:16

1、静态方法是属于类的,即静态方法是随着类的加载而加载的

非静态方法是属于对象的,对象是在类加载之后创建的

2、静态方法先于对象存在,所以先存在静态方法,在存在非静态方法

3、就好比现在去调用未来未知的方法,肯定是不符合逻辑的,所以静态不能调用非静态方法


IT猴
9楼 · 2021-03-05 19:11

因为静态修饰的资源存在于静态区,属于类资源,会随着类的加载而加载,优先于对象存在于内存中,而且他的调用不需要对象调用使用类名就可以直接调用,所以静态的方法被调用的时候有可能对象还没有被创建出来,如果静态的方法中调用功能非静态的方法,由于非静态的方法必须使用对象来调用,此时对象明显还没有创建出来,造成了静态方法中使用一个不存在的对象做事情,明显是不合理的。所以静态方法不能调用非静态的方法

相关问题推荐

  • 回答 156

    对于每一位才开始接触JAVA的新手来说,先不要管算法和数据结构,大多数简单的程序不需要用到算法和数据结构,所以当你真正需要时再去学习。编程一段时间以后,你就会知道在哪些地方用到他们。这时知道算法的名字并了解它们的功能,然后动手去实践。当我们在去...

  • 回答 93

    2个都很好就业,更关键的是要学得到东西

  • 回答 12
    已采纳

    获取Map集合中所有的key可以通过map集合的keySet()方法获取例如:    Map map = new HashMap();    map.put(xx,xx); //存放数据    //.... 省略    Set set = map.keySet();    //可以通过迭代器进行测试    Iterator iter = set.iter...

  • 回答 56
    已采纳

    不同年龄,不同掌握程度,学历,找工作城市,面试能力这是一个多方面影响的结果,如果是平均值的话,全国平均薪资14k左右

  • 回答 38

    具体学多久,根据自己的学习力,自律性、解决问题能力来决定若系统性学习,跟着讲师的节奏走,大概半年左右,有专业的讲师把课程进行规划,尽心系统学习,有问题,讲师会帮忙解决,学习的效率很高,避免了自学中出现各种问题解决不了,而耽误很多时间,可能会...

  • 回答 23
    已采纳

    (1)idea启动时会有两个快捷方式,安装完后默认生成在桌面的是32位的idea的快捷方式,如果我们使用这个快捷方式运行大项目,一般都会很卡。解决方法是找到idea的安装目录,然后进入bin文件夹,找到名称为idea64的应用程序,右键他生成桌面快捷方式。以后每次...

  • BIO与NIO、AIO的区别2020-05-19 15:59
    回答 4
    已采纳

    IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、BIO     在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要...

  • Java方法的命名规则2021-04-06 19:07
    回答 31

    ava是一种区分字母的大小写的语言,所以我们在定义变量名的时候应该注意区分大小写的使用和一些规范,接下来我们简单的来讲讲Java语言中包、类、变量等的命名规范。(一)Package(包)的命名Package的名字应该都是由一个小写单词组成,例如com、xuetang9、compan...

  • 回答 2

    public class Point {    private int x;    private int y;    public int getX() {        return x;    }    public void setX(int x) {        this.x = x;    }    public int getY() {        return y;    } ...

  • 回答 6

    经典版单例模式public class Singleton {        private static Singleton uniqueInstance;//利用一个静态常量来记录singleton类的唯一实例。     private Singleton() {     }     public static  Singleton getInstance()...

  • 回答 3

    哈希表的长度一般是定长的,在存储数据之前我们应该知道我们存储的数据规模是多大,应该尽可能地避免频繁地让哈希表扩容。但是如果设计的太大,那么就会浪费空间,因为我们跟不用不到那么大的空间来存储我们当前的数据规模;如果设计的太小,那么就会很容易发...

  • 回答 14

    1. DOM(Document Object Model)        DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才...

  • 回答 19

    1)作用不同: throw用于程序员自行产生并抛出异常; throws用于声明在该方法内抛出了异常2) 使用的位置不同: throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表的后面,不能单独使用。3)内容不同: throw抛出一个异常对象,且只能是...

  • 回答 11

    基本执行过程如下:1)程序首先执行可能发生异常的try语句块。2)如果try语句没有出现异常则执行完后跳至finally语句块执行;3)如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。4)catch语句块可以有多个,分别捕获不同类型...

  • 回答 20

    100-199 用于指定客户端应相应的某些动作。 200-299 用于表示请求成功。 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 400-499 用于指出客户端的错误。 400 语义有误,当前请求无法被服务器理解。 401 当前请求需要用户验证...

  • 回答 16

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译...

没有解决我的问题,去提问