对非静态成员的非法引用_java程序运行静态成员

74e66035939c790a5df1c9132bab91cd.png

1. jvm将.java文件加载到方法区,同时类中的的静态成员加载到方法区附默认值 然后根据在文件中顺序赋初值 静态代码块执行

方法加载到方法区 如果有的静态成员调用方法会执行 main不一定是第一步执行

2. jvm找到程序入口 主方法main()开始执行 main进入栈内存

3. 创建对象 在堆内存中开辟空间 地址值赋值给引用变量 引用变量是存储在栈内存中保存对象的地址值

4. 调用构造方法 构造方法先执行隐藏的代码在执行方法体

5. 隐藏的代码分为三步 1> super()调用父类构造函数可以有参数

2> 非静态成员变量赋值

3> 执行构造代码块 也就是在成员位置的非静态代码块 2和3按照在类中的顺序执行

6. 然后调用对象的成员 方法按照顺序进行 。

7. 最后main执行完 出栈 程序结速

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在一个静态方法内调用一个非静态成员非法的,因为静态方法是属于类的,而非静态成员是属于对象的。在静态方法中无法访问对象的非静态成员,因为静态方法没有this指针,无法确定要访问哪个对象的成员。因此,如果需要在静态方法中访问非静态成员,必须先创建对象,然后通过对象来访问非静态成员。 ### 回答2: 静态方法和非静态成员Java中两个不同的概念。静态方法表示该方法属于类而非实例,也就是说无需实例化对象即可直接使用该方法。而非静态成员则属于类的某个对象,必须通过对象实例才能访问。因此在静态方法内调用非静态成员非法的。 首先,静态方法和非静态成员的内存分配方式不同。静态方法的内存仅被分配一次,并在程序运行时一直存在,可在类初始化时被调用。而非静态成员则需要实例化为对象并分配内存空间使用。如果在静态方法里调用非静态成员,那么运行时无法确定调用到哪个对象的成员,因为非静态成员属于对象而不是类,所以无法在初始化时直接访问。 此外,在静态方法中调用非静态成员可能会造成空指针异常。因为静态方法可以在实例化对象之前被调用,当调用非静态成员时还没有实例化对象或者当前对象为空时,就会出现空指针异常。 综上所述,静态方法和非静态成员作为Java中的两个不同概念,二者的内存分配方式、生命周期和访问方式等都有不同,因而在静态方法内调用非静态成员非法的。如果要在静态方法内访问非静态成员,必须借助于对象实例才能访问。 ### 回答3: 在Java语言中,静态方法是通过类名直接调用的方法,而非静态成员(变量或方法)则是通过对象实例调用的。在静态方法中调用非静态成员非法的,因为在静态方法调用时,还未创建对象实例,也就无法访问非静态成员。 除此之外,在静态方法中无法使用this或super关键字来引用当前对象或父类对象,因为静态方法是不属于任何对象实例的。 如果确实需要在静态方法中访问非静态成员,可以将非静态成员转换为静态成员,或者在静态方法中创建对象实例。但是这种法可能会导致代码不易维护、可读性降低等问题,因此尽量避免在静态方法中调用非静态成员。 总之,在Java中静态方法和非静态成员是分别独立的概念,它们之间没有直接联系,在使用时应该根据不同的情况选择适当的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值