A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lvwenwen88 黑马帝   /  2012-2-7 12:58  /  2487 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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 ...";
    }
}

10 个回复

倒序浏览
请问上面有什么错,为什么
回复 使用道具 举报
运行结果已经很明确了:
Something.java:4: 无法从静态上下文中引用非静态 方法 doSomething()
        System.out.println("s.doSomething() returns " + doSomething());
静态方法中只能调用静态方法,不能调用非静态方法,如果要想调用非静态方法,则
必须用该类的对象去调用。main方法是一个静态方法当然不能直接调用非静态的doSomething()
方法了,而你用s能调用是因为s是Something类的实例对象。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
静态的可以访问静态的,非静态的可以都访问。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
错误发生在System.out.println("s.doSomething() returns " + doSomething());
doSomething()是非静态方法,在main静态方法中不能被访问doSomething()方法

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

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
主函数为静态函数,doSomething()函数是非静态函数,无法直接调用此类非静态函数
回复 使用道具 举报
楼主不要被方法的名字弄混了啊,
要冷静分析哦.

就是静态方法不能调用非静态方法的问题啊.
回复 使用道具 举报
明显是静态的无法调用非静态的,非静态无法调用静态的,记住这个就可以了
回复 使用道具 举报
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:42
10#
李泽霖 发表于 2012-2-7 14:03
明显是静态的无法调用非静态的,非静态无法调用静态的,记住这个就可以了 ...

静态方法只能调用静态方法;
非静态方法既可以调用静态方法,也可以调用非静态方法
回复 使用道具 举报
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());

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马