多态(动态绑定)(持绑定):
1:多态是指“在执行期间”(而非编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
2:所谓多态,就是指一个引用(类型)在不同的情况下的多种状态。也可以理解为,多态是指通过指向父类的指针,来调用在不同子类中实现的方法。。
例:
class Animal {
private String name;
Animal (String name) { this.name = name;}
public void enjoy(){ //第一个enjoy方法
System.out.println("叫声.....")
}
}
class Cat extends Animal {
private String eyeColor;
Cat(String n, String c) { super (n) ; eyeColor = c ; }
public void enjoy() { //第二个enjoy方法,重写了父类中的enjoy方法
System.out.println("猫叫声....");
}
}
class Dog extends Animal {
private String furColor;
Dog(String n,String c) { super (n); furColor = c;}
public void enjoy(){ //第三个enjoy方法
System.out.println("狗叫声......");
}
}
class Lady {
private String name;
private Animal pet;
Lady(String name, Animal pet) {
this.name = name;
this.pet = pet;
}
public void myPetEnjoy() { pet.enjoy(); } //调用enjoy方法,调用哪个enjoy方法,根据实际类型来判断,**这就是多态**
}
public class Test {
public static void main(String [] args) {
Cat c = new Cat("catname","blue");
Dog d = new Dog("dogname","black");
Lady l1 = new Lady("l1",c); //Lady类中的L1中的c,指向上 Cat c = new Cat("catname","blue")
Lady l2 = new Lady("l2",d);
l1.myPetEnjoy();
l2.myPetEnjoy();
}
}
多态存在的三个必要条件:
1: 要有继承。
2:要有重写。
3:父类引用指向子类对象。
(当满足这三个条件后,调父类中的被重写方法时,实际中new得失哪个子类对象,就调用哪个子类中的方法)
抽象类:
1:用abstract关键字来修饰一个类时,这个类叫做抽象类;
用abstract关键字来修饰一个方法时,这个方法叫做抽象方法。
2:含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。
3:抽象类不能被实例化。
4:抽象方法只需声明,而不需实现。
例:
//父类Animal类中的enjoy方法没有实现的必要,但是有定义的必要
class Animal {
private String name;
Animal (String name) { this.name = name;}
public void enjoy(){
System.out.println("叫声.....") //这句话其实并没有实现,在这里引入抽象的概念,改写, 定义enjoy这个重写方法,在子类中必须被重写,这个类中含有了抽象方法,则这个类需要被声明为抽象类。
}
}
abstract class Animal { //声明为抽象类
private String name;
Animal (String name) { this.name = name;}
public abstract void enjoy(); //声明为抽象方法
}
}
//子类如果不想重写enjoy方法,只需要声明自己也是一个抽象类,交由自己的子类继承,重写。
class Cat extends Animal {
private String eyeColor;
Cat(String n, String c) { super (n) ; eyeColor = c ; }
public void enjoy() {
System.out.println("猫叫声....");
}
}