public class JClassA {
String name;
int age;
int height;
//this shi shui?
//无参构造函数,
JClassA(){
}
//带2个参数的构造函数
JClassA(String a,int age){
//一个构造函数里面只能使用一个构造函数,而且调用要放到最前面,
this();//表示调用无参构造函数
this.name = a;
this.age = age;
}
//带3个参数的构造函数
JClassA(String a,int age,int height){
this("xiaoli",18);//调用两个参数的构造函数。
this.height = height;
}
void tallk(){
成员函数中不能使用this调用构造函数。为什么?
答:因为构造函数是类方法,函数是对象方法,而this存在于一个函数中代表了调用者本身,
如果你在对象方法中使用this()来调用构造函数,那就等于是用“调用函数的对象”来调用“构造函数”,
用对象来调用构造函数是不允许的,
用类来调用对象函数(成员函数)也是不允许的,但是可以通过类来调用静态成员函数,为什么是不允许的?
答:这就引申到static用法,前面我也写过static的用法,static修饰的成员函数可以被类和对象调用,《但是规定不能够在静态函数中使用this来调用非静态函数》,我刚才讲得正好用到,this是代表函数的调用者,如果说在静态方法里面存在使用this调用非静态函数,那么是不是在使用类名调用静态函数的时候,使用了类名来调用非静态函数。
我这个回答等于说没有回答,只是说明这两个规定使用的是同一个道理,类不能调用非静态的成员函数。至于根本原因我也在纠结。
但是这个时候又有一个问题:this代表函数的调用者,那么构造函数起到为对象初始化成员变量的作用,
答:在构造函数中使用this来为对象初始化成员变量必定会使用this,那么比如在一个构造函数中:
Stat(String name){
this.name = name;
//Stat.name = "xiaohong";
}
public static void main(String[] a){
Stat sta = new Stat("xiaohong");
System.out.println("sta 的名字是:"+sta.name);
}
这其中的this时代表谁:如上说讲,代表类,但是类调用成员变量name并初始化,那么name是那个对象的还是类的?
如果我们这样写:sta.name = "xiaohong",那么我们知道打印结果一定是“xiaohong”,但是在构造函数中就好比这么初始化的
Stat.name = "xiaohong";这就混乱了,是类初始化了成员变量,然后我们对象存个值,(根据java的内存管理,对象的堆内存只存放成员变量的值
成员变量在文本区存放,对象引用存放在栈区,)本来应该是我们自己来初始化自己的属性的,现在是类来初始化,把指定的属性初始化完了之后
放进内存中,然后把内存的地址给了我们(我们是对象引用),于是我们就拥有了一个对象。这个无法验证,因为我已经试过,
那么结论是:类可以调用:构造函数(构造器)、成员变量、静态成员函数,如果我错了一定要提醒我。
// this();<wrong!>
System.out.println("my nameis"+this.name);
}
//this 调用成员变量、成员函数,构造函数。this是个代表,调用不同的函数代表不同的调用者
//在构造函数里面调用成员函数和成员方法没有限制。
public static void main(String[] a){
JClassA classA = new JClassA();
JClassA classB = new JClassA();
classA.name = "zhang san";
classB.name = "li si ";
classA.tallk();
classB.tallk();
}
}
public class test {
public static void main(String[] a){
Stat stat = new Stat();
Stat.print();
Stat.name = "xiao mei";
System.out.println(Stat.name);
stat.print();
stat.name = "xiao hong";
System.out.println(stat.name);
}
}