Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
静态方法和非静态方法的区别与联系_Java各种类的区别,希望能够帮助你!!!。
最近在写JAVA程序的时候报了一个错。
No enclosing instance of type FileRead is accessible. Must qualify the allocation with an enclosing instance of type FileRead。翻译一下,大致意思就是:无法访问FileRead类型的封闭实例。必须使用FileRead类型的封闭实例限定分配。
一、出错原因
我们先来来看一下具体代码
//构建一个文件读取的类 public class FileRead { static int size=50; public static int length() { return size; } public static class Node { int data; //节点的构造函数 public Node(int data) { this.data=data; } } public static void main(String[] argd) { //静态类测试 Node nodea=new Node(1); Node nodeb=nodea; System.out.println("a="+nodea.data+" b="+nodeb.data); nodeb.data=2; System.out.println("a="+nodea.data+" b="+nodeb.data); //类的静态方法测试 //类名调用 int len1=FileRead.length(); System.out.println(len1); //直接调用 int len2=length(); System.out.println(len2); //对象调用 FileRead fr=new FileRead(); int len3=fr.length(); System.out.println(len3); } }
这里我试图在主函数函数中直接调用类FileRead的一个Node类属性来实例化Node类的对象。这显然是不可以的,因为这个Node属性只有在FileRead类的对象被创建时,它才会生成,当这个对象消失时,这个类属性自然也就消失了。然而在主函数中我们可以看到,我们并没有实例化FileRead的对象,就直接去使用FileRead的类属性,当然是不允许的。
解决方案:为Node节点类加上一个static的关键字,将其定义为FileRead类的静态方法。也就是public static class Node{}
二、静态方法和非静态方法的区别
1.生命周期不同。静态方法的生命周期跟相应的类一样长,静态方法和静态数据成员会随着类的定义而被分配和装载入内存中。一直到线程结束,静态属性和方法才会被销毁。而非静态方法的生命周期和类的实例化对象一样长,只有当类实例化了一个对象,非静态方法才会被创建,而当这个对象被销毁时,非静态方法也马上被销毁。
2.调用方式。静态方法可以直接调用,类名调用和对象调用。但是非静态方法只能通过对象调用。
三、注意点
1.非静态方法既可以访问静态数据成员 又可以访问非静态数据成员,而静态方法只能访问静态数据成员; 非静态方法既可以访问静态方法又可以访问非静态方法,而静态方法只能访问静态方法。
2.static修饰的静态属性和方法是为所有类所共享的。因此任何一个地方对静态数据的更改都会影响到其他类和对象。
四、静态函数的调用方法
1.类名调用
//类名调用 int len1=FileRead.length(); System.out.println(len1);
2.实例化对象调用
//对象调用 FileRead fr=new FileRead(); int len3=fr.length(); System.out.println(len3);
3.直接调用
//直接调用 int len2=length(); System.out.println(len2);
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。