zoukankan      html  css  js  c++  java
  • 静态动态的问题

    Cannot make a static reference to the non-static field

    静态方法中不能引用非静态成员变量及方法

    1 class A {
    2     private int a = 1;
    3 
    4     public sttaic void main(String[] args){
    5         System.out.println(a);
    6     }
    7 }

    因为实例变量应该是具体对象的状态,应该先A a =  new A();然后System.out.println(a,a);

    或者将变量改为static

    No enclosing instance of type EventApp4 is accessible. Must qualify the allocation with an enclosing instance of type EventApp4 (e.g. x.new A() where x is an instance of EventApp4).

    原因:内部类没有用static限定,所以是动态的,而我在main函数中new了这个内部类。为什么这样就出现问题了呢,因为静态的方法以及变量在类加载之时就已经进入内存了,但是非静态的方法和变量只能在实例化之后才会进入内存,所以在静态方法中new非静态的内部类就会出错,因为此时这个内部类还不存在呢。反之,在动态方法中new静态方法是不会出现错误的,原因同样,静态的在非静态的之前就已经存在了。

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

    遇到遇上问题时,有以下原则

    1.在main中,使用静态方法静态变量静态类,即将变量、方法都限定为static

    2.在main中,实例化本类或其他类(要使用的类)

    3.将main中的语句放进构造函数中,在main中实例化本类,因为构造函数中可以使用本类的引用this

  • 相关阅读:
    最近碰到的一些问题
    CF #365 703D. Mishka and Interesting sum
    CF 690C3. Brain Network (hard) from Helvetic Coding Contest 2016 online mirror (teams, unrated)
    Mac Hadoop的安装与配置
    pyenv的安装和使用
    tmux简要介绍
    将本地的项目通过SVN还原到某一版本,并将SVN服务器上的项目也还原到这一版本
    Tomcat7解决中文乱码
    解决tomcat7控制台中文乱码问题
    JDK环境变量配置,实现多个版本的JDK环境变量任意切换配置(Windows7 / Windows10 )
  • 原文地址:https://www.cnblogs.com/anqiang1995/p/7531697.html
Copyright © 2011-2022 走看看