1.多态:
(1)定义:同一事物在不同时刻表现出不同形态
(2)多态实现前提: 有继承关系
有方法重写
有父类引用指向子类对象
练习:Pet(宠物) : dog pig cat
Pet{String name; char sex;double size; eat() play() sleep() }
dog{eat()}
pig{eat()}
cat{eat()}
由于需求的更改,宠物的子类会越来越多!程序的扩展性会越来越差!如下代码:
//领养一只宠物猪
Pet pet1 = new Pig();
pet1.eat();
pet1.sleep();
//领养猫
Pet pet5 = new Cat();
pet5.eat();
pet5.sleep();
解决方案:
public class PetTool {
public void petTool(Pet pet1){
pet1.eat();
pet1.sleep();
}
} //创建一个PetTool的类,写一个方法,方法中传入类型,
//例如:上面解决方案中 Pet 是个父类,pet1是Pet对象
//pet1.eat();
//pet1.sleep();
//用pet1调用Pet的的方法
(3)多态的好处:提高程序的可维护性和可扩展性
维护性(继承)
可扩展(多态)
(4)成员访问的特点
Pet pet = new Pig();
pet.play()编译出错(play()子类特有的)
pet.eat();执行子类的eat()
成员方法:编译看左边,运行看右边,调用Pig中的eat方法
pet.name;调用父类的成员变量
成员变量:编译看左边,运行看左边
pet.jt();调用父类静态方法
静态方法:编译看左边,运行看左边
静态方法和类有关
(5)多态的弊端:不能访问子类的特有功能
(6)多态中的转型:向上转型 向下转型
Java培训特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了
但是还有人来请,就剩孔子在家,价格还挺高。孔子一想,我是不是可以考虑去呢?
然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子。就开始装爹
向上转型
孔子爹 k爹 = new 孔子();
到人家那里去了
System.out.println(k爹.age); //40
k爹.teach(); //讲解论语
k爹.playGame(); //这是儿子才能做的
讲完了,下班回家了
脱下爹的装备,换上自己的装备
向下转型
孔子 k = (孔子) k爹;
System.out.println(k.age); //20
k.teach(); //讲解论语
k.playGame(); //英雄联盟
2.抽象
(1)理解:看不到,摸不着 抽象概念
(2)实现:关键字abstract
修饰类 public abstract class 类名{}
修饰方法 public abstract 返回值类型 方法名();
(3)注意:a.抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
b.抽象方法只有声明没有实现,具体的实现需要通过一个普通类继承抽象类,并完成方法的实现!抽象类单继承!
c.抽象类不能实例化(使用向上转型)
d.抽象类的子类
: 要么是抽象类
要么重写抽象类中的所有抽象方法(子类:普通类)
(4)抽象类的成员特点:
成员变量
可以是变量
也可以是常量
构造方法
有构造方法,但是不能实例化
那么,构造方法的作用是什么呢?
用于子类访问父类数据的初始化
成员方法
可以有抽象方法 限定子类必须完成某些动作
也可以有非抽象方法 提高代码复用性
(5)abstract不能和哪些关键字共存
private 冲突
final 冲突
static 无意义
3.接口
(1)应用:Java中就提供了接口来定义这些额外功能,并不给出具体实现
(2)代码实现:
定义接口的关键字interface :public interface 接口名{}
类实现接口用关键字implements:class 类名 implements 接口名 {}
(3)注意事项:
a.接口不能实例化,通过多态
b.接口中的方法都是抽象方法,成员变量都是静态常量
c.类实现接口,必须实现接口中所有未实现的方法
d.接口和接口:多继承,多个接口之间用逗号隔开
类和接口:多实现,一个类可以同时实现多个接口,多个接口之间用逗号隔开
e.接口的子类(实现类)
可以是抽象类
可以是普通类:重写接口中的所有抽象方法
f.接口中的权限修饰符只能是public