1.多态:1>一个对象的多个形态;// 父类名 对象名 = new 子类名();/ 接口名 对象名 = new 实现类名();
2>访问成员变量的方法:<1>直接通过对象名访问成员变量:(左看变量,右看方法)看等号左边是谁,优先用谁,没有就向上找;
<2>间接通过成员方法访问:看该方法属于谁,优先用谁,没有再向上找;(编译看左,运行看右)
2.对象的转型:1>向上转型:父类名 对象名 = new 子类名(); // 把创建的子类当父类看;(向上转型一定是安全的,因为是从小范围到大范围)
PS:对象一旦向上转型,就不能使用原本的子类方法;
2>向下转型:子类名 对象名 = (子类名)父类对象;// 将父类对象还原成本来的子类对象,原来是什么只能还原成什么,
否则会出现ClassCastException异常;
/* Animal animal = new Cat();
Cat cat = (Cat) animal; */
3>如何知道一个父类引用的对象,本来是什么子类:对象 instanceof 类名
/* Animal animal new Dog();
if (annimal instanceof Dog){
Dog dog = (Dog) animal; } */
3.例题:笔记本USB接口案例:
4.final关键字:1>修饰一个类:当前类的所有成员方法不能进行覆盖重写,且这个类不能有子类,可以有父类;
//public final class Myclass{ }
2>修饰一个成员方法:该方法不能被覆盖重写,对于类和方法来说,abstract(必须背覆盖重写)和
final(不行被覆盖重写)因为矛盾,不能同时使用;
//修饰符 final 返回值类型 方法名(参数列表){方法体}
3>修饰一个局部变量:final修饰局部变量,这个变量的赋值就不能被更改;// final int num = 2;
基本变量的数据值不变,引用变量的地址值不能改变;
4>修饰一个成员变量:final修饰后,变量不可变,且需要手动赋值;直接赋值或者通过构造方法赋值;
要保证类中所有重载的构造方法,最终都会对final的成员变量进行赋值。
5.权限修饰符: 同一类 同一包 不同包子类 不同包非子类
1>public: ✅ ✅ ✅ ✅
2>protected: ✅ ✅ ✅ ❌
3>(default): ✅ ✅ ❌ ❌
4>private: ✅ ❌ ❌ ❌