回顾总结6+7

IDEA

常用快捷键

不熟

  1. 查看类的层级关系:ctrl +H

  2. 删除当前行:crtl + Y

  3. 补全代码:alt + /

  4. 快速格式化代码:ctrl + alt + L

  5. 快速运行程序:自己定义,参考alt +R

  1. 定位到方法:ctrl +左击

  2. 自动配置变量名:.var或alt +enter

  3. 导入类:alt + enter

  4. 生成构造器:alt + insert

  5. 复制当前行:ctrl + D

  6. 添加注释:ctrl + /

常用模板

main方法:psvm/main

输出语句:sout

循环:fori

学会查找模板、定义模板

修饰符

修饰符可以修饰属性、成员方法和类

  • 类只能用piblic和默认的修饰

  • 范围依次为public > 受保护的 > 默认 >私有的

  • 所有的 > 同包或子类 > 同包 > 同类

 

继承

细节

  1. 子类继承了所有的属性和方法(所有,包括私有)

    • 非私有的属性和方法可以在子类中直接访问

    • 私有属性和方法不能在子类中直接访问,要通过父类的公共方法去间接访问。(本质上还是父类在访问?)

  2. 子类对象生成时,先调用父类的无参构造器,然后是子类的构造器,如果父类定义了有参构造,且没有无参构造的话,需要在子类构造器加上具体super(参数名)

重写

方法重写

  1. 子类的方法的参数,方法名称,要和父类方法的参数,方法名称完全一样。

  2. 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类。比如父类返回类型是Object,子类返回类型是String

  3. 子类方法不能缩小父类方法的访问权限(修饰符)。

名称范围方法名形参列表返回类型修饰符
重载(overload) 本类 必须一样 类型、个数、顺序至少有一个不同 无要求 无要求
重写(override) 父子类 必须一样 相同 子类重写的方法,返回的类型和父类返回的类型一致,或者是其子类 子类方法不能缩小父类方法的访问范围

多态

方法的多态

多态就是同一个行为具有多个不同表现形式或形态的能力(即见人说人话,见鬼说鬼话)

多态的表现形式:重载和重写。

重载:根据传递的不同值,给予不同的结果。(方法名是一样的)

重写:根据对象实例的不同,调用不同的方法。(方法名是一样的,但是内容不一样)

对象的多态

  1. 一个对象的编译类型和运行类型可以不一致

  2. 编译类型在定义对象时,就确定了,不能改变

  3. 运行类型是可以变化的

  4. 编译类型看定义时 = 号的左边,运行时类型看 = 的右边

实用案例

方法定义的形参为父类类型,实参类型允许为子类类型

对于狗吃骨头,猫吃鱼,主人负责喂(方法)。

我们需要建7个类,主人、狗(动物)、猫(动物)、骨头(食物)、鱼(食物)。

使用 喂 方法的时候,需要传递具体的动物实例对象,和食物实例对象。

对于过去传统方法而言,我们每一次都是传入具体的对象的实例。即引用类型和实例类型一致。如给喂方法,传递狗(动物)和骨头(食物)。

使用多态后,我们可以把父类的引用指向子类实例。把方法的形参传入父类,即动物和食物。要用的时候,把动物的实例对象狗和骨头作为实参传递进去。

编译时和运行时

编译类型 引用名 = new 运行类型

  • 多态的向上转型:父类的引用指向了子类实例

  1. 编译阶段,能够调用那些成员,要看编译类型。

  2. 运行时,调用那些成员,看运行类型。

  3. 可以调用父类的所有成员

  4. 不能调用子类的特有成员

子类类型 引用名 = (子类类型)父类引用

  • 多态的向下转型:父类的引用类型强制转换成子类引用类型

  1. 只能强转父类的引用,不能强转父类的对象

  2. 要求父类的引用必须指向的是当前目标类型的对象

  3. 可以调用子类类型中的所有成员

细节

结论:属性的值看编译类型,方法看运行类型

思考:为什么方法有重写,属性是隐藏。

  1. 编译的时候,相当于给我们定了一个模板。我们要用的属性、方法,都要从这个模板上找,找到了就能用,没有的就用不了。

  2. 运行的时候,就是new的时候,我们先把这个模板拿过来,然后开始生成子类自己的属性,因为父类的属性和方法是能完全继承下来的,所以,刚好占满一个模板。

    (1)生成子类自己的属性时,模板空间是满的,属性是不能修改的,只能生成新的空间存放属性。

    (2)生成子类自己的方法时,因为继承的关系,我们有方法的空间,需要修改的时候,也是在原有空间上改动,所以方法,还是在模板空间里。不会生成新的空间。

  3. 我们调用的时候呢,是在模板里找东西,所以找的东西就是子类的方法,和父类的属性。

动态绑定机制

  • 调用对象方法时,该方法会和该对象的内存地址/运行类型绑定(内存地址就是new出来的对象的地址,运行类型指的也是)

总结:方法优先从子类调用(运行类型),不管这个方法是在哪里

  • 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用(因为属性是在编译时就确定的,所以那个类中调用,就使用那个类的属性)

Object类方法

== 和equals

==

可以比较基本数据类型和引用数据类型

equals

只能判断引用类型,大多数判断引用类型中的值。

hashCode

小结

  1. 提高具有哈希结构的容器的效率

  2. 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的

  3. 两个引用,如果指向的是不同对象,则哈希值是不一样的

  4. 哈希值主要根据地址号来的,不能完全将哈希值等价于地址

finalize

垃圾回收

  1. 当对象被回收时,系统是通过自动调用该对象的finalize方法实现垃圾回收机制的。子类可以重写该方法,做一下释放资源的操作。

  2. 什么时候回收,当某个对象没有任何引用时,则JVM就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会调用finalize方法。

  3. 垃圾回收机制的调用,是由系统来决定,也可以通过System.gc方法主动触发垃圾回收机制。

断点调试!!!

很有用的功能,有用在哪,不会。

编程风格

尽量一段代码,完成一个小功能,不要混在一起。

便于代码的维护和扩展。

 

posted @ 2021-07-28 22:28  灰线  阅读(61)  评论(0)    收藏  举报