Java出现No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing

本文通过一个具体的Java编程实例,详细解释了在Java中如何正确地使用内部类和静态方法。当尝试从静态上下文中访问非静态内部类时,会遇到编译错误。文章提供了将内部类修改为静态类的解决方案,并附带了完整的代码示例。

最近在看Java,在编译写书上一个例子时,由于书上的代码只有一部分,于是就自己补了一个内部类。结果编译时出现:No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing instance of type E(e.g.  x.new A() where x is an instance of E). E指代我写的那个内部类。

根据提示,没有可访问的内部类E的实例,必须分配一个合适的内部类E的实例(如x.new A(),x必须是E的实例。)看着这句提示,我就纳闷了,我已经用new实例化了这个类,为什么还不行呢。

于是百度谷歌了一下相关资料。原来我写的内部类是动态的,也就是开头以public class开头。而主程序是public static class main。在Java中,类中的静态方法不能直接调用动态方法。只有将某个内部类修饰为静态类,然后才能够在静态类中调用该类的成员变量与成员方法。所以不做其他变动的情况下,最简单的解决办法是将新写的类的public class改为public static class.

 

package jave;

public class Point {
	private double x;
	private double y;
	Point(double x1, double y1){
		x = x1;
		y = y1;
	}
	public double getX() {
		return x;
	}
	public double getY() {
		return y;
	}
	public void setX(double i) {
		x = i;
	}
	public void setY(double i) {
		y = i;
	}
	
	
public static class Circle{
		private Point o;//圆心
		private double radius;//半径
		//构造函数
		Circle(Point p, double r) {
			o = p;
			radius = r;
		}
		//构造函数的重载
		Circle(double r) {
			o = new Point(0.0, 0.0);//初始化圆心在原点
			radius = r;
		}
		//判断该点在不在圆里
		boolean contains(Point p) {
			double x = p.getX() - o.getX();
			double y = p.getY() - o.getY();
			if((x*x + y*y) > radius*radius)
				return false;
			else 
				return true;
		}
		public void setO(double x, double y) {
			o.setX(x);
			o.setY(y);
		}
		public Point getO() {
			return o;
		}
		public double getRadius() {
			return radius;
		}
		public void setRadius(double r) {
			radius = r;
		}
		public double area() {
			return 3.14 * radius *radius;
		}
	}
	
	
	
	public static void main(String[] args) {
		Circle c1 = new Circle(new Point(1.0, 2.0), 2.0);
		Circle c2 = new Circle(5.0);
		System.out.println("c1:(" + c1.getO().getX() + "," + c1.getO().getY() + ")," + c1.getRadius());
		System.out.println("c2:(" + c2.getO().getX() + "," + c2.getO().getY() + ")," + c2.getRadius());
		System.out.println("c1 area = " + c1.area());
		System.out.println("c2 area = " + c2.area());
		c1.setO(5, 6);
		c2.setRadius(9.0);
		System.out.println("c1:(" + c1.getO().getX() + "," + c1.getO().getY() + ")," + c1.getRadius());
		System.out.println("c2:(" + c2.getO().getX() + "," + c2.getO().getY() + ")," + c2.getRadius());
		System.out.println("c1 area = " + c1.area());
		System.out.println("c2 area = " + c2.area());
		
		
		Point p1 = new Point(5.2, 6.3);
		System.out.println(c1.contains(p1));
		System.out.println(c1.contains(new Point(10.9, 9.0)));

	}

}

即将public class Circle 改为public static class Circle, public void main(String[] args)改为public static void main(String[] args)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金州饿霸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值