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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑才熹 中级黑马   /  2013-4-22 15:44  /  1787 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑才熹 于 2013-4-23 10:12 编辑

这串代码编译时失败,原因是 “无法从静态上下文中引用非静态 方法 getMaxValue(int,int)”。我是初学者,对静态和非静态还不是很理解。望高手详解,谢谢!
  1. public class  MaxDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.         int        a = 5,b = 8;
  6.                 int max;
  7.                 max = getMaxValue(a,b);
  8.                 System.out.println("最大值是"+max);
  9.         }
  10.     public  int getMaxValue(int value1,int value2)
  11.         {
  12.         if (value1 > value2)
  13.                         return value1;
  14.                 else
  15.                     return value2;
  16.         }
  17. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

16 个回复

倒序浏览
把public  int getMaxValue(int value1,int value2)改成public  static int getMaxValue(int value1,int value2)就可以了,

因为静态成员的生命周期要比非静态成员要长,所以非静态成员可以引用静态成员,静态成员不可以引用非静态成员,

类加载时,内存中就已有静态成员了,此时没有new ,就没有非静态成员,所以静态成员不可以引用非静态成员.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
静态只能访问静态的.....
你把getmaxValue加上static编译过去了
静态的东西是优先于实例对象存在的
也就是随着类的加载而加载使命周期比较长
而非静态的东西是随着对象的创建而却创建的
当你用静态的东西去访问非静态的东西时候
相当于你去访问一个还没有存在的东西
所以编译器就会提示错误
希望对你有帮助
不懂得话。。。
可以在论坛里面找找相关的帖子

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
刘胜寒 发表于 2013-4-22 15:55
静态只能访问静态的.....
你把getmaxValue加上static编译过去了
静态的东西是优先于实例对象存在的

这里的max是静态的?是因为主函数里面的static吗?
回复 使用道具 举报
java程序在运行之前要先编译,静态方法在编译器就存放在了方法区内,而非静态方法此时还没有进栈,所以java虚拟机在编译的时候找不到该方法,所以报错。
其实关于static的问题,你都可以理解成为生命周期的问题,活的长的不能调用活的短的,因为还没等调用呢就挂了,虚拟机无法执行程序,而静态方法的生命周期
显然要比非静态的长,所以是无法调用非静态方法的。将代码改为:
public class  MaxDemo

{

        public static void main(String[] args)
        {

        int  a = 5,b = 8;

                int max;

                max = getMaxValue(a,b);

                System.out.println("最大值是"+max);

        }

    public  static int getMaxValue(int value1,int value2)

        {

        if (value1 > value2)

                        return value1;

                else

                    return value2;

        }

}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
杨同旺 发表于 2013-4-22 15:51
把public  int getMaxValue(int value1,int value2)改成public  static int getMaxValue(int value1,int va ...

谢谢!如果用new的话,应该怎么改?
回复 使用道具 举报
晓风妮子 发表于 2013-4-22 16:08
java程序在运行之前要先编译,静态方法在编译器就存放在了方法区内,而非静态方法此时还没有进栈,所以java ...

学习了,谢谢!
回复 使用道具 举报
郑才熹 发表于 2013-4-22 16:07
这里的max是静态的?是因为主函数里面的static吗?

...
因为你的getMaxValue是类的成员函数
而你的主函数main 也是的类的成员函数
只是main比较特殊而已,jvm的执行程序的入口而已
静态方法必须要访问被静态修饰的变量或者函数
不是说max是静态的
回复 使用道具 举报
首先静态有两种访问的方式,一种是直接用类名调用,一种是创建该类的对象,只用对象进行调用。而静态访问非静态的要创建该类的对象调用才可以的,静态可以直接访问静态的,也可以使用类名.静态的成员。
静态优先于对象存在,它是属于类,所以不能直接访问。静态是随着类的加载而加载的,生命周期较长的,而非静态的是随着对象的创建而创建的,生命周期相比较短。
所以可以进行一下两种方式,都是可以的。
  1. public class  MaxDemo

  2. {

  3.         public static void main(String[] args)

  4.         {

  5.         int        a = 5,b = 8;
  6.                int max;
  7.                            //创建对象也就是new访问
  8.                            MaxDemo ma=new MaxDemo();
  9.                 max = ma.getMaxValue(a,b);
  10.                                 //第二种方式静态访问静态的
  11.                                 //max = MaxDemo.getMaxValue(a,b);//或者是max = getMaxValue(a,b);
  12.                 System.out.println("最大值是"+max);

  13.         }
  14.         //可以在public后面加上static对应的是上面的第二种访问方式
  15.     public  int getMaxValue(int value1,int value2)

  16.         {

  17.         if (value1 > value2)

  18.                         return value1;

  19.                 else

  20.                     return value2;

  21.         }

  22. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
刘胜寒 发表于 2013-4-22 16:15
...
因为你的getMaxValue是类的成员函数
而你的主函数main 也是的类的成员函数

嗯,明白了。谢谢!
回复 使用道具 举报
Just_Only 发表于 2013-4-22 16:35
首先静态有两种访问的方式,一种是直接用类名调用,一种是创建该类的对象,只用对象进行调用。而静态访问非 ...

Thankyou!
回复 使用道具 举报
郑才熹 发表于 2013-4-22 16:38
Thankyou!

不客气 帮到你就好
回复 使用道具 举报
刘胜寒 发表于 2013-4-22 15:55
静态只能访问静态的.....
你把getmaxValue加上static编译过去了
静态的东西是优先于实例对象存在的

你说错了吧,静态不能访问非静态的么?
回复 使用道具 举报
前面的大神门已经讲解的很详细了。我也就不啰嗦了。总之记住一句话:静态只能调用静态,非静态既能调用静态也可以调用非静态
回复 使用道具 举报
  1. public class StaticDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int   a = 5,b = 8;
  6.                 int max;
  7.                 max = getMaxValue(a,b);
  8.                 //因为main函数是static,所以调用的方法和变量也必须的static修饰的,否则会编译出错
  9.                
  10.                 System.out.println("最大值是"+max);
  11.         }
  12.         public static int getMaxValue(int value1,int value2)//在这里加上static就可以了
  13.         {
  14.                 if (value1 > value2)
  15.                         return value1;
  16.                 else
  17.                         return value2;
  18.         }
  19. }
  20. /*
  21.         静态方法只能访问静态成员(成员变量和方法)。
  22.         非静态方法既可以访问静态也可以访问非静态。
  23. */
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
郑才熹 发表于 2013-4-22 16:07
这里的max是静态的?是因为主函数里面的static吗?

是因为max不是静态的,而主函数是静态的,所以要主函数要想引用max的话,max也要变为静态才可以。
回复 使用道具 举报
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马