JAVA 基础 / 第二十四课: 类和对象 / JAVA 中的THIS 是什么意思?传参祥解

2018-03-14

一、this这个关键字,相当于普通话里的“我” ,例如:

小明说 “我吃了” 这个时候,“我” 代表小明
小红说 “我吃了” 这个时候,“我” 代表小红
"我"代表当前人物 。

1、this即代表当前对象:

public class Hero {     
    String name; //姓名     
    float hp; //血量     
    float armor; //护甲     
    int moveSpeed; //移动速度
     //打印内存中的虚拟地址
    public void showAddressInMemory(){
        System.out.println("打印this看到的虚拟地址:"+this);
    }     
    public static void main(String[] args) {
        Hero garen =  new Hero();
        garen.name = "盖伦";
        //直接打印对象,会显示该对象在内存中的虚拟地址
        //格式:Hero@c17164 c17164即虚拟地址,每次执行,得到的地址不一定一样
 
        System.out.println("打印对象看到的虚拟地址:"+garen);
        //调用showAddressInMemory,打印该对象的this,显示相同的虚拟地址
        garen.showAddressInMemory();
         
        Hero teemo =  new Hero();
        teemo.name = "提莫";
        System.out.println("打印对象看到的虚拟地址:"+teemo);
        teemo.showAddressInMemory();
    }       
}

2、通过this关键字访问对象的属性:

public class Hero {     
    String name; //姓名     
    float hp; //血量     
    float armor; //护甲     
    int moveSpeed; //移动速度 
    //参数名和属性名一样
    //在方法体中,只能访问到参数name
    public void setName1(String name){
        name = name;
    }     
    //为了避免setName1中的问题,参数名不得不使用其他变量名
    public void setName2(String heroName){
        name = heroName;
    }     
    //通过this访问属性
    public void setName3(String name){
        //name代表的是参数name
        //this.name代表的是属性name
        this.name = name;
    }     
    public static void main(String[] args) {
        Hero  h =new Hero();        
        h.setName1("teemo");
        System.out.println(h.name);
         
        h.setName2("garen");
        System.out.println(h.name);    
         
        h.setName3("死歌");
        System.out.println(h.name);    
    }
    
}

3、通过this调用其他的构造方法:

如果要在一个构造方法中,调用另一个构造方法,可以使用this()

public class Hero {       
    String name; //姓名       
    float hp; //血量      
    float armor; //护甲        
    int moveSpeed; //移动速度        
    //带一个参数的构造方法
    public Hero(String name){
        System.out.println("一个参数的构造方法");
        this.name = name;
    }      
    //带两个参数的构造方法
    public Hero(String name,float hp){
        this(name);
        System.out.println("两个参数的构造方法");
        this.hp = hp;
    } 
    public static void main(String[] args) {
        Hero teemo =  new Hero("提莫",383);       
        System.out.println(teemo.name);        
    }      
}

二、变量有两种类型:基本类型和类类型;参数也是变量,所以传参分为基本类型传参和类类型传参:

1、基本类型传参:

在方法内,无法修改方法外的基本类型参数

public class Hero {       
    String name; //姓名        
    float hp; //血量        
    float armor; //护甲        
    int moveSpeed; //移动速度     
    public Hero(){}  
    //回血
    public void huixue(int xp){
        hp = hp + xp;
        //回血完毕后,血瓶=0
        xp=0;
    }     
    public Hero(String name,float hp){
        this.name = name;
        this.hp = hp;
    } 
    public static void main(String[] args) {
        Hero teemo =  new Hero("提莫",383);
        //血瓶,其值是100
        int xueping = 100;         
        //提莫通过这个血瓶回血         
        teemo.huixue(xueping);
         
        System.out.println(xueping);         
    }      
}

2、引用与=

如果一个变量是基本类型,比如 int hp = 50;我们就直接管hp叫变量,=表示赋值的意思。
如果一个变量是类类型,比如 Hero h = new Hero();我们就管h叫做引用。

=不再是赋值的意思,=表示指向的意思:

比如 Hero h = new Hero();这句话的意思是:引用h,指向一个Hero对象。

3、类类型传参:

类类型又叫引用
第24行的引用teemo与 第17行的引用hero,是不同的引用
通过调用garen.attack(teemo, 100); 使得这两个引用都指向了同一个对象
所以在第18行hero.hp = hero.hp - damage; 就使得该对象的hp值,发生了变化
因此第25行,打印该对象的Hp值就是变化后的值

public class Hero {
    String name; // 姓名 
    float hp; // 血量 
    float armor; // 护甲 
    int moveSpeed; // 移动速度
 
    public Hero(String name, float hp) {
        this.name = name;
        this.hp = hp;<br />    } 
    // 攻击一个英雄,并让他掉damage点血
    public void attack(Hero hero, int damage) {
        hero.hp = hero.hp - damage;
    } 
    public static void main(String[] args) {
        Hero teemo = new Hero("提莫", 383);
        Hero garen = new Hero("盖伦", 616);
        garen.attack(teemo, 100);
        System.out.println(teemo.hp);
    }
}

相关推荐