2014-12-03 43 views
0

下面我有在同一个包中的类:为什么我无法使用主方法的引用调用继承的公共方法?

class Roo { 
    public String doRooThings() 
    { 
     return "Rooing!"; 
    } 
} 

class Cloo extends Roo { 
    public static void main(String[] args) 
    { 
     System.out.println(doRooThings()); 
    } 
} 

我得到不能袋鼠错误在执行这个使静态参考来自类型的非静态方法doRooThings()。

但我可以调用doRooThings()方法(而无需与参考前言吧)从公共方法在子类中像下面

class Cloo extends Roo { 
    public void testRoo() 
    { 
     System.out.println(doRooThings()); 
    } 
    public static void main(String[] args) 
    { 
     new Cloo().testRoo(); 
    } 
} 

任何人都可以请让我知道这是如何工作的?

+0

你确实意识到你在第二种情况下创建了一个引用。 “新Cloo()”。你的陈述本身“不必在前言中加引用”在这里是不正确的。也许你的意思是别的? – maheeka 2014-12-03 09:29:38

+0

你的main()是静态的,这意味着它不能访问任何实例变量。也许阅读这将有助于解释什么静态意味着:https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html – kha 2014-12-03 09:30:21

回答

0

在第一种情况下主要方法是静态和方法doRooThings()此非静态方法。在静态方法内部,您不能引用非静态(实例)方法。

但是在第二种情况下,你都能够调用非静态方法testRoo(),因为你在静态环境中创建一个实例。同样,即使在第一种情况下,通过创建例如像下面调用非静态方法:

新的小豆()。doRooThings()new Cloo()。doRooThings()

2

由于main()方法在static上下文中运行。静态意味着你没有这个类的有效实例。这意味着Java不知道调用哪一个实例上...

该方法阅读一些基础知识,例如this explanation

2

main是一个静态方法,为此它不与任何类实例相关联。因此,除非首先创建实例,否则无法调用实例方法(因为它需要与实例关联)。也许你需要阅读更多关于meaning of static

+0

我正在主要方法中创建一个Cloo实例。那么,这是否意味着这个实例将在全班共享? – 2014-12-03 10:22:28

1

因为当你的主要方法是静态的方法doRooThings也不是一成不变的。

首先

在您的主要方法Roo roo = new Roo();创建袋鼠的对象,然后通过roo.doRooThings();

变化称之为你的方法doRooThings()静电,public static void doRooThings();

:您可以通过2个选项调用doRooThings

附加

如果w e创建一个静态方法或静态实例变量,这意味着它由该类拥有。

new Cloo().testRoo();你可以调用testRoo()方法,因为你由具有new关键字创建Cloo类的新实例。它是同我的第一个建议的,唯一的区别是我的第一个建议,我创建Roo类的新实例,并将其参考roo

相关问题