class tran {
public static void main(String[] args) {
ceyan abc = new ceyan();
abc.a = 2;
}
class ceyan {
int a=1;
}
}
在学习面向对象的时候,遇到的一个问题。
如上代码:我在类tran中声明了一个类ceyan
然后在同是tran类的主方法中 调用了ceyan
会抛出异常:
错误:无法从静态上下文中引用非静态
错因:“类ceyan”相当于一个“实例变量”。(实例变量有特性:实例变量包含在一个类内,当某类的对象被创建的时候,该类中的实例变量才可以被使用。)
(同时上句话也有一个需注意的地方:“类”其实也可以被当做“变量”)
但是在主函数main执行的时候,类“tran”还没有被创建,所以tran中的实例变量“ceyan”不可以被使用
于是,根据以上错因,我又写了代码
class tran {
public static void main(String[] args) {
//首先(创建)实例化一个tran对象abc
tran abc=new tran();
//因为“ceyan”这个实例变量包含在tran对象中,故abc可调用ceyan这个实例变量
//用abc.ceyan去实例化一个ceyan对象bbb(还是那句话,只有创建了对象之后才能调用其下的实例变量,但是现在只是实例化了tran,tran中的ceyan还没被实例化出来)
abc.ceyan bbb=new abc.ceyan();
System.out.print(bbb.a);
}
class ceyan {
int a=1;
}
}
然后,又会提示,没有找到“abc程序包”。。。
查阅资料,发现调用类中的类,是应该用以下格式
类名.该类旗下所属的类名();
而非
先实例化类A的一个对象,然后用“对象.类A下的类”去调用类A中的类。。
(和参考资料中的那篇问题写的不太一样)
所以,有以下三种解决方式:
1、
class tran {
public static void main(String[] args) {
//直接实例化一个ctran.ceyan对象
tran.ceyan bbbb=new tran.ceyan();
}
//十分重要:要想 类A.类B,必须把类A中的类B设置成静态的(只有这样才可以直接调用,否则ceyan是一个实例变量,而实例变量是不可以在对象没被实例化出来的情况下直接通过类名调用出来的)
static class ceyan {
int a=1;
}
}
2、
class tran {
public static void main(String[] args) {
ceyan bbbb = new ceyan();
}
}
//把ceyan这个类写在tran外面,这样就可以直接把ceyan对象实例化了。
class ceyan {
int a = 1;
}
3、
class tran {
public static void main(String[] args) {
int bcd = tran.ceyan.a;
}
//直接把ceyan和ceyan这个类下的a变量都设置成静态的
//这样就可以既直接调用tran下的类ceyan,也可以直接调用ceyan类下的变量a了
public static class ceyan {
public static int a = 1;
}
}
初学java:“错误:无法从静态上下文中引用非静态”(在调用类中的类时出现的错误)
最新推荐文章于 2025-03-20 10:54:41 发布