自学JavaDay7

面向对象

类与对象

        现实世界中如果事物与事物有共同特征,那么我们就把他们称之为一类,比如鱼类,运动类,电竞类等等。类是人类大脑思考总结出的一个模板,是一个抽象的概念。一个事物都应该具备状态和行为,比如学生,状态包括性别,年龄等等行为包括学习,跑步等等

        这个学生的状态我们在类中称之为属性,行为我们称之为方法,假设一个学生性别男,喜欢跑步,那么他就有男这么一个状态和跑步这么一个行为

学生类简单示例

         所以类 = 属性 + 方法

类中的属性又称为实例变量(对象变量),通常当一个方法表示一个对象的行为时该方法不用static修饰,这个方法又称为实例方法(对象方法),两者在访问时必须先有对象(类的实例化)才能访问。

对象

        实际存在的个体,又称示例instance,通过类这个模板可以实例化多个对象,在上面的示例中我们只是大致给出了一个学生的类,没有具体实例化,假设这个学生性别为男,正在跑步。我们就可以通过类来实例化出这个学生对象

学生类实例化简单示例

引用 

        引用的本质是一个变量,存储的是通过类实例化后的java对象的内存地址。

        可以通过引用访问对象的属性。

        访问实例变量有两种方法:第一种读取  引用.变量名  第二种修改  引用.变量名 = 值。

引用的简单示例

JVM(Java虚拟机内存分析)

图片修改自bilibili动力节点老杜java零基础p115

方法调用时的参数传递问题

        

面试题

我们先试着分析一下这段代码的运行结果

        初学者大部分都会认为结果为:add(i)的值为:11

                                                         11

        但是i的值实际没有发生变化。

标题

        那么为什么i的值没有自增1呢,这时候就涉及到方法的调用时的参数传递问题,在我们创建的add方法开始被main方法调用的时候局部变量i被传到add方法的()里,这个步骤就等于() = i;()用来接收变量,而"()"就可以看作是另一个名为()的局部变量,这样当我们将i的值传给()就相当于把i的值赋值了一份传给了(),这两个局部变量互不干扰,比如:

将()看作一个局部变量j,两个变量互不干扰

当我们在add方法中对i++时,当前的i和main方法里的i已经时两个不同的i只是变量名相同,所以在对add方法中的i++时,main中的i不受影响,进而结果是原来的i不变,add方法中的i自增1。

方法调用时的引用数据类型传递问题 

面试题

试着分析以上代码,写出运行结果。

        这里我们还是add方法,但是add方法中的形式参数类型为引用数据类型,结果还和上面的传基本数据类型结果一样吗?答案是不一样。

        在方法形式参数类型为引用数据类型时,我们传递的是当前引用所存储的对象的地址,而不管这个地址怎么复制,最终通过这个地址所找到的内容还是一样的,都是s1.age,所以不管我们是在哪里修改这个地址中的内容,它都是修改的这个数据本身

在add方法中修改s1.age就是修改s1.age本身

我们只需要记住当一个方法需要修改参数时,方法调用的时候参数的传递只是把变量复制了一份传到方法里面,只不过有的时候形式参数列表中的数据为基本数据类型,有的时候形式参数列表中的数据为引用数据类型。 当为基本数据类型时原参数(要传入的参数)不变,当为引用数据类型时原参数(要传入的参数)改变。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值