JAVA学习【2】错误:无法从静态上下文中引用非静态
2016-01-06 15:34
387 查看
编程时遇到“错误:无法从静态上下文中引用非静态”。
输出10到20的数字,程序如下:
编译报错:
分析:
main函数是静态函数,在runoob.com上查看修饰符static含义,如下
静态变量:
Static关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被成为类变量。局部变量能被声明为static变量。
静态方法:
Static关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
对类变量和方法的访问可以直接使用classname.variablename和classname.methodname的方式访问。
静态方法不能使用类的非静态变量,因为静态方法在程序一开始就可以直接通过类调用,不需要对象实例化就可以访问。
而程序中count是一个实例变量。
实例变量声明在一个类中,但在方法、构造方法和语句块之外;
当一个对象被实例化之后,每个实例变量的值就跟着确定;
实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
实例变量可以声明在使用前或者使用后;
访问修饰符可以修饰实例变量;
实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。
由上可知,实例变量count在对象创建时才会创建,而程序中,并未创建对象。
针对以上问题
方法1、将count放到main函数中
方法2、创建对象,调用对象的实例变量
方法3、将count更改成静态变量
输出10到20的数字,程序如下:
public class MyCode1{ int count=10; public static void main(String args[]){ while(count<=20){ System.out.println(count); count++; } } }
编译报错:
E:\CS码农知识学习\mycode\MyCode1.java:5: 错误: 无法从静态上下文中引用非静态 变量 count while(count<=20){ ^ E:\CS码农知识学习\mycode\MyCode1.java:6: 错误: 无法从静态上下文中引用非静态 变量 count System.out.println(count); ^ E:\CS码农知识学习\mycode\MyCode1.java:7: 错误: 无法从静态上下文中引用非静态 变量 count count++; ^ 3 个错误
分析:
main函数是静态函数,在runoob.com上查看修饰符static含义,如下
Static修饰符
静态变量:Static关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被成为类变量。局部变量能被声明为static变量。
静态方法:
Static关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
对类变量和方法的访问可以直接使用classname.variablename和classname.methodname的方式访问。
静态方法不能使用类的非静态变量,因为静态方法在程序一开始就可以直接通过类调用,不需要对象实例化就可以访问。
而程序中count是一个实例变量。
实例变量
实例变量声明在一个类中,但在方法、构造方法和语句块之外;当一个对象被实例化之后,每个实例变量的值就跟着确定;
实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
实例变量可以声明在使用前或者使用后;
访问修饰符可以修饰实例变量;
实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。
由上可知,实例变量count在对象创建时才会创建,而程序中,并未创建对象。
针对以上问题
方法1、将count放到main函数中
public class MyCode1{ public static void main(String args[]){ int count=10; while(count<=20){ System.out.println(count); count++; } } }
方法2、创建对象,调用对象的实例变量
public class MyCode1{ int count=10; public static void main(String args[]){ MyCode1 code1 = new MyCode1(); while(code1.count<=20){ System.out.println(code1.count); code1.count++; } } }
方法3、将count更改成静态变量
public class MyCode1{ static int count=10; public static void main(String args[]){ while(count<=20){ System.out.println(count); count++; } } }
相关文章推荐
- 在myeclipse中 移动多行代码
- Java并发编程:并发基础概念
- MyEclipse 快捷键大全(@Hcy)
- Spring 源码
- 性能分析工具之-- Eclipse Memory Analyzer tool(MAT)(三)
- Java——继承
- java:POI导出excel
- 性能分析工具之-- Eclipse Memory Analyzer tool(MAT)(二)
- 性能分析工具之-- Eclipse Memory Analyzer tool(MAT)(一)
- Java并发
- java Socket 获取本地主机ip
- Java——属性接口返回json数据
- 使用Java对文件或文件夹的压缩, 解压, 加密和解密
- 多线程基础及实例(java)
- eclipse 重新关联源码方式
- java 并发编程
- Java ——基础之继承与接口的区别
- java反射讲解实例
- JDK中rt.jar、tools.jar和dt.jar的理解
- Spring学习总结(6)——Spring之核心容器bean