blog 2019.3.7 Day10

blog 2019.3.7 Day10
调用change 传过来的是一个10 传过来的值怎么操作都不会影响上面的age 因为他们在内存中是在不同的位置的。
输出了两个age 都是10

blog 2019.3.7 Day10
值传递:将数值传递给方法,然后进行计算,不影响之前的值,传递值的一个副本。

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

有参构造和无参构造。

blog 2019.3.7 Day10

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

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

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

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

java传递过去的是

地址

不是值
blog 2019.3.7 Day10

toString

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

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

blog 2019.3.7 Day10
之所以是false 是因为cat1 和cat2 指的是内存中的两个地址。这里不考虑内容,所以不一样。

blog 2019.3.7 Day10

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

blog 2019.3.7 Day10
blog 2019.3.7 Day10

blog 2019.3.7 Day10

blog 2019.3.7 Day10
blog 2019.3.7 Day10

**

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

blog 2019.3.7 Day10

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

用equals:
blog 2019.3.7 Day10

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

**

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

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

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

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

blog 2019.3.7 Day10
blog 2019.3.7 Day10

blog 2019.3.7 Day10

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

值传递

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 有什么用?

blog 2019.3.7 Day10

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

鼠标右键–source–Generate toString

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

局部变量&全局变量

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

blog 2019.3.7 Day10

super表示的父类对象,可以在子类通过super。属性来赋值。
blog 2019.3.7 Day10

final关键字

final本意:不可更改、衡量

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

3、final修饰方法:代表当前方法不能被修改,该方法不能被重写。可以被重载,
blog 2019.3.7 Day10
但是无论是最初的还是重载后的final都不能被修改 重写。