1.概述,
1.Java引用变量有两个类型,一个是编译时类型,一个是运行时类型。
2.编译时类型由声明该变量时使用的类型决定
3.运行时类型由实际赋值给该变量的对象决定
4.编译时类型和运行时类型不一致,就可能出现多态
5.父类引用指向子类对象(将子类对象赋值给父类引用变量)时,编译时类型为父类,运行时类型为子类,运行时调用该引用变量方法时,方法形式总是表现出子类方法的行为特征,而不是父类方法的行为特征,所以就会出现,相同类型的变量,调用同一个方法时,呈现出不同的行为特征,这就是多态
6.与方法不同的是,实例的变量不具有多态性,访问的变量依旧是父类的实例变量
2.向上转型
1.子类是特殊的父类。Java允许把一个子类对象直接赋值给父类引用变量,无须任何类型转换,成为向上转型,向上转型自动完成
3.引用变量的强制类型转换
1.引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法
2.如果需要引用变量调用运行时类型的方法,可以强制类型转换为运行时类型,强制类型转换借助类型转换运算符()小括号
4.类型转换运算符
1.可以将一个基本类型变量转换成另一个类型
2.将一个引用类型变量转换成子类类型
3.基本类型之间的转换只能在数值类型之间转换,数值型(整型、字符型、浮点型)数值型和布尔型之间不能转换
4.引用类型之间转换只能在具有继承关系的两个类型之间进行转换
5.组合与继承
1.继承是实现类复用的重要手段
2.继承有一个最大的缺点是:破坏封装
3.组合也可以实现类复用,而且采用组合方式来实现类复用可以提供更好的封装
4.子类扩展父类,子类可以从父类继承得到成员变量和方法,如果访问权限允许,子类可以直接访问父类成员变量和方法,造成子类和父类的严重耦合
5.封装:每个类都应该封装它内部信息和实现细节,向外提供必要的方法给其他类访问。
6.为了保证父类具有良好的封装原则,不会被子类随意篡改,设计父类应该遵循一下规则
6.1 尽量隐藏父类的内部信息,尽量把父类所有成员变量设置成private访问类型,不要让子类直接访问到父类变量
6.2 不要让子类可以随意访问、修改父类的方法,除父类中工具方法外,
6.3 使用private访问控制修饰符,让子类无法访问该方法
6.4 使用public访问修饰控制符修饰必须要被外部类调用的方法
6.5 使用fianl修饰符修饰不希望让子类重写的方法
6.6 使用protected修饰,希望父类中的某个方法被子类重写,而不被其他类自由访问
7.复用一个类,除了把这个类当作基类(父类)外,还可以把该类当作另一个类的组合部分。从而允许新类直接复用该类的public方法
8.组合是把旧类对象当作新类的成员变量组合进来,用来实现新类的功能。,
9.通常在新类里使用private修饰被组合的旧类对象
10.继承要表达的是 is -a的关系 组合是表达 has -a的关系
6.注意
1.引用变量在编译阶段,只能调用其编译时类型所具有的方法,但运行时执行它运行时类型所具有的方法
2.因此,引用变量只能调用声明该变量时所用的类里包含的方法,例如 Object obj = new Person();定义一个obj变量,这个obj变量只能调用object类的方法Object类所包含的方法,不能调用Person类所包含的方法
3.通过引用变量来访问其包含的实例变量时,总是 访问它编译时类型所定义的成员变量,而不是它运行时类型所定义的成员变量