关于static方法、类的实例化的两点困惑
1.一个困扰半天的问题
问题描述:今天下午在写一个图形类的相关问题时,程序报错,无法实例化该类,具体代码如下:
public class test {
public static void main(String[] args) {
Ecircle c = new Ecircle();//报错:没有任何类型 test 的外层实例可访问。必须用类型 test 的外层实例
c.area();
Erectangle b = new Erectangle();
b.area();
}
abstract class Eshape {
abstract public void area();
public void pri(double s) {
System.out.println("图形的面积为" + s);
};
}
class Erectangle extends Eshape {
int a = 3, b = 4;
double s;
public void area() {
s = 3 * 4;
pri(s);
}
}
class Ecircle extends Eshape {
int r = 3;
double s;
public void area() {
s = r * r * 3.14;
pri(s);
}
}
}
2.问题分析
经过我的数次尝试,发现将三个内部类Eshape、Erectangle、Ecircle置于类test之外时(写在同一个class.文件中或者分别写在四个.class文件中),程序不会报错。经过仙仙的指导,我才明白自己对两个概念存在误区:
1.static类调用本类中的成员只能调用静态成员,上图中的main方法为static方法,无法直接调用内部非静态类Ecircle的对象实体new eCircle(),故需要先实例化test,然后通过test.new eCircle()调用非静态类Ecircle的对象实体new eCircle();代码如下:
public class test {
public static void main(String[] args) {
test test = new test();
Ecircle c = test.new Ecircle();
c.area();
Erectangle b = test.new Erectangle();
b.area();
}
abstract class Eshape {
abstract public void area();
public void pri(double s) {
System.out.println("图形的面积为" + s);
};
}
class Erectangle extends Eshape {
int a = 3, b = 4;
double s;
public void area() {
s = 3 * 4;
pri(s);
}
}
class Ecircle extends Eshape {
int r = 3;
double s;
public void area() {
s = r * r * 3.14;
pri(s);
}
}
}
2.static的作用域是本类,比如“static类只能调用static类成员”对于其他外部类不作限定,代码如下:
public class test {
public static void main(String[] args) {
Ecircle c = new Ecircle();//可正常创建new Ecircle对象
c.area();
Erectangle b = new Erectangle();
b.area();
}
}
abstract class Eshape {
abstract public void area();
public void pri(double s) {
System.out.println("图形的面积为" + s);
};
}
class Erectangle extends Eshape {
int a = 3, b = 4;
double s;
public void area() {
s = 3 * 4;
pri(s);
}
}
class Ecircle extends Eshape {
int r = 3;
double s;
public void area() {
s = r * r * 3.14;
pri(s);
}
}
3.实例化对象时,JAVA虚拟机(JVM)会去找对应的 类名.class文件,而如果是内部类的话,并不会生成 类名.class文件,则需要通过实例化外部类后间接访问内部类。
3.总结
感谢一波仙仙,硬是给👴讲懂了
几篇还没来得及看的文章:
https://zhuanlan.zhihu.com/p/112001357
https://blog.csdn.net/lm1060891265/article/details/80766493
https://www.funtl.com/zh/interview/
存个聊天记录,怕清个内存没了。听过来人讲就很有收获:
碎觉碎觉~~🐕名要紧