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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王龙涛 中级黑马   /  2013-3-11 23:16  /  6318 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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不可以吗?为什么?

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

11 个回复

倒序浏览
method3你根本就没有定义返回值类型啊,编译都不能通过~
回复 使用道具 举报
静态方法中可以有非静态方法 但是不能调用
回复 使用道具 举报
你没有定义返回值啊,
this是指当前对象。

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

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

评分

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

查看全部评分

回复 使用道具 举报
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();
        }
}

评分

参与人数 2技术分 +2 收起 理由
贾文泽 + 1
scott0610 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 曾钦 于 2013-3-11 23:39 编辑

你return了一个this 所以必须声明返回值类型。
如果没有return 要声明返回值类型为void 
方法的三要素。。方法名,参数,返回值。
你这样写的话,编译都通不过的。。
而且你return 的是this ,this 本身是一个对象,
返回值类型应该为Object 但是this 这个又通不过编译了。会报警告,cannot use this in a static context
在静态区域中不能用 this.
所以额,楼主,你还是想清楚。。你要干嘛先。。{:soso_e113:}

评分

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

查看全部评分

回复 使用道具 举报
张宁 中级黑马 2013-3-11 23:40:05
7#
你不仅没有返回值类型,而且你的静态方法里的return this,指的是返回 当前对象,你到底想返回什么?你是怎么想的,还有你的主方法里边的method3()直接这样调用对吗?
回复 使用道具 举报
张宁 发表于 2013-3-11 23:40
你不仅没有返回值类型,而且你的静态方法里的return this,指的是返回 当前对象,你到底想返回什么?你是怎 ...

谢谢!受教了,我想看下return this的结果,结果没看到,就提示没有返回值类型,我晕菜了,没写返回值类型!
回复 使用道具 举报
聂斌 中级黑马 2013-3-12 02:35:21
9#
本帖最后由 聂斌 于 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();                                                
    }


评分

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

查看全部评分

回复 使用道具 举报
楼上写的真详细   
回复 使用道具 举报
  1. public static method3()
  2.         {
  3.                 method2();//静态方法无法访问非静态
  4.                 return this;//return 必须有返回值才行,返回值是比如是int double但是你上面,public static method3 这行又没有说明是什么返回值,没有返回值就用void,也就不用写return,return this.这个应该是错误的写法吧,this的意思是指代当前对象,你没有对象所以用不到this
  5.         }
复制代码
回复 使用道具 举报
  public static method3()
        {
                method2();//静态方法无法访问非静态
                return this;
        }
应该写成
public static StaticShow method3()
        {
                method2();//静态方法无法访问非静态
                return this;
        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马