黑马程序员技术交流社区

标题: 这段代码为什么不能运行?还有就是this只能在构造函数中使用么? [打印本页]

作者: HM何伟    时间: 2013-3-23 20:33
标题: 这段代码为什么不能运行?还有就是this只能在构造函数中使用么?
  1. class Private1
  2. {
  3.   private String name;
  4.   private int age;
  5.   public void function()
  6.    {
  7.         name=this.name;
  8.     System.out.println(name);
  9.    }
  10.   public String function1(String name)
  11.   {
  12.    this.name=name;
  13.   }
  14. }
  15. class PrivateDemo1
  16. {
  17.   public static void main(String[] args)
  18.   {
  19.    Private1 p=new Private1();
  20.    p.function1("张三");
  21.   }
  22. }
复制代码

作者: 胡国彬    时间: 2013-3-23 20:46
本帖最后由 胡国彬 于 2013-3-23 20:52 编辑

不能运行是因为你的Private1这个类的function1方法定义的是返回类型是String,但是你的方法体中没有给出返回值,所以会报错.
其实你只需要在function1中最后面加上一句代码就ok了,加上:    return this.name; 然后再在main方法中的最下面加上p.function(),就可以在控制台输出张三了.
你的function方法中的name=this.name;这句代码是无用的
this不光能在构造函数中使用,还可以在其他的方法中使用.
作者: HM何伟    时间: 2013-3-23 20:53
你有没有改正去运行一下啊,结果还是报错.
如果我把void改成String行不行呢?
作者: 胡国彬    时间: 2013-3-23 20:56
Orina 发表于 2013-3-23 20:53
你有没有改正去运行一下啊,结果还是报错.
如果我把void改成String行不行呢?

你可以告诉我报 的什么错吗?因为我运行过了,打印出张三了,是不是你哪里的分号没加上?还是什么细节的地方,你把报错信息告诉我,我就知道了,你改成void和在后面加上return this.name的效果是一样的.
作者: HM何伟    时间: 2013-3-23 20:56
可以编译,可以运行,但没有结果.
作者: 胡国彬    时间: 2013-3-23 20:58
Orina 发表于 2013-3-23 20:56
可以编译,可以运行,但没有结果.

没有结果是因为你没有在main方法中调用p.function();这句话,你加上再试一下就没有问题了

记住,要在main方法中p.function1("张三");这句话之后调用
作者: HM何伟    时间: 2013-3-23 21:38
o拉,谢了啊
作者: HM何伟    时间: 2013-3-23 21:45
把string改为void程序应该怎样写??
作者: 胡国彬    时间: 2013-3-23 21:56
Orina 发表于 2013-3-23 21:45
把string改为void程序应该怎样写??

把String直接改为void就ok了,不用加那句return的语句了,然后在main方法下面依然要调用p.function()方法.
作者: HM何伟    时间: 2013-3-23 21:57
怎样在这里可以写日记啊
作者: 曾祥旭    时间: 2013-3-24 15:56
(1)首先你定义的function1方法是String类型,此时的结果需要用return进行返回值操作,需要在function1方法体中的this.name=name;语句之前加入return语句。
(2)你将name和age全部私有操作时,你最好需要要对外提供一个set和get方法,便于对成员变量的使用
(3)在function方法中,加入name=this.name;这条语句是没有任何意义的。
(4)this的作用范围:
(a)当局部变量与成员变量重名时,此时我们可以用this来区分。
        class Person{
        int num=88;//成员变量
        public void method(){
                int num=99;//局部变量
                System.out.println(num);//99
                System.out.println(this.num);//88
        }
}

(b)this:代表它所在函数所属对象的引用。
        class Person{
        private int age;
        Person(int age){//构造函数在进栈的时候,都有个this所属的引用,因为这个它给对应对象的年龄进行初始化的,
                         //哪个对象调用它,this就代表哪个对象。
                this.age=age;
        }
        public boolean compare(Person p){
                return this.age==p.age;
        }
}
public class day03{
        public static void main(String[] args){
                Person p1=new Person(20);
                Person p2=new Person(20);
                boolean b=p1.compare(p2);
                System.out.println(b);
        }
}
此时,在compare方法中this.age代表的是p1的年龄,p.age就代表p2的年龄

(c)this关键字在构造函数中的调用
class Person{
        private int age;
        private String name;
        Person(){
       
        }
        Person(int age){
                this();
                this.age=age;
        }
        Person(int age,String name){
        //this也可以用于在构造函数中调用其他构造函数
                this(age);
                this.name=name;
        }
}
特别需要注意的是:this语句只能定义在构造方法的第一行,因为初始化要先执行。
作者: 杨剑    时间: 2013-3-24 17:31
不能编译通过,因为在function1函数中,是声明String类型返回值的,所以必须给出返回值,可以写成return this.name,另外你的函数中function里面name=this.name意义不大,因为当前对象this的name赋值给name,编译器编译时,赋值的时候找不到该方法中局部变量的name就会在name前面加上this修饰它,相当于这句话this.name=this.name;所以意义不大。
作者: 曹宇    时间: 2013-3-28 21:14
因为你的function1 没有返回值。你定义的函数返回值类型是 String   但是却没有return 语句 所以会报错。如果不要返回子 将String改为 void就好了,。

楼上人的回答我也都看了,应该就是这个情况,如果还是报错的话,估计不是我这水平能看出来的了。你仔细检查下你的语句。符号什么的。。。




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