继承
面对对象编程思想的最终目的就是 :代码复用。
那么代码复用的手段就是做工具,和工具集,并将工具进行保护,这的确能做到代码复用,但这还远远不够。所以产生了继承。
当我们做工具的时候,发现做的几个工具的某些功能大体相同,所以我们可以概括,总结抽象成一个类,这个 类就具有了共同的属性,共同的操作,共同的成员,共同的方法。所以通过这种方式,其实也完成了 代码复用。
首先讲一讲父类的public,protected,private,和无修饰所修饰的的变量在派生后的子类的引用权限。
首先是两个极端的修饰符 private和public
private无论是否继承,无论是否在包内,皆不可直接引用;
public继承后的子类可直接引用,但在包外的非子类需要导包方可直接引用;
protected所修饰的变量是专为继承而用,非子类皆不可用;
无修饰类的变量的引用权限与继承无关,只要是在包内皆可使用;
继承关系中的构造方法
JVM对于有继承关系的类的构造方法先从当前类开始,根据继承关系,追溯到最开始的祖先类,然后再沿着继承关系向下,逐个执行构造方法。
如果存在一个父类和一个子类,若父类写了双参构造和单参构造方法,但未写无参构造方法,则在子类中构造方法会显示错误,说明无论子类是单参还是双参,则JVM在默认情况下只调用基类的无参构造方法。除非用super(…);的情况下会调用父类的具体哪一种构造方法,与this();一样,super();也只能出现在构造方法中,若有super();则它必须是构造方法的第一条语句。
成员和方法的覆盖
继承可以让子类拥有与父类所拥有的成员和方法,但是子类也可以更改父类的成员和方法,以适应不用于父类的环境和特殊要求,这样就可以使得工具与时俱进,更新换代。
在面对对象程序设计中,上述思想的实现手段就是覆盖。
此时输出Father类的protectednum输出的是Grandfather类的protectednum变量;
当对father类再定义一个protectednum变量时无论数据类型,都会隐藏掉Grandfather类的protectednum,显示的是Father类里的变量。
以上完成了成员的覆盖。若需引用Grandfather类的protectednum时,需如下操作:
方法的覆盖
首先,对方法的覆盖进行语法和规则上的说明:
1.方法的覆盖只存在于有继承关系的类之间;
2.子类方法名称,参数个数和类型,必须与被覆盖的父类方法一致;
3.第二条成立,子类方法的返回值必须与被覆盖的父类方法一致;
4.第二条成立,子类方法的修饰符不能低于被覆盖的分类方法;
5.违反第二条,其实质是实现了方法的重载,而非覆盖;
关于instanceof
instanceof是个双目运算符,其作用是判断某个对象是否是某个类的对象。instanceof左边必须是个对象,右边必须是个类。其判断依据是若这个对象属于右边的类,或者左边的这个对象的类就是右边的类,或者左边的这个对象的类的父类属于或者就是右边这个类 则返回true 否者 返回false。