初学java:“错误:无法从静态上下文中引用非静态”(在调用类中的类时出现的错误)

来源:互联网 发布:尚学堂大数据2017 编辑:程序博客网 时间:2024/06/05 08:30

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;

    }

}

 


阅读全文
0 0