@Java入门基础
多态
1.多态概述
在同一个方法中,由于参数类型不同而导致执行效果各异的现象就是多态;
在Java中为了实现多态,允许使用一个父类类型的变量来引用一个子类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果;
例如:
Animal a = new Cat();
要实现一个动物叫的方法,由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当传入猫类对象的叫声时就发出猫类的叫声,传入犬类对象的叫声时就发出犬类的叫声;
例如:
Example1:
//定义接口Animal
interface Animal{
void shout();//定义抽象shout()方法
}
//定义cat类实现Animal接口
class Cat implements Animal{
//实现shout()方法
public void shout(){
System.out.println("miaomiao");
}
}
//定义Dog类实现Animal接口
class Dog implements Animal{
//实现shout()方法
public void shout(){
System.out.println("wangwang");
}
}
//定义测试类
public class Example1{
public static void main(String[] args) {
Animal an1 = new Cat();//创建Cat对象,使用Animal类型的变量an1
Animal an2 = new Dog();//创建Dog对象,使用Animal类型的变量an2
animalShout(an1);//调用animalShout()方法,将an1作为参数传入
animalShout(an2);//调用animalShout()方法,将an2作为参数传入
}
//定义静态的animalShout()方法,接收一个Animal类型的参数
public static void animalShout(Animal an){
an.shout();//调用实际参数的shout()方法
}
}
父类引用两个不同的子类对象分别调用animalShout()方法,打印出不同的结果。多态不仅解决了方法同名的问题,而且使程序变得更灵活,从而有效的提高程序的可扩展性和可维护性。
2.对象的类型转换
- 子类向父类转换为隐式转换
- 父类向子类转换为强制类型转换
当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。
例如:
Example2:
interface Animal{
void shout();
}
class Cat implements Animal{
public void shout(){
System.out.println("miaomiao");
}
public void sleep(){
System.out.println("cat is sleeping");
}
}
public class EXample2 {
public static void main(String[] args) {
Cat cat = new Cat();
animalShout(cat);
}
public static void animalShout(Animal animal){
animal.shout();
animal.sleep();
}
}
运行结果:
main方法中,Cat对象被当作父类Animal类型使用。但Animal类中没有定义sleep()方法;提示错误信息;
将animalShout()方法进行修改
public static void animalShout(Animal animal){
Cat cat = (Cat) animal;//将animal对象强制转换为Cat类型
cat.shout();//调用cat的shout()方法
cat.sleep();//调用cat的sleep()方法
}
运行结果如下:
Example3:
interface Animal{
void shout();
}
class Cat implements Animal{
public void shout(){
System.out.println("miaomiao");
}
void sleep(){
System.out.println("cat is sleeping");
}
}
class Dog implements Animal{
public void shout(){
System.out.println("wangwang");
}
}
public class Example132 {
public static void main(String[] args) {
Dog dog = new Dog();
animalShout(dog);
}
public static void animalShout(Animal animal){
Cat cat = (Cat) animal;
cat.shout();
cat.sleep();
}
}
在运行时报错,提示Dog类型不能转换成Cat类型,出错的原因是,在调用animalShout()方法时,传入一个Dog对象,在强制类型转换时,Animal类型的变量无法强转为Cat类型;
因此,引入一个instanceof,它可以判断一个对象是否为某个类的实例或者子类实例;
对象(或者对象引用变量)instanceof 类(或接口)
修改后:
public static void animalShout(Animal animal){
if(animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.shout();
cat.sleep();
}else {
System.out.println("this animal is not a cat");
}
}
运行结果:
使用instanceof 关键字判断animalShout()方法中传入的对象是否为Cat类型,如果是Cat()类型就进行强制类型转换,否则就打印"this animal is not a cat";