###多态
*编译器多态 - 方法重载 方法名称相同方法参数不同。
*运行时多态 - 在程序运行时判断到底是那个类(父类还是子类),进而确定要调用的是父类方法还是子类方法。
*所谓多态就是子类对象和父类对象相互转化的关系
*1.向上转型 父类 父类对象 = new 子类对象() Animal a1 = new Cat("小喵");
*2.向下转型 子类 子类对象 = (父类)对象; //强转
####多态的好处 : 把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
###多态实现的关键
*1.要有继承关系
*2.要有方法重写
*3.父类引用指向子类对象
* 1.编写方法时使用父类做形参 public void feed(Animal animal)
* 2.将子类对象作为实参传递给改方法
Animal a1 = new Cat("小喵");
student.feed(a1);
* 3.运行时根据实参类型
*里氏替换原则:所有出现父类对象的地方都可以用子类替换
###匿名类对象
*xiaoxin.feed(new Cat("小白"))//因为该cat1对象只在程序代码中使用1次,以后不会再次引用操作它,所有我们使用匿名对象。就使用一次,使用后立即释放。
*过去写
* Cat1 cat1 = new Cat1("小白");
* xiaoxin.feed(cat1);
###抽象类
*用abstract关键字修饰的类 叫抽象类。不希望被实例化(new)类,一般可创建为抽象类
###抽象方法
*使用abstract 关键字修饰的方法,只有方法的声明,不包含方法的实现
public abstract void eat();
*含有抽象方法的类一定是抽象类
*抽象类是不能实例化的只能被继承。抽象类的子类必须重写父类的抽象方法
@Override
public void eat() {
System.out.println("我是一只可爱的小猫,我叫"+this.name+",我正在吃鱼");
}
*若未重写相关抽象方法。则子类也是抽象类
*构造函数,static,final,private。(不要加抽象关键字abstract)
定义类时 可以使用的修饰符是 public final abstract 或者不写
###静态(类)方法和静态成员变量
*在方法声明中加入关键字static 表示无需创建类对象即可调用的方法:
* 1.类对象根本不存在。列如你要创建类对象
* 2.不需要关联任何类对象的时候。例如:Math 类中的相关算数方法
static string name;
public static void sayHi()
*仅能调用其他的静态方法,只能访问静态数据,不能引用this和super
*静态成员变量和静态方法都是使用 类名.属性名 类名.方法名 去调用。
Cat.name = "小喵";
Cat.sayHi();
*静态的变量本质上变为全局变量,就是声明一个对象不会产生多个静态变量的拷贝,只会分配一块内存空间,共享同一个变量
###super的作用
*1.直接引用。类似于this。相当于指向当前对象的父类
* super.age
*2.子类成员与父类成员同名
* super.sayHi();
*3.引用构造函数
* super();
###final
*final 修饰类:不允许被继承 final 和 abstract冲突 不要同时加
*final 修饰的方法:不允许被子类重写 override
*final 修饰的成员变量:成员变量使常量,只能被赋值一次。赋值后无法改变