继承Inheritance:
extends关键字
把共性的属性与方法抽取出来形成父类,有实际需求的子类在继承父类的基础上完成自己的特有代码即可
提升了代码的复用性;继承使得类之间相关联,提供了多态的前提
不要仅为了获取其它类的某些属性或方法就去继承,要讲究逻辑关系
子类是父类的拓展
子类不可访问父类private的属性和方法
Java只支持单继承 一个子类只能有一个父类
但是允许多层继承: 子类 -> 父类1 -> 父类2
方法的重写:
子类重写override父类的方法, 只是重写方法体的代码
重写的方法不能比父类原方法访问权限更加严格
重写和被重写的方法必须同时为static或非static
@override 标签更符合代码规范且有提示方法名错误的效果
子类的重写方法可以覆盖父类的方法,但是子类的实例变量不会覆盖父类中的同名实例变量,父类中的同名实例变量被隐藏起来
super关键字:
调用父类中的指定操作(属性,方法,子类构造方法中调用父类的构造器)
super可以向上追溯所有父类(多层继承)
super用法与this相类似,this代表本类对象的应用,super代表父类的内存空间标识
子类的初始构造器默认访问父类中无参的构造器
在父类只有有参构造器可使用时,子类必须显示构建一个构造方法,借助super关键字来调用父类的构造器,并且super代码要放到第一行
简单类对象的实例化过程:
Person per = new Person();
在方法区中加载Person的class文件 -> 在栈中为变量per分配内存 -> 在堆中为对象开辟空间,分配地址 -> 堆中对象属性先默认初始化再显示初始化 -> Person()构造方法(函数)进栈 -> 将对象在堆中的地址赋值给栈中变量per -> Person()构造方法出栈
子类对象的实例化过程:
Student stu = new Student(); Student是Person的子类
在方法区先加载父类Person文件再加载子类Student文件 -> 在栈中为变量stu分配内存 -> 在堆中为对象开辟空间,分配地址 -> 堆中对象属性默认初始化 -> 子类构造方法进栈 -> 父类显示初始化 -> 父类构造方法进栈出栈 -> 子类显示初始化 -> 将对象在堆中的地址赋值给栈中变量per -> 子类构造方法出栈
多态Polymorphism:
1.方法的重载overload与重写override
2.对象的多态性--编译时类型和运行时类型不一致(Java的引用对象有两个类型:编译时类型和运行时类型)
子类的对象可以代替父类的对象使用
一种变量只能有一种确定的数据类型
一种引用类型变量可能指向多种类型的对象(本身或者其子类)
Person p = new Student();
向上转型upcasting: 子类可以看成特殊的父类, 所以父类类型的引用可以指向子类的对象
属性是在编译时确定的, 属性不具有多态性, 只由引用变量所属的类决定
所以该对象不能再访问子类中添加的属性和方法(非override)
虚拟方法调用: 成员方法的多态
Java方法运行在栈中, 在运行方法时会动态地进栈出栈
编译时查看引用对象所属的类中是否有所调用的方法
运行时调用实际对象所属的类中的重写方法
方法的调用是在运行时确定的, 多态情况下调用的是子类的重写方法--动态绑定(基于方法的重写)
总结:多态与继承、方法重写密切相关,我们在方法中接收父类类型作为参数,在方法实现中调用父类类型的各种方法。当把子类作为参数传递给这个方法时,JVM会根据实际创建的对象类型,调用子类中重写的方法(动态绑定)。
封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的类--它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
instanceof操作符:
对象 instanceof 类名(父类子类) 返回boolean类型
Person p1 = new Student(); p1 instanceof Student ture
Student p2 = new Student(); p2 instanceof Person ture
检验某个对象是否是某个类或其父类的实例
Object类(基类):
所有Java类的根父类
未使用extends关键字指定父类的类具有Object的默认父类
Object类是所有Java类的父类 + 子类对象可以代替父类对象 -> Object类可以作为以任何类为参数的方法的形参
Object方法:
a.equals(b); 返回boolean类型 判断a与b是否引用同一对象
a.hashCode(); 返回int类型 取得Hash码
a.toString(); 返回String类型 获取对象的地址Student@28a418fc