黑马程序员技术交流社区
标题:
为什么编译有错误????
[打印本页]
作者:
HM汪磊
时间:
2013-3-2 14:58
标题:
为什么编译有错误????
class Person
{
int age;
String name;
Person(String name)
{
this.name=name;
}
Person(String name,int age)
{
this(name);
this.age=age;
}
}
class Half
{
public static void main(String[] args)
{
Person p1=new Person("lisi",20);
System.out.println("name="+name+",age="+age);
}
}
输出语句放在构造函数
Person(String name,int age) {
this(name);
this.age=age;
}
最后一句就可以正常执行,为什么按上述写法就不对呢???程序是怎么执行的?????
作者:
杨杨
时间:
2013-3-2 15:09
本帖最后由 杨杨 于 2013-3-2 18:02 编辑
class Half
{
public static void main(String[] args)
{
Person p1=new Person("lisi",20);
System.out.println("name="+name+",age="+age);
}
}
name 定和age没有定义
System.out.println("name="+p1.name+",age="+p1.age);
作者:
谢波
时间:
2013-3-2 15:17
System.out.println("name="+name+",age="+age);
改成
System.out.println("name="+p1.name+",age="+p1.age);
作者:
Gaara
时间:
2013-3-2 15:20
你最后都没说是调谁的name和age啊 加p1.name和p1.age
作者:
孙传磊
时间:
2013-3-2 16:13
本帖最后由 孙传磊 于 2013-3-2 16:15 编辑
如果你是想输出Person类的对象 p1 的成员变量 name 和 age 可以按下面方法改,
即“System.out.println("name="+p1.name+",age="+p1.age);” 就是说要告诉jvm 要输出的是 p1 的成员变量
如果写在构造函数中,如下:
Person(String name,int age)
{
this(name);
this.age=age;
System.out.println("name="+name+",age="+age);
}
那么
首先是 类 Half 创建 Person 类的对象 p1 ,之后是赋值,再之后是输出。 由于“System.out.println("name="+name+",age="+age);
” 在 p1内部 jvm 把“ System.out.println("name="+name+",age="+age);
”默认为“System.out.println("name="+this.name+",age="+this.age);” ,也就是说按上面的写法只是省去"this." 而此处暗含"this." 为jvm指明 name 和age 是 p1 的成员变量。
从而可以正确的运行。
下面代码就可以真确运行了!
class Person
{
int age;
String name;
Person(String name)
{
this.name=name;
}
Person(String name,int age)
{
this(name);
this.age=age;
}
}
class Half
{
public static void main(String[] args)
{
Person p1=new Person("lisi",20);
System.out.println("name="+p1.name+",age="+p1.age);
}
}
作者:
杨玉辉
时间:
2013-3-2 17:44
本帖最后由 杨玉辉 于 2013-3-2 17:50 编辑
Person p1=new Person("lisi",20); //该语句仅仅是建立一个p1对象,并把参数lisi,20传给了与之对应的构造函数 Person(String name,int age)就完了,构造函数内部并没有对这两个参数进行操作
System.out.println("name="+name+",age="+age); //这条语句相当于“System.out.println("name="+this.name+",age="+this.age);”
在Half这个类中你上下文并没有定义 int age; String name;
所以就没有具体内容,也就没有具体输出内容。
而输出语句放在构造函数内
Person(String name,int age) {
this(name);
this.age=age;
System.out.println("name="+name+",age="+age);//为了方便说而已,才这么写的
}
很明显,就可以输出,就是你通过Person p1=new Person("lisi",20); 传进来的参数嘛。 当然可以输出咯
建议你这么写:
class Person
{
int age;
String name; //最好用private 关键字私有处理下 防止类外直接调用
Person(String name)
{
this.name=name;
}
Person(String name,int age)
{
this(name);
this.age=age;
}
public void method()
{
System.out.println("name="+name+",age="+age);
}
}
class Half
{
public static void main(String[] args)
{
Person p1=new Person("lisi",20);
p1.method(); // p1. mothod(); 构造函数调用 本类中的method()方法 可以提高代码复用性 再用到的时候,直接调用就可以了
}
}
个人见解,多指教
作者:
HM王琦
时间:
2013-3-2 18:03
错在主函数的输出语句
Person p1=new Person("lisi",20);
System.out.println("name="+name+",age="+age);//错误在于name和age应该改为p1.name,p1.age要明确name和age的所属关系。
作者:
HM王琦
时间:
2013-3-2 18:10
当把次输出语句放入构造函数中时,
Person(String name,int age)
{
this.name=name;
this.age=age;
System.out.println("name"+name+",age"+age);//这里的name和age是随和对象一起加载的。
}
主函数中new Person("lisi",20)就已经执行了打印语句
作者:
董霁辉
时间:
2013-3-11 19:50
其实这个问题要归结到面向对象刚刚开始讲的地方,java是面向对象语言,那么就要从对象角度出发.对象拥有
属性
和
方法
。调用属性或方法:
对象.属性
或
对象.方法
。案例中定义了一个Person类,且重载,age和name分别是Person类的属性,那么要想调用该属性的时候,就要用
对象.属性
。
案例中 javac编译到打印name和age时,由于未指定name和age是哪个类的属性,换句话说就是编译器不知道他们两个是什么东西,所以报错!
修正为 P1.name 和P1.age 编译器就知道那两个东西是什么了,然后你就happy了
望对你有帮助 共同学习
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2