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是一个静态成员属性,可以直接访问
}
}
我们可以发现,上面的问题被解决了。
小结:在静态方法中可以直接访问静态属性,对于动态属性必须要进行实例化,然后通过具体的对象来访问相对应的属性
ERROR无法从静态上下文中引用非静态变量的更多相关文章
- 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例
内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { cl ...
- C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性
http://www.cnblogs.com/bluestorm/p/3432190.html 问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 下面代码出错的原因,在类中定义的字段为什么不 ...
- C# static 字段初始值设定项无法引用非静态字段、方法或属性
问题:字段或属性的问题字段初始值设定项无法引用非静态字段.方法 下面代码出错的原因,在类中定义的字段为什么不能用? public string text = test(); //提示 字段或属性的问题 ...
- C# 字段初始值无法引用非静态字段、方法或属性( 类内部变量初始化)
问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 在类中 变量赋值其他变量报错? public class TestClass{ public TestClass() { } pu ...
- Java 中的静态嵌套类和非静态嵌套类
Java 中的静态嵌套类和非静态嵌套类 术语:嵌套类分为两类:静态嵌套类和非静态嵌套类.声明 static 的嵌套类称为静态嵌套类,非静态嵌套类也称为内部类. class OuterClass { p ...
- JAVA程序执行顺序(静态代码块》非静态代码块》静态方法》构造函数)
总结:静态代码块总是最先执行. 非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行. 父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非 ...
- java中静态代码块,非静态代码块,构造函数
关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会 ...
- Java静态代码块与非静态代码块
静态代码块,格式是 static{ },随着类的加载而加载,且只执行一次. 在程序中,执行的优先级最高. 非静态代码块,格式是{ },在创建对象的时候运行(即new一个对象的时候),每创建一次对象就执 ...
- Java中静态变量、静态代码块、非静态代码块以及静态方法的加载顺序
在研究单例设计模式的时候,用到了静态变量和静态方法的内容,出于兴趣,这里简单了解一下这四个模块在类初始化的时候的加载顺序. 经过研究发现,它们的加载顺序为: 1.非静态代码块 2.静态变量或者静态代码 ...
随机推荐
- apache+php 字符编码问题解决
如果你在网上搜索 “apache配置”,搜到的页面大多都会建议你在httpd.conf中加上这么一句:AddDefaultCharset GB2312.对于新手而且是只用GB2312编码的开发人来说, ...
- Python程序员不完全指南
Python 基础 Python基础 基础数据类型 深浅copy 文件操作 函数 初识函数 函数进阶 装饰器函数 迭代器和生成器 各种推导式 递归函数 内置函数和匿名函数 异常处理 常用模块 模块和包 ...
- device-independent bitmap (DIB) 设备无关位图
设备无关位图即独立于设备的位图(DIB)与"Device-Dependent Bitmaps (DDB) 设备相关位图"相比,它不再依赖于具体的设备,从而更适合在不同的计算机之间传 ...
- FairyGUI编辑器制作Unity3D UI值得借鉴
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- Python自定义大小截屏
蝈蝈这两天正忙着收拾家当去公司报道,结果做PHP的发小蛐蛐找到了他,说是想要一个可以截图工具. 大致需要做出这样的效果. 虽然已经很久不写Python代码了,但是没办法,盛情难却啊,只好硬着头皮上了. ...
- UICollectionView功能使用
UICollectionView在2012年被提出,已经不是什么新技术了,在此只是做一下简单的实现. 集合视图:UICollectionViewUICollectionView和UITableView ...
- pymysql中的参数及方法
1.connect(参数) Connection = Connect(*args, **kwargs) Establish a connection to the MySQL database. Ac ...
- 【测试技术】websocket-client
Websocket Client 继续上周的议题.因为我不会写go,不会写websocket客户端,导致整个测试过程我是个完美的酱油党.上周我终于把客户端服务写好了. 选择Websokcet框架 现在 ...
- java 输入输出流 关于InputStream 和 OutputSteam 实现文本一行一行读入和 文本一行一行输出
对 byte 有了新的认知:byte表示一个字节 因此他可以表示成 一个 数字: 一个数字可以映射成一个字符:InputStream 中的 read() 函数 的意思是读入一个整数,读入一个整数的 ...
- stm32寄存器版学习笔记02 串口通信
stm32F103RCT6提供5路串口.串口的使用,只要开启串口时钟,设置相应的I/O口的模式,然后配置下波特率.数据位长度.奇偶校验等信息,即可使用. 1.串口的配置步骤 ①串口时钟使能 APB2外 ...