how2j.cn


工具版本兼容问题
变量有两种类型 基本类型 和类类型

参数也是变量,所以传参分为
基本类型传参
类类型传参

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



10分59秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



步骤 1 : 基本类型传参   
步骤 2 : 引用与=   
步骤 3 : 类类型传参   
步骤 4 : 练习-传参   
步骤 5 : 答案-传参   

步骤 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; } // 攻击一个英雄,并让他掉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); } }
步骤 4 :

练习-传参

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
在方法中,使参数引用指向一个新的对象

外面的引用是指向原来的对象?还是新的对象?
public class Hero { String name; //姓名 float hp; //血量 float armor; //护甲 int moveSpeed; //移动速度 public Hero(){ } public Hero(String name,float hp){ this.name = name; this.hp = hp; } //复活 public void revive(Hero h){ h = new Hero("提莫",383); } public static void main(String[] args) { Hero teemo = new Hero("提莫",383); //受到400伤害,挂了 teemo.hp = teemo.hp - 400; teemo.revive(teemo); //问题: System.out.println(teemo.hp); 输出多少? 怎么理解? } }
步骤 5 :

答案-传参

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

7分9秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


在第21行,调用revive的时候,引用h指向 引用teemo所指向的对象 "提莫"
但是teemo引用,还是指向原来的对象
在第22行,引用h指向了新的对象 "新的提莫"

而原来的"提莫" 对象,没有做任何修改,血量依然是负数

最后问 teemo这个引用所指向的对象, 就是"死" 掉的 "提莫" 血量,负数
答案-传参


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-11-06 我自己的理解
盛夏光年



啦啦啦
int moveSpeed; //移动速度
     
    public Hero(){
         
    }
     
    public Hero(String name,float hp){
        this.name = name;
        this.hp = hp;
    }
 
    //复活
    public void revive(Hero h){
        h = new Hero("提莫",383); //执行该方法后。创建一个新的“提莫”
    }
 
    public static void main(String[] args) {
        Hero teemo =  new Hero("提莫",383);
         
        //受到400伤害,挂了
        teemo.hp = teemo.hp - 400;
         
        teemo.revive(teemo);//这句话的意思就是死亡的提莫调用该方法后,会生成一个新的“提莫”,而新提莫的作用域仅限于revive方法中
         
         System.out.println(teemo.hp);//此teemo即为死亡的提莫
         
    }
      
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-08-30 引用
mj2013ly



不懂的,直接看我代码注释吧
public class Hero {
    
    String name; //姓名
        
    float hp; //血量
        
    float armor; //护甲
        
    int moveSpeed; //移动速度
     
    public Hero(){
         
    }
     
    public Hero(String name,float hp){
        this.name = name;
        this.hp = hp;
    }
 
    //复活
    public Hero revive(Hero h){//只要有人仍个英雄过来,我就造一个h对象(新建一个提莫hp为383)
        h = new Hero("提莫",383);
        return h;
    }
 
    public static void main(String[] args) {
        Hero teemo =  new Hero("提莫",383);//创建一个叫teemo的对象,并扔到战场
         
        //受到400伤害,挂了
        teemo.hp = teemo.hp - 400;//上战场的teemo被围殴了,此时的hp为-17,挂了
         
        teemo=teemo.revive(teemo);//把挂掉的teemo尸体扔给revive方法,revive方法看到挂掉的英雄就会自动制造一个叫h的对象且名字叫“提莫”hp为“383”。
         //revive方法造好的英雄都留着自己完了,闭门玩“h”。。。并没有把造好的英雄放回战场,也就不会出现在泉水里复活。
        //此时调用syso(teemo.hp)引用的是teemo对象,也就是原来挂掉的提莫。
        System.out.println(teemo.hp);//听说提莫造好了,syso跑去问teemo对象要提莫,结果teemo对象只有个挂掉的提莫,没办法,诈尸回战场
//造好的新提莫还在revive方法的手里被各种play
         
    }

//输出为-17

							


3 个答案

mj2013ly 答案时间:2018-10-18
与题目所给代码有所不同,我这里的复活方法是有返回值的,返回Hero类型对象,所以teemo=teemo.revive(teemo);是接收到了复活方法返回的对象
public Hero revive(Hero h){
        h = new Hero("提莫",383);
        return h;
    }

mj2013ly 答案时间:2018-10-18
感谢兄弟纠错,是我疏忽

ababbaba 答案时间:2018-09-19
答案
刚试过,输出为383,还有最后少了大括号,被误导了好久




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-08-28 按在地上摩擦~
2018-08-14 英雄伤害溢出
2018-07-21 交作业
2018-06-07 java传参类型为对象时的情况
2018-06-01 交作业呀交作业
2018-06-01 交作业呀交作业
2018-05-27 基础-类和对象-传参 最后输出的xueping为什么不是0啊?
2018-05-23 关于 “在方法内,无法修改方法外的基本类型参数 ” 的理解
2018-05-19 请老师解答关于传入引用参数的疑惑
2018-05-08 答案
2018-04-27 传参的过程
2018-03-20 疑问和提问: teemo.revive(teemo)
2018-03-16 xueping的返回值问题
2017-12-10 步骤1代码是错的
2017-11-25 想请问大家 关于血瓶回血的问题
2017-10-15 传参是不是不能实现,复活的血量=初始的血量
2017-10-15 满血复活,随HP设置而改变,传参是不是不能实现?
2017-10-14 给大家一个好记的方法
2017-10-11 请问如果要让teemo的hp再变成原来的383要怎么做呢?
2017-09-20 类类型就是引用类型吗?一样吗?
2017-09-02 对传参这个概念不了解
2017-09-01 对“在方法内,无法修改方法外的基本类型参数”这句话的疑问
2017-08-29 基本类型和类类型区分?
2017-08-16 我感觉传参的过程和增强的for循环差不多
2017-07-30 对方法的调用
2017-04-25 外面的引用指向原来的对象
2017-04-19 老师我这两种输出不同是不是可以这么理解
2017-04-06 关于this的使用问题
2017-03-12 关于是否浪费存储空间
2017-02-10 关于练习题的疑问
2016-12-16 个人解释,大家看下对不对
2016-11-09 步骤一中怎样把血瓶=0的值传回去
2016-06-16 关于练习题的问题。
2016-05-30 补充问题
2016-05-30 26行执行完以后,teemo为什么不是指向新的对象,而还是原来的对象
2016-05-10 第23行"盖伦", 616存在的意义是什么




提问之前请登陆
关于 JAVA 基础-类和对象-传参 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 902680467
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图