多态

93 阅读4分钟

多态:事物存在的多种形态。

水:固态:冰 气态:水蒸气

+: +两边是数字 算术运算符 +两边有一边是字符串 就是连接运算符

角色: 教室:学生 家里:儿子 社会:孙子

java中体现多态:

3个前提条件:

1.要有继承关系

2.要有方法重写

3.要有向上造型

注意:

  • 成员变量

编译看=左边,运行看=左边

  • 成员方法

编译看=左边,运行看=右边

  • 静态方法

编译看=左边,运行看=左边

因为static修饰的成员隶属本类,所以算不上重写,只有非静态方法才是编译看左边,运行看右边

public static void main(String[] args) { 
//3.要有向上造型(父类引用指向子类对象) 
Animal a = new Cat();// 猫是一个动物 
a.eat();// 这个动物的吃饭功能:猫吃鱼... 
System.out.println(a.legs);//4 
//a.method(); 
Animal.method(); 
// 多态弊端:父类引用无法直接调用子类独有的成员方法 
//a.catchMouse(); 
// 向下造型 
Cat c = (Cat)a; // 引用数据类型的强制转换 
c.catchMouse();//猫抓老鼠..... 
} 
} 
class Animal{// 动物类 父类
int legs = 4; // 成员变量 
public void eat() { 
System.out.println("动物吃饭..."); 
} 
public static void method() {//静态方法 
System.out.println("父类的静态方法....."); 
} 
}
class Cat extends Animal{// 猫 子类 1.要有继承关系 
int legs = 2; 
// 2.要有方法重写
public void eat() { 
System.out.println("猫吃鱼..."); 
}
public static void method() { System.out.println("子类的静态方法.....");
} public void catchMouse() {// 子类独有的方法 
System.out.println("猫抓老鼠....."); 
} }
public static void main(String[] args) { 
// Dog d = new XiaoTianQuan(); 
// d.method(); 
// Dog d1 = new JinMao(); 
// d1.method(); 
method(new XiaoTianQuan()); 
method(new JinMao()); 
method(new LBLD()); 
} 
// 实际开发的时候,一般不会直接写父类引用指向子类对象 
// 而是把父类引用做为形式参数 用于接收子类对象,从而达到代码复用的效果 
public static void method(Dog d) { // Dog d = new XiaoTianQuan; 动态绑定 
d.method(); 
if(d instanceof XiaoTianQuan) { // instanceof 判断某个引用是否是某个类型 
XiaoTianQuan x = (XiaoTianQuan)d;
x.A(); 
} } }

抽象类(abstract):看不懂就是抽象

  • abstract可以修饰类,和方法,不可以修饰成员变量的

  • 修饰类:该类就是抽象类

  • 修饰方法:该方法就是抽象方法

  • 注意:

  • 有抽象方法的类,必须是抽象类(抽象类是不能实例化的,因为是看不懂的,模糊的,抽象类一般用于父类,通过子类去继承来变向的实例化,从而达到简化代码的目的)

  • 抽象类的子类:

  • 要么是抽象类

  • 要么重写抽象类的抽象方法

  • 在抽象类中,既可以有抽象方法,也可以有普通方法

  • 抽象方法:强制要求子类要做的事情

  • 普通方法:子类继承的事情,提高代码的复用性

  • 抽象类中,可以有构造方法,用于子类访问父类的成员数据的初始化

接口:接口是一个特殊的抽象类

  • 关键字: interface

  • java8之前接口中只能有 抽象方法 和 常量(final修饰的变量,其值是不可以被改变的):

  • java8的时候:

  • 1.抽象方法 (重点)

  • 2.常量 会在数据类型前面加一个final (重点)

  • 3.默认方法 可以解决接口升级的问题,子类可以重写默认方法也可以不重写

  • 4.静态方法

  • java9的时候:

  • 1.抽象方法

  • 2.常量

  • 3.默认方法

  • 4.静态方法

  • 5.私有方法

  • 什么时候用接口???

  • 如果你想让所有子类强制重写你父类的方法的时候,就可以用接口 接口其实就是一种强制性的约束

  • 如果你想让所有子类重写部分你父类的方法的时候,就可以用抽象类

接口的总结:

  • 类和类之间、类和接口之间、接口和接口之间的关系

  • 1.类和类之间

  • 继承关系:通过extends关键字继承,java只允许单一继承,但是可以多层继承(多层传递)

  • 2.类和接口之间

  • 实现关系:通过implements关键字实现,java中允许多实现 一个可以实现多个接口(解决java不能多继承的问题)

  • 3.接口和接口之间

  • 继承关系:通过extends关键字继承,通过接口可以做到多实现