blog 2019.3.7 Day10

在这里插入图片描述
调用change 传过来的是一个10 传过来的值怎么操作都不会影响上面的age 因为他们在内存中是在不同的位置的。
输出了两个age 都是10

在这里插入图片描述
值传递:将数值传递给方法,然后进行计算,不影响之前的值,传递值的一个副本。

return了age 有返回,并且把上面的age重新用change(age)赋值。 所以就输出了返回的这个age

有参构造和无参构造。

在这里插入图片描述

两个test2 第一个无参 不穿参, 第二个有参数。
看主方法在调用时候是否传参,来判断调用第一个test2 还是第二个test2

引用传递:传递的是对象本身,在下面的change的时候直接把Test2 t 本体传过去了,所以回来输出的就是本体 20

在java中,没有引用传递,只有值传递。
但是c/c++会有引用传递。

=面试题:=
判断java的数据传递时,判断传递结果 一般用画图解决。

java传递过去的是

地址

不是值
在这里插入图片描述

toString

父类的toString方法就将内存地址转化为类名+hashcode码
重写toString 优先调用子类的toString

java默认规定,如果你输出的对象的变量,默认调用toString 将内存地址转化为字符串输出 java内容的时候, 输出的 变量.属性 变量.行为 默认不会执行toString.

在这里插入图片描述
之所以是false 是因为cat1 和cat2 指的是内存中的两个地址。这里不考虑内容,所以不一样。

在这里插入图片描述

equals。 就是==的意思。
在这里插入图片描述
重写equals后,cat1.equals(cat2)
就能得出俩值相等了。
在这里插入图片描述
在这里插入图片描述
子类不能重写构造方法, 构造方法可以被重载
原因1、构造方法 名称和类名一样
2、不合理 创建子类时候直接创建了父类?

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

**

问题:equals 和 == 的区别和用法?

在这里插入图片描述

ca 和ca2的内存地址不一样,用 == 两个值永远不相等

用equals:
在这里插入图片描述

在空间内初始化一个数据,用 第二个(需要和他比较的值)去匹配这个已经初始化过的值。匹配成功则两个值就想等,匹配失败就不相等。
在比较时,如果想比较两个值是否相等, 用== 永远不相等(因为比较的是地址。)
在这里插入图片描述
在这里插入图片描述
依然是false。因为equals是object里面的方法,默认也是比较地址----------所以要重写父类object的equals。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

**

hashcode:比较两个值是否相等的效率非常高
equals和hashcode方法两个都是java设计用来判断两个对象是否相等的方法,但是equals在进行比较的时候,逻辑是比较所有属性是否相等,如果属性全都相等,当前两个对象就相等,但是这种验证方法效率比较低。

如果用hashcode来比较,hashcode方法用到的hash值来比较(hash算法),效率非常高

有了hashcode为什么需要equals方法?

hashcode并不是完全可靠的,有时候不同对象生成的hashcode一样,
特点:
1、equals相等的两个对象,他们的hashcode值一定相等,也就是说equals来判断绝对是可靠的。
2、hashcode相等的对象,使用equals进行比较,并不一定相等。hashcode并不是绝对的可靠。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

hashcode和equals方法
对于大量或者快速的对比,如果全都使用equals方法,效率比较低,耗时比较多。
解决方案:
每当要对比的时候,先用hashcode看值是否一样,如果值都不一样的,直接表示当前对象不相等。
如果hashcode相等,再用equals去对比,都相等,那就对比成功。
在这里插入图片描述
调用hashcode方法。
在这里插入图片描述

值传递

java传递的是地址 是值 传递过去的地址 在用的时候 会顺着这个地址找到这个值 这样就完成了值传递

java没有引用传递。

super关键字:给父类的空间创建值?

java中有几种表现形式:
1、super.属性 super.方法() 表示 调用父类的属性和方法。
2、super(参数)

在java类中,使用super关键字来表示引用父类的属性和方法,或者调用父类的构造器。
this表示当前对象,super表示父类对象。

什么是无参构造、有参构造 分别的作用 内存分配执行流程图?

写代码的时候最好在开头声明一个无参构造,以后会有用处。

https://blog.csdn.net/qiuzhongweiwei/article/details/78965788

构造器的作用??

构造器最大的用处就是在创建对象时执行初始化,当创建一个对象时,系统会为这个对象的实例进行默认的初始化。如果想改变这种默认的初始化,就可以通过自定义构造器来实现。
https://blog.csdn.net/qiuzhongweiwei/article/details/78965788
构造器可以用来在初始化对象时初始化数据成员,一个类可以有多个构造器。

一个类的构造器的名称必须与该类的名称一致。要退出构造,可以使用返回语句“return;”。

构造器和方法在下面三个方面的区别:修饰符,返回值,命名。和方法一样,构造器可以有任何访问的修饰: public, protected, private或者没有修饰(通常被package 和 friendly调用).。

不同于方法的是,构造器不能有以下非访问性质的修饰: abstract, final, native, static, 或者 synchronized。
返回类型也是非常重要的。方法能返回任何类型的值或者无返回值(void),构造器没有返回值,也不需要void。

最后,谈谈两者的命名。构造器使用和类相同的名字,而方法则不同。按照习惯,方法通常用小写字母开始,而构造器通常用大写字母开始。构造器通常是一个名词,因为它和类名相同;而方法通常更接近动词,因为它说明一个操作。

构造器就是和类名相同但无返回类型的方法比如
class A
{
public A()
{
}
}
其中A方法 就是class A的构造器 虽然构造器没有返回值但可以有参数如
class A
{
public A(String a,String b)
{
}
}
一个类也可以有多个构造器如
class A
{
public A()
{
}
public A(String a,String b)
{
}
}
当你new A()时则无参那个构造器被调用,当你new A(“ddd”,“fff”)时,那个有参的构造器被调用,如果你没有写构造器则jvm会调用一个默认的无参的构造器
构造器在类初始化的时候被调用通常被用来做一些初始化的工作

怎么加toString 有什么用?

在这里插入图片描述

如果不重写toString, SYSO(ca)会输出一堆hascode地址等一串看不懂的。
若在子类重写toString 可以在输出的时候同样输出syso(ca) 借用elipse的方法重写toString.方便输出的时候输出某个类的所有信息。
在这里插入图片描述

鼠标右键–source–Generate toString

内存结构 分布图 内存分区 创建步骤

局部变量&全局变量

无参构造
通过super(xx,xx)调用有参构造
super()调用父类的无参构造

在这里插入图片描述

super表示的父类对象,可以在子类通过super。属性来赋值。
在这里插入图片描述

final关键字

final本意:不可更改、衡量

1、final修饰变量,变量的值不能更改,此刻K变成一个常量。
final int K =10;
2、final还可以修饰。 类的前面加final表示当前类是最终类。当前类不能再做修改或者拓展,当前类不能被任何子类继承。

3、final修饰方法:代表当前方法不能被修改,该方法不能被重写。可以被重载,
在这里插入图片描述
但是无论是最初的还是重载后的final都不能被修改 重写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值