黑马程序员技术交流社区

标题: 判断题 [打印本页]

作者: lvwenwen88    时间: 2012-2-7 12:58
标题: 判断题
本帖最后由 lvwenwen88 于 2012-2-7 15:43 编辑

public class Something {
     public static void main(String[] args) {
        Something s = new Something();
        System.out.println("s.doSomething() returns " + doSomething());
    }
    public String doSomething() {
        return "Do something ...";
    }
}

作者: lvwenwen88    时间: 2012-2-7 12:58
请问上面有什么错,为什么
作者: 何洪森    时间: 2012-2-7 13:30
运行结果已经很明确了:
Something.java:4: 无法从静态上下文中引用非静态 方法 doSomething()
        System.out.println("s.doSomething() returns " + doSomething());
静态方法中只能调用静态方法,不能调用非静态方法,如果要想调用非静态方法,则
必须用该类的对象去调用。main方法是一个静态方法当然不能直接调用非静态的doSomething()
方法了,而你用s能调用是因为s是Something类的实例对象。
作者: 黑马唐浩    时间: 2012-2-7 13:44
静态的可以访问静态的,非静态的可以都访问。
作者: 王_涛    时间: 2012-2-7 13:45
错误发生在System.out.println("s.doSomething() returns " + doSomething());
doSomething()是非静态方法,在main静态方法中不能被访问doSomething()方法

改成s.doSomething()即可:
System.out.println("s.doSomething() returns " + s.doSomething());

作者: 吴璞玉    时间: 2012-2-7 13:45
主函数为静态函数,doSomething()函数是非静态函数,无法直接调用此类非静态函数
作者: 王文龙    时间: 2012-2-7 13:59
楼主不要被方法的名字弄混了啊,
要冷静分析哦.

就是静态方法不能调用非静态方法的问题啊.
作者: 李泽霖    时间: 2012-2-7 14:03
明显是静态的无法调用非静态的,非静态无法调用静态的,记住这个就可以了
作者: 林铁柱    时间: 2012-2-7 14:12
System.out.println("s.doSomething() returns " + doSomething());这一行在编译时发生错误:
有以下两种修改方法:
1、将
public String doSomething() {
        return "Do something ...";
}
修改为
public static String doSomething() {
        return "Do something ...";
}
2、将
System.out.println("s.doSomething() returns " + doSomething());中的doSomething()修改为s.doSomething()
原因为:
静态方法中只能调用静态方法,不能调用非静态方法,如果要想调用非静态方法,就
只能由该类的对象去调用。

作者: 秦碧    时间: 2012-2-7 14:28
李泽霖 发表于 2012-2-7 14:03
明显是静态的无法调用非静态的,非静态无法调用静态的,记住这个就可以了 ...

静态方法只能调用静态方法;
非静态方法既可以调用静态方法,也可以调用非静态方法
作者: 魏腾飞    时间: 2012-2-7 15:22
public class Something {
     public static void main(String[] args) {
        Something s = new Something();
        System.out.println("s.doSomething() returns " + doSomething());//在main这个静态方法中引用了非静态方法。静态方法只能引用静态成员

    }
    public String doSomething() {
        return "Do something ...";
    }
}
  可以将该题目改正:
1.就作者本身做法而言,可以利用对象 s进行应用改为:
System.out.println("s.doSomething() returns " +s.doSomething());
2.利用本身类名创建匿名对象引用:
     public static void main(String[] args) {
        Something s = new Something();//去掉此句
        System.out.println("s.doSomething() returns " + new Something().doSomething());
    }

3.将被引用的doSomething方法改为静态方法:
    public static String doSomething() {
        return "Do something ...";
    }
4.将被引用方法改为静态后,在对输出语句修改,直接改为类名调用静态方法名():

System.out.println("s.doSomething() returns " + Something.doSomething());






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2