继承:
目的:实现对类的复用
关键字:extends,单继承
子类不能继承父类:私有属性,私有方法,构造方法
父类看子类:derive,派生
子类能访问的是:
子类继承父类的属性
子类重写父类的属性(叫隐藏)
子类继承父类的方法
子类重写父类的方法。(叫覆盖)
父类引用型变量不能访问:
子类新增的属性
子类新增的方法
(因为已经上转型了)
注意:
父类类型变量存放子类对象的地址:上转型。失去了子类特有的。
创建子类对象不会创建父类对象。通过绑定机制访问父类的私有属性。
子类访问父类的私有属性,该属性没有被子类继承。要通过访问在父类定义的被子类继承的,没有被子类重写或覆盖的方法访问。
实例全局变量归该类的所有的方法公有(也可以用来理解动态绑定机制)。在编译时,编译器把类和所有的属性(静态全局变量和实例全局变量)做一个静态绑定。
setWeight()是子类对象继承的,在父类定义的。
调用父类的构造方法,两件事。第一为父类私有属性初始化。第二为被子类继承的在子类对象里面的但是是在父类中定义的属性进行初始化。
创建子类对象:
(1)先为父类的私有属性在堆里开辟空间,不属于子类对象,
也没有创建父类对象。默认初始化。
(2)创建子类对象属性空间,默认初始化。
方法空间有从父类继承的方法和自己的新增方法。
(3)先调用父类的构造方法,传递的是子类对象的地址,
为了给父类的私有属性进行初始化,没有创建父类对象。
到This所指对象当中找不到weight属性,
到包含该构造方法的类中找到绑定的weight。(动态绑定)
(4)再调用子类的构造方法(会把子类对象的地址传到构造方法即this)。
两件事:第一为从父类继承的属性初始化,
第二为子类新增的属性初始化。
为子类对象的属性(包括从父类当中继承的)初始化。
重载:
前提:
同一个类中。(可以重载多次)
语法:
(1)方法名相同;
(2)参数签名(类型,个数,顺序)不同;
(3)对返回值类型没有要求;
(4)对访问权限没有要求。
结论:
在同一个类中不能有方法名相同参数签名相同的两个方法。
一个类中可以有多个重载的方法。
抽象方法可以被重载。
构造方法可以被重载。
主方法可以被重载。
静态方法可以被重载。
重载由编译器处理,在编译时期处理。叫做静态联编,静态多态,编译多态。
覆盖(方法的重写)
前提:
(1)出现在两个类之间。
(2)有继承关系。
(3)子类继承父类的方法。
(4)只能重写一次。
语法:
(1)子类的方法名和父类相同。
(2)参数签名相同。
(3)返回值类型相同。
(4)子类的访问权限要么和父类相同要么要大。>=
(5)子类覆盖父类的方法,不能比父类声明抛出更多的异 常。即子类要干大于等于父类的活儿。
(6)抽象方法一定要被重写/覆盖。
(7)父类静态方法只能被子类以静态方式重写,叫做隐藏。
(8)父类的私有方法不能被子类重写/覆盖。