一.概念
父子概念的继承:圆继承于图形,圆是子概念(子类型 Sub class)图形是父类型(Super Class也叫超类),继承在语法方面的好处:子类共享了父类的属性和方法的定义,子类复用了父类的属性和方法,节省了代码。
1)继承是is a :“是”我中的一种,一种所属关系。
2)子类型对象可以赋值给父类型变量(多态的一种形式),变量是代词,父类型代词可以引用子类型东西。
3)继承只能是单继承,即直接继承,而非间接继承。因为多继承容易带来安全隐患,当多个父类中定义了相同功能,当功能内容不同时,子类无法确定要运行哪一个。
4)父类不能强转成子类,会造型异常!子类向父类转化是隐式的。
5)只有变量的类型定义的属性和方法才能被访问!见下例。
6)重写遵循所谓“运行期绑定”,即在运行的时候根据引用变量指向的实际对象类型调用方法。
7)引用类型变量的类型转换 instanceof
public static void main(String[] args) {
Circle c = new Circle(3,4,5);
Rect r = new Rect(3,4,5,6);
Shape s = c;
Shape s1 = r;
//Circle x = s;//编译错误,父类型变量不能赋值给子类型
Circle x = (Circle)s;//正常执行
//Circle y = (Circle)s1;//运行异常,类型转换异常
//instaceof instace:实例 of:的
//instaceof 运算 检查变量引用的对象的类型是否兼容
//s引用的是圆对象,s instanceof Circle 检查s引用的对象是否是Circle类型的实例!
System.out.println(s instanceof Circle);//true
System.out.println(s1 instanceof Circle);//false
test(c);
test(r);
}
public static void test(Shape s){//多态的参数
//if(s instanceof Circle)保护了(Circle)s不会出现异常
if(s instanceof Circle){//实现了安全的类型转换
Circle c = (Circle) s;
System.out.println("这是一个圆, 面积"+c.area());
}
if(s instanceof Rect){
Rect r = (Rect) s;
System.out.println("这是一个矩形, 面积"+r.area());
}
}
8)继承时候对象的创建过程
①Java首先递归加载所有类搭配方法区。②分配父子类型的内存(实例变量)。③递归调用构造器。
9)重写方法与重载方法的调用规则
10)属性绑定到变量的类型,由变量类型决定访问哪个属性;方法动态绑定到对象,由对象的类型决定访问哪个方法。(强转对方法动态绑定到对象无影响,因为强转的是父类的引用,而实例是没变的,只是把实例当作另一个状态去看而已。但是强转对属性动态绑定到变量类型有影响。
eg1:方法动态绑定到运行期间对象的方法 实例1
eg2:方法动态绑定到运行期间对象的方法 实例2
11)为何查阅父类功能,创建子类对象使用功能?
Java中支持多层继承,也就是一个继承体系。想要使用体系,先查阅父类的描述,因为父类中定义的是该体系中共性的功能,通过了共性功能,就可以知道该体系的基本功能,那么这个体系已经可以基本使用了,然而在具体调用时,要创建最(低)子类的对象,原因如下:①因为父类有可能不能创建对象②创建子类对象,可以使用更多的功能,包括基本的也包括特有的。
12)属性无继承概念,所以你有你的,我有我的,各自调用各自的,不影响,即使子父类中有同名属性也无影响。