zoukankan      html  css  js  c++  java
  • ERROR无法从静态上下文中引用非静态变量

    分类: Java

    什么是“static”?

    学习过java、C++或C的人都应该认识这个关键字。用这个关键字修饰的变量叫做静态变量,有其特殊的作用。在java中static也用来修饰静态方法和静态内部类。

    静态变量的特点:

    (1)生存周期:静态局部变量的生存周期也是整个源程序。当定义整个变量的函数结束时,整个变量并没有消失,他始终是存在的。

    (2)作用域:作用域与自动变量是一样的,只能在定义其的子函数中使用,当退出改函数时,整个变量虽然还是继续存在的,但是,已经不可以再使用它了。

    (3)整个静态变量如果没有赋初值,则默认为0.

    (4)在面向对象的编程语言JAVA中,对于静态变量,在没有实例化对象的情况下,也是可以直接使用的。(说明:这个特点特别适合用来定义一些常量,类似于C语言呢中的宏定义。例如:public static final double Pi=3.14;)

    静态方法特点:

    (说明:这边的静态方法也可以说成是静态函数)

    (1)不需要实例化对象,就可以直接使用的方法(函数)。

    (2)这个方法只可以访问这个类中的静态成员属性。

    (3)在java中,如果要在静态方法中,访问动态成员属性,那么首先要在这个方法中进行实例化,然后通过具体的对象来访问。

    小结:其实在静态方法中,都是要访问已经存在于内存空间的数据,比如静态数据,这个与对象无关,只要用到这个类,它就是存在的,无需初始化,是所有对象共同拥有的且只有一个副本。而动态的成员,必须要经过实例化,而且每个对象,都有一个副本,且所占内存地址不相同,所以在静态方法访问动态之前,要进行实例化。

     

    什么时候要用到静态域(静态属性)和静态方法?

    (1)如果一个方法要在项目启动的时候就运行,那么这个时候就一定要使用静态方法。最常见的例子就是main方法,这个方法要在实例化之前就开始运行了,所以必须要是静态方法。

    (2)对于要像C语言中那样,宏定义一个常量,就要用静态变量。

    (3)当一个变量要被多处共享的时候,这个时候最好用静态变量。

    (4)当一个方法要被反复的使用的时候,最好用静态方法。

     

    下面我就用具体的实例来说明:

    import java.util.*;

     

    public class A{

    final String name="First";

    public static final double Pi=3.14;

    public static void main(String[] args){

    // A a=new A();

    System.out.println("It is ok!");

    System.out.println(name);

    }

    void AA(){

    System.out.println("I am A.");

    System.out.println(name);

    }

    }

    这段程序是报错的,错误是“无法从静态上下文中引用非静态变量”,你一眼就可以看出来,是在static void main 中访问了动态的数据成员。我们知道,我们在定义类的时候必须要对类进行初始化,但是这个是为什么呢?因为在初始化的过程中,会对类中的动态属性成员进行初始化赋值。

    那么我们该如何修改上面的错误呢,我们借助上面的思想,可以想象一下如果我们对这个类进行实例化,是不是就可以通过对象来访问这个动态的属性。

    import java.util.*;

     

    public class A{

    final String name="First";

    public static final double Pi=3.14;

    public static void main(String[] args){

    A a=new A();

    System.out.println("It is ok!");

    System.out.println(a.name);

    a.AA();

    }

    public static void AA(){

    System.out.println("I am A.");

    System.out.println(Pi);//这个Pi是一个静态成员属性,可以直接访问

    }

    }

    我们可以发现,上面的问题被解决了。

    小结:在静态方法中可以直接访问静态属性,对于动态属性必须要进行实例化,然后通过具体的对象来访问相对应的属性

  • 相关阅读:
    Spring配置文件命名空间
    JSTL之数字、日期格式化<fmt:formatNumber/>、<fmt:formatDate/>
    获取真实ip
    DES
    MD5
    手动导入maven包
    windows下redis主从复制设置
    linux系统上传图片读取权限设置
    linux系统项目查看进程
    linux上服务起的很慢解决方式
  • 原文地址:https://www.cnblogs.com/lubocsu/p/5061280.html
Copyright © 2011-2022 走看看