super/多态
Super 关键字
理解为:父类的
super可以用来调用:属性、方法、构造器
当子类和父类中声明了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式地使用“super.属性"的方式,表明调用的是父类中声明的属性
当子类重写了父类中的方法以后,我们要想在子类中调用父类中的方法,则必须显式地使用“super.方法"的方式进行调用。
super调用构造器。必须声明在首行。
若是父类的属性是私有的,那么在子类中就不能直接去操作对应的属性进行赋值,可以通过使用父类构造器的方式来操作。
在构造器的首行,没有显示的声明“this(形参列表)” 或 “super(形参列表)” ,则默认调用的是父类中的空参构造器。
在类的多个构造器中,至少有一个类的构造器中使用了 “super(形参列表)”,调用父类中的构造器;【this是n-1个】;
子类对象实例化的全过程
从结果上来看:(继承性)
子类创建父类以后,就获取了父类中声明的属性或方法
创建子类的对象,在堆空间中,就会加载所有父类中声明的属性。
从过程上来看
当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器,直到调用到了Object类中的空参构造器为止。正因为加载过所有的父类的结构,所以才可以看到内存中有父类的结构,子类对象才可以考虑进行调用。
明确:虽然创建子类对象时,调用了父类的构造器,但是自始至终就创建过一个对象,即为new的子类对象
多态
一个事务的多种形态。
何为多态性?
父类的引用指向子类的对象
多态的使用: 多态是运行时行为
当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法
虚拟方法调用:有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法;
总结:【编译看左边,运行看右边】
使用前提:1. 类的继承关系 2. 方法的重写
只使用于方法,不使用于属性(编译和运行都看左边)
有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
方法的重载与重写

instance of
a instanceof A : 左边是对象,右边是类;当对象是右边类或子类所创建的对象时,返回true;否则,返回false;
功能少的不能强转成功能多的
可变形参问题:确定个数的执行优于可变形参的执行
equals
==运算符
可以使用在基本数据类型变量和引用数据类型变量中
如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定要类型相同);如果比较的是引用数据类型变量:比较两个对象的地址值是否相同。
equals()
Object类中equals()的定义跟==是相同的;
像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较具体的内容。
public boolean equals(Object obj) {
return (this==obj);
}
三元运算会自动提升类型
Interger 内部定义了 InetrgerCache结构,IntegerCache 中定义了Integer[],保存了从-128~127 范围的整数,如果我们使用自动装箱的方式,给Integer赋值的范围在-128~127范围内时,可以直接使用数组中的元素,不用再去new了。可以提高效率