No enclosing instance of type testmain is accessible. Must qualify the allocation with an enclosing instance of type testmain (e.g. x.new A() where x is an instance of testmain).
出错的原因:main函数是静态的,不能调用动态的内部类。
出错的代码如下:
package testpackeg;
public class testmain {
abstract class Computer
{
public abstract void use();
}
class Windows extends Computer
{
@Override
public void use()
{
System.out.println("windows");
}
}
class Linux extends Computer
{
public void use()
{
System.out.println("linux");
}
}
class Person
{
Computer com;
void useMyComputer()
{
com.use();
}
}
public static void main(String[] args)
{
Computer w=new Windows();
Computer l=new Linux();
Person p1=new Person();
p1.com=w;
Person p2=new Person();
p2.com=l;
p1.useMyComputer();
p2.useMyComputer();
}
}
第一种解决方法:
把内部类改为外部类。内部类是指定义在一个类中的类。在出错代码中,computer、windows都定义在了testmain类中。将这些类挪出去就行了。
修改后的代码
package testpackeg;
abstract class Computer
{
public abstract void use();
}
class Windows extends Computer
{
@Override
public void use()
{
System.out.println("windows");
}
}
class Linux extends Computer
{
public void use()
{
System.out.println("linux");
}
}
class Person
{
Computer com;
void useMyComputer()
{
com.use();
}
}
public class testmain {
//把原来在这里定义的类挪走了
public static void main(String[] args)
{
Computer w=new Windows();
Computer l=new Linux();
Person p1=new Person();
p1.com=w;
Person p2=new Person();
p2.com=l;
p1.useMyComputer();
p2.useMyComputer();
}
}
第二种解决方法:
在定义的类前面加上static,将动态内部类变成静态的。
package testpackeg;
public class testmain {
abstract static class Computer//前面加了abstract修饰
{
public abstract void use();
}
static class Windows extends Computer
{
@Override
public void use()
{
System.out.println("windows");
}
}
static class Linux extends Computer
{
public void use()
{
System.out.println("linux");
}
}
static class Person
{
Computer com;
void useMyComputer()
{
com.use();
}
}
public static void main(String[] args)
{
Computer w=new Windows();
Computer l=new Linux();
Person p1=new Person();
p1.com=w;
Person p2=new Person();
p2.com=l;
p1.useMyComputer();
p2.useMyComputer();
}
}
文章讨论了在Java编程中遇到的一个错误,即在静态main方法中尝试创建非静态内部类的实例。错误原因是main方法是静态的,无法直接访问非静态成员。文章提供了两种解决方案:一是将内部类移出外部类,成为外部类;二是将内部类声明为静态内部类。这两种方法都能解决问题,允许在main方法中创建和使用这些类的实例。
331

被折叠的 条评论
为什么被折叠?



