多态

###多态

*编译器多态  -  方法重载 方法名称相同方法参数不同。

*运行时多态 - 在程序运行时判断到底是那个类(父类还是子类),进而确定要调用的是父类方法还是子类方法。

*所谓多态就是子类对象和父类对象相互转化的关系

*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 修饰的成员变量:成员变量使常量,只能被赋值一次。赋值后无法改变

你可能感兴趣的:(多态)