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);
         
     }
     
 }