回顾总结6+7
常用快捷键
不熟
-
查看类的层级关系:ctrl +H
-
删除当前行:crtl + Y
-
补全代码:alt + /
-
快速格式化代码:ctrl + alt + L
-
快速运行程序:自己定义,参考alt +R
熟
-
定位到方法:ctrl +左击
-
自动配置变量名:.var或alt +enter
-
导入类:alt + enter
-
生成构造器:alt + insert
-
复制当前行:ctrl + D
-
添加注释:ctrl + /
常用模板
main方法:psvm/main
输出语句:sout
循环:fori
学会查找模板、定义模板
修饰符
修饰符可以修饰属性、成员方法和类
-
类只能用piblic和默认的修饰
-
范围依次为public > 受保护的 > 默认 >私有的
-
所有的 > 同包或子类 > 同包 > 同类
继承
细节
-
子类继承了所有的属性和方法(所有,包括私有)
-
非私有的属性和方法可以在子类中直接访问
-
私有属性和方法不能在子类中直接访问,要通过父类的公共方法去间接访问。(本质上还是父类在访问?)
-
-
子类对象生成时,先调用父类的无参构造器,然后是子类的构造器,如果父类定义了有参构造,且没有无参构造的话,需要在子类构造器加上具体super(参数名)
重写
方法重写
-
子类的方法的参数,方法名称,要和父类方法的参数,方法名称完全一样。
-
子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类。比如父类返回类型是Object,子类返回类型是String
-
子类方法不能缩小父类方法的访问权限(修饰符)。
| 名称 | 范围 | 方法名 | 形参列表 | 返回类型 | 修饰符 |
|---|---|---|---|---|---|
| 重载(overload) | 本类 | 必须一样 | 类型、个数、顺序至少有一个不同 | 无要求 | 无要求 |
| 重写(override) | 父子类 | 必须一样 | 相同 | 子类重写的方法,返回的类型和父类返回的类型一致,或者是其子类 | 子类方法不能缩小父类方法的访问范围 |
多态
方法的多态
多态就是同一个行为具有多个不同表现形式或形态的能力(即见人说人话,见鬼说鬼话)
多态的表现形式:重载和重写。
重载:根据传递的不同值,给予不同的结果。(方法名是一样的)
重写:根据对象实例的不同,调用不同的方法。(方法名是一样的,但是内容不一样)
对象的多态
-
一个对象的编译类型和运行类型可以不一致
-
编译类型在定义对象时,就确定了,不能改变
-
运行类型是可以变化的
-
编译类型看定义时 = 号的左边,运行时类型看 = 的右边
实用案例
方法定义的形参为父类类型,实参类型允许为子类类型
对于狗吃骨头,猫吃鱼,主人负责喂(方法)。
我们需要建7个类,主人、狗(动物)、猫(动物)、骨头(食物)、鱼(食物)。
使用 喂 方法的时候,需要传递具体的动物实例对象,和食物实例对象。
对于过去传统方法而言,我们每一次都是传入具体的对象的实例。即引用类型和实例类型一致。如给喂方法,传递狗(动物)和骨头(食物)。
使用多态后,我们可以把父类的引用指向子类实例。把方法的形参传入父类,即动物和食物。要用的时候,把动物的实例对象狗和骨头作为实参传递进去。
编译时和运行时
编译类型 引用名 = new 运行类型
-
多态的向上转型:父类的引用指向了子类实例
-
编译阶段,能够调用那些成员,要看编译类型。
-
-
可以调用父类的所有成员
-
不能调用子类的特有成员
子类类型 引用名 = (子类类型)父类引用
-
多态的向下转型:父类的引用类型强制转换成子类引用类型
-
只能强转父类的引用,不能强转父类的对象
-
要求父类的引用必须指向的是当前目标类型的对象
-
可以调用子类类型中的所有成员
细节
结论:属性的值看编译类型,方法看运行类型
思考:为什么方法有重写,属性是隐藏。
-
编译的时候,相当于给我们定了一个模板。我们要用的属性、方法,都要从这个模板上找,找到了就能用,没有的就用不了。
-
运行的时候,就是new的时候,我们先把这个模板拿过来,然后开始生成子类自己的属性,因为父类的属性和方法是能完全继承下来的,所以,刚好占满一个模板。
(1)生成子类自己的属性时,模板空间是满的,属性是不能修改的,只能生成新的空间存放属性。
(2)生成子类自己的方法时,因为继承的关系,我们有方法的空间,需要修改的时候,也是在原有空间上改动,所以方法,还是在模板空间里。不会生成新的空间。
-
我们调用的时候呢,是在模板里找东西,所以找的东西就是子类的方法,和父类的属性。
动态绑定机制
-
调用对象方法时,该方法会和该对象的内存地址/运行类型绑定(内存地址就是new出来的对象的地址,运行类型指的也是)
总结:方法优先从子类调用(运行类型),不管这个方法是在哪里
-
当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用(因为属性是在编译时就确定的,所以那个类中调用,就使用那个类的属性)
Object类方法
== 和equals
==
可以比较基本数据类型和引用数据类型
equals
只能判断引用类型,大多数判断引用类型中的值。
hashCode
小结
-
提高具有哈希结构的容器的效率
-
两个引用,如果指向的是同一个对象,则哈希值肯定是一样的
-
两个引用,如果指向的是不同对象,则哈希值是不一样的
-
哈希值主要根据地址号来的,不能完全将哈希值等价于地址
finalize
垃圾回收
-
当对象被回收时,系统是通过自动调用该对象的finalize方法实现垃圾回收机制的。子类可以重写该方法,做一下释放资源的操作。
-
什么时候回收,当某个对象没有任何引用时,则JVM就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会调用finalize方法。
-
垃圾回收机制的调用,是由系统来决定,也可以通过System.gc方法主动触发垃圾回收机制。
断点调试!!!
很有用的功能,有用在哪,不会。
编程风格
尽量一段代码,完成一个小功能,不要混在一起。

浙公网安备 33010602011771号