黑马程序员技术交流社区

标题: static方法中的返回值问题 [打印本页]

作者: 王龙涛    时间: 2013-3-11 23:16
标题: static方法中的返回值问题
  1. class Staticshow
  2. {
  3.        
  4.         static double PI =3.14;
  5.         static int id;
  6.         public static void method1()
  7.         {
  8.                 System.out.println(Staticshow.PI);
  9.         }
  10.         public void method2()
  11.         {
  12.                
  13.                 System.out.println(Staticshow.id);
  14.                 Staticshow.method1();
  15.         }
  16.         public static method3()
  17.         {
  18.                 method2();//静态方法无法访问非静态
  19.                 return this;
  20.         }
  21.        
  22.         public static void main(String[] args)
  23.         {
  24.                 method3();
  25.         }
  26. }
复制代码
上述代码编译提示 method3方法声明无效,需要返回值类型,return this不可以吗?为什么?
作者: 何旭程    时间: 2013-3-11 23:18
method3你根本就没有定义返回值类型啊,编译都不能通过~
作者: 边亮    时间: 2013-3-11 23:24
静态方法中可以有非静态方法 但是不能调用
作者: 爪哇攻城狮    时间: 2013-3-11 23:33
你没有定义返回值啊,
this是指当前对象。

不可以在静态方法中引用非静态方法.....

返回值,看需求,没有的话可以返回void,看需求是返回int ,string,..........

作者: 张卫刚    时间: 2013-3-11 23:37
class Staticshow
{
        
        static double PI =3.14;
        static int id;
        public static void method1()
        {
                System.out.println(Staticshow.PI);
        }
        public static void method2()                                //3  ** 解决问题 2  所以这块加上static
        {
               
                System.out.println(Staticshow.id);
                Staticshow.method1();                                //2  **此方法调用静态方法?静态只能调用静态,所以看上面 3
        }
        public static Staticshow method3()                        //1  **首先这块你要加上返回值类型,按你的写法是要返回对象
        {
                method2();//静态方法无法访问非静态
                return new Staticshow();                        //静态变量只能访问静态啊,你返回的this,一来你没new对,二来返回没什么用,所以这样改
        }
        
        public static void main(String[] args)
        {
                method3();
        }
}
作者: 曾钦    时间: 2013-3-11 23:37
本帖最后由 曾钦 于 2013-3-11 23:39 编辑

你return了一个this 所以必须声明返回值类型。
如果没有return 要声明返回值类型为void 
方法的三要素。。方法名,参数,返回值。
你这样写的话,编译都通不过的。。
而且你return 的是this ,this 本身是一个对象,
返回值类型应该为Object 但是this 这个又通不过编译了。会报警告,cannot use this in a static context
在静态区域中不能用 this.
所以额,楼主,你还是想清楚。。你要干嘛先。。{:soso_e113:}
作者: 张宁    时间: 2013-3-11 23:40
你不仅没有返回值类型,而且你的静态方法里的return this,指的是返回 当前对象,你到底想返回什么?你是怎么想的,还有你的主方法里边的method3()直接这样调用对吗?
作者: 王龙涛    时间: 2013-3-12 00:15
张宁 发表于 2013-3-11 23:40
你不仅没有返回值类型,而且你的静态方法里的return this,指的是返回 当前对象,你到底想返回什么?你是怎 ...

谢谢!受教了,我想看下return this的结果,结果没看到,就提示没有返回值类型,我晕菜了,没写返回值类型!
作者: 聂斌    时间: 2013-3-12 02:35
本帖最后由 聂斌 于 2013-3-12 02:38 编辑

呵呵同学:你的代码有4处错误

public static method3()                        //(a)
    {
            method2();//静态方法无法访问非静态        //(b)
            return this;                                                        //(c)
    }

    public static void main(String[] args)
    {
            method3();                                                //(d)
    }


(a)处: method3()这里没有加上返回值类型,,,你可以写void

void:代表的是函数没有具体返回值的情况。函数里面是一定要写return语句的,当函数的返回值类型是void时,函数中的return语句可以省略不写。写上也不算错,,你不写的话系统会帮你加一个return,此时return后面是没有具体的值的,,,,return是用来结束函数用的

    public static void method3()                        
    {
            method2();//静态方法无法访问非静态        //(b)报错
            return this;                                                        //(c)报错
    }




(b)处:静态方法只能访问静态成员,,,,因为你的method2()方法不是静态方法,,所以会报错的,,你可以把method2()加上static修饰

public static void method2()
    {

            System.out.println(Staticshow.id);
            Staticshow.method1();
    }


(c)处:静态方法中不可以定义this,super关键字。因为静态优先于对象存在。所以静态方法中不可以出现this。看下面代码


        String name;//成员变量,实例变量。
        static String country = "CN";//静态的成员变量,类变量。
        public static void show()
        {
                System.out.println("::::"+this.name);  //报错:因为this是代表对象,没有对象就没有任何代表,,,,,this这个引用他都没有被初始化过,他怎么能去调用内容
               
        }


this:  代表本类的对象,到底代表哪一个呢?
        this代表它所在函数所属对象的引用。
        简单说:哪个对象在调用this所在的函数,this就代表哪个对象。也就是说哪个对象在调用相对应的函数,那么this就代表哪个对象,,也就是说这个函数在被哪个对象所调用,那么函                数里的this就代表那个对象,

this的应用:
当定义类中功能(函数)时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。因为你描述功能的时候,这个时候是还没有对象的,这个时候就用this来表示对象.谁后期调用我了我就代表谁..



return this;   因为你mian方法里面写了method3();方法,,,而这个method3()是静态的,所以这个method3()不需要创建对象就能被调用,,既然method3()不属于具体的哪个对象,,那么this就代表不了具体的对象,,,

解决办法:

return this; 去掉this,,直接写return或者不写return;


    public static void method3()                        
    {
            method2();
            return ;                //这个return 可以省略不写
    }




(d)处报错的原因很简单,,,因为(a)处的method3()报错了,,所以main方法调用了一个无法通过编译的method3()方法时自然也会报错



最终的代码:



    static double PI =3.14;
    static int id;

    public static void method1()
    {
            System.out.println(Staticshow.PI);
    }
    public static void method2()
    {

            System.out.println(Staticshow.id);
            Staticshow.method1();
    }
    public static void method3()                        
    {
            method2();                                                        
    }

    public static void main(String[] args)
    {
            method3();                                                
    }



作者: amen0205    时间: 2013-3-12 04:16
楼上写的真详细   
作者: 王亚飞    时间: 2013-3-12 10:09
  1. public static method3()
  2.         {
  3.                 method2();//静态方法无法访问非静态
  4.                 return this;//return 必须有返回值才行,返回值是比如是int double但是你上面,public static method3 这行又没有说明是什么返回值,没有返回值就用void,也就不用写return,return this.这个应该是错误的写法吧,this的意思是指代当前对象,你没有对象所以用不到this
  5.         }
复制代码

作者: 马甲大王    时间: 2013-3-12 16:00
  public static method3()
        {
                method2();//静态方法无法访问非静态
                return this;
        }
应该写成
public static StaticShow method3()
        {
                method2();//静态方法无法访问非静态
                return this;
        }




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