多态:事物存在的多种形态。
水:固态:冰 气态:水蒸气
+: +两边是数字 算术运算符 +两边有一边是字符串 就是连接运算符
角色: 教室:学生 家里:儿子 社会:孙子
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关键字继承,通过接口可以做到多实现