java--this的使用

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值