继承

继承的定义(注意没有权限修饰符)
public class Manager extends Employee
{

}
在java中,所有的继承都是公有继承
此时Employee是Mananger的父类超类(super前缀)
Manger是Employee的子类(sub前缀);

————————————————————————————

子类的“权利”

子类可以根据权限控制符访问超类中被设置为允许访问的方法,当然子类也允许**重写(覆盖)**掉父类的同名方法
用@override对覆盖做好标记

一个简单的例子就是在超类中可以直接调用私有数据来完成操作,但是在子类·中就要覆盖为用访问器访问父类的数据并且 用更改器来更改数据。

————————————————————————————

子类构造器

和C++不同的点在于没有父类构造器的初始化列表了,
可以在子类构造器中调用超类的构造器。
可以这么写:super(参数列表)
此处会调用超类的对应此参数列表的构造器。

super
它的功能对应this的功能,除了调用构造器以外还可以使用点语法使用超类方法。

super .dadDisplay();

————————————————————————————

所谓“多态”

刚才有这么一个例子
public class Manager extends Employee
{

}

经理类继承于员工类,我们来看看以下例子:

Manager Boss = new Manger(信息);
boss.setBonus(50000);
var staff = new employee[3];
staff[0]=boss;
staff[1]=new Employee(信息);
staff[2]=new Employee(信息);
for (Employee e:staff)
	e.Salarycout();

上面的伪代码中,向我们展示了一个超类引用指向一个子类是毫无问题的。

虽然e是个确定类型的变量,但对于员工和经理会调用不一样的
方法,虚拟机帮我们判断了实际上方法的从属,这样就能调用到正确的方法上。

如上面情况,一个变量(e)可以指代多个实际类型的现象叫做多态
% %
在运行时选择正确的方法,称作动态绑定
% %
如果只是一般的函数调用,不涉及到隐式参数等,那么编译器将能够准确的知道需要调用的方法,这个过程叫做静态绑定

在判断调用那个函数时,如果找不到相应参数,编译器会尝试进行类型转换后再搜索,若仍没有找到,或者发现转换后会有多个方法与之匹配,则编译器会报错。
————————————————————————————

使用final关键字阻止类继承

有些时候我们可能不太希望一些工具类或者重要的类被继承,则可以使用fina 关键字,在权限关键字之后限制

限制类

则这个类不能再被继承

限制方法

这个方法不能被子类覆盖
————————————————————————————

类型强制转换与对象类型转换

(int)xxx
表示把xxx强制转换为int
使用的一般情形:可能需要在短暂的忽视对象类型的情况下完成所有功能
如在上面的例子中,如果不是预先设置了manager对象boss,而
是对数组成员赋值,情况会不一样。
如果要想访问子类对象独有的东西,则必须将它强转回子类对象
这样才能完成访问。
逻辑是本来就是子类,赋值到超类数组里了,所以才能强转回
来。

一般情况下,子类可以强转为超类,反之不行(即不允许在继承树上面进行向下的强制类型转换)

  • 在Employee数组那里赋值的时候应该叫做自动的类型转换,根据基本数据类型的情况,应该也是“小的”类型自动转换为“大的”类型。
  • 应当只在继承层次或者有特殊定义方法位置进行强转
  • 强转之前应实用instanceof 进行判断
if(staff[1]instanceof Manager)
{
boss = Manager staff[1];
//转回来
}

此处由于staff【1】是Employee类型,这实际上是一个自上而下的强转,instanceof会判断转换不能进行,然后返回
ClassCastException异常,这样就能避免你把一个不可能转换的情况进行。


附加:
一般类型转换三种方法:
以int——>String为例:
1,通过自己转变:(封装)

String a = Integer.toString(i);

由于int并没有对应对象所以将其装箱,Integer里面自带转化为String的方法
2.通过目标类型的方法来转变

String b = String.valueOf(i);

3.强制转换

String c = i+ " ";

简单实用