关于static方法、类的实例化的三点困惑

关于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/

存个聊天记录,怕清个内存没了。听过来人讲就很有收获:
在这里插入图片描述
在这里插入图片描述

碎觉碎觉~~🐕名要紧

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值