JAVA三剑客之多态
多态概念叙述
1.JAVA是面向对象的程序设计语言,而面向对象程序设计的三大支柱是封装、继承和多态。多态是继封装和继承之后第三大特性。
2.借由现实事物对多态进行理解:程序员张三是个人,张三就包含了程序员和人两种特性。因为程序员是人的一种,所以可以说程序员继承了人这个类。java作为面向对象的语言,同样能描述对象的多种状态,如定义一个程序员的类,它是继承了人这个类的,那么一个程序员对象也是人。
3.多态体现为父类引用变量可以指向子类对象
4.前提条件,两个状态必须有子类父类关系
注意:在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
5.多态定义与使用格式:
定义格式:父类类型 变量名=new 子类类型();
6.理解:
1》多态是同一个行为具有多个不同表现形式或形态的能力。
2》多态就是同一个接口,使用不同的实例而执行不同操作。
多态的实现
继承是为多态的实现做铺垫,我们可以编写一个指向子类的父类类型引用,那么该引用既可以处理父类对象,也可以子类对象。当相同的指令发送给子类或者父类对象时,该对象就会根据自己所属的引用而执行不同的行为。多态就是相同的信息使得不同的类做出不同的响应
java实现多态的三个必要条件是:继承、重写和向上转型
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
!!向上转型!!
在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
//eg.s向上转型
public class Human{
public void who(){
System.out.println("I'm human.");
}
public static void main(String[] args){
Programmer p = new Programmer();
p.who();
Human h = new Teacher();//向上转型
h.who();//动态绑定
}
}
class Programmer extends Human{
@Override
public void who(){
System.out.println("I'm programmer");
}
}
class Teacher extends Human{
@Override
public void who(){
System.out.println("I'm teacher");
}
}
要点
1.向上转型不要强制转型
2.父类引用指向的或者调用的方法是子类的方法,这个叫做动态绑定
3.向上转型后父类引用不能调用子类自己的方法
!!向下转型!!
让父类调用子类拥有而自己没有的方法。
public class Human{
public void who(){
System.out.println("I'm Hunman");
}
public static void main(String[] args){
//1.向上转型
Teacher t1 = new Teacher();
Human h1 = t1;
h1.who();
//h1.speak();
//2.向下转型
Teacher t2 = new Teacher();
Human h2 = t2;
t2 = (Teacher)h2;
t2.speak();
//向下转型:类型防护
Human h3 = new Human();
if(h3 instanceof Teacher){
Teacher t3 = (Teacher)h3;
t3.speak();
}
}
}
class Teacher extends Human{
@Override
public void who(){
System.out.println("I'm Teacher");
}
public void speak(){
System.out.println("I can teach my students");
}
}
抽象类
· 抽象方法是出现在基类中的一种方法,但要求在派生类中被重写。
· 一个抽象方法只有方法头,没有方法主体
· 包含抽象方法的类就会自动办成抽象类,隐刺必须以abstract关键字声明。
· 抽象方法会被用来确保派生类会实现这个方法
· 若类含有抽象方法,则类必须以abstract关键字声明为抽象类
eg.public abstract class
· 抽象类可以含零或多个普通方法,也可以含零或多个抽象方法
· 不论抽象类是否含有抽象方法,其都不允许实例化,即不能创建抽象类的对象,因为其描述的是抽象概念。它只能作为其他类的基类。
· 若父类是抽象类,且子类不想成为抽象类,则子类必须将父类中所有抽象方法重写为带方法体的普通方法,否则子类仍必须是抽象类。
总结
在面向对象编程的时候,我们遇到的对象通常都会具有多种特性,我们要实现这个对象的程序化就必须也把它的多种特性表现出来。可以说,封装就是组装了一个人偶,继承则是给它装上了工具,而多态则是给他赋予了思想和性格。