【Java】多态性
多态性
可以理解为一个事物的多种形态。
对象的多态性:父类的引用指向子类的对象。只适用于方法,不适用于属性(编译和运行都看左边)
总结:对于对象的多态性,编译,看左边;运行,看右边。
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
虚拟方法:子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。
多态性的使用前提:
- 类的继承关系
 - 方法的重写
 
使用实例:
class Animal{
	
	public void eat(){
		System.out.println("动物:进食");
	}
	
	public void shout(){
		System.out.println("动物:叫");
	}	
}
class Dog extends Animal{
	public void eat(){
		System.out.println("狗吃骨头");
	}
	
	public void shout(){
		System.out.println("汪!汪!汪!");
	}
	
	public void watchDoor(){
		System.out.println("看门");
	}
}
class Cat extends Animal{
	public void eat(){
		System.out.println("猫吃鱼");
	}
	
	public void shout(){
		System.out.println("喵!喵!喵!");
	}
}
 
public class Test {
	
	public static void main(String[] args) {
		
		Test test = new Test();
		test.func(new Dog());
		
		
		test.func(new Cat());
	}
	
	public void func(Animal animal){//Animal animal = new Dog();
		animal.eat();
		animal.shout();
		}
}
 
向下转型
public class Person {
	String name;
	int age;
	
	int id = 1001;
	
	public void eat(){
		System.out.println("人:吃饭");
	}
	
	public void walk(){
		System.out.println("人:走路");
	}
	
}
public class Man extends Person{
	
	boolean isSmoking;
	
	int id = 1002;
	
	public void earnMoney(){
		System.out.println("男人负责挣钱养家");
	}
	
	public void eat(){
		System.out.println("男人多吃肉,长肌肉");
	}
	
	public void walk(){
		System.out.println("男人霸气的走路");
	}
}
 
有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
p2.name = "Tom";
p2.earnMoney();//无法调用
p2.isSmoking = true;//无法调用
 
如何调用子类特有的属性与方法呢?
向下转型:使用强制类型转换符。
Man m1 = (Man)p2;
m1.earnMoney();//可以调用
m1.isSmoking = true;//可以调用
 
使用强转时,可能出现ClassCastException的异常。
Woman w1 = (Woman)p2;
w1.goShopping();//man不能转成woman
 
此时应该用instanceof来判断是否可以向下转型。
判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。
使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先
 进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
//编译时通过,运行时不通过
Person p3 = new Woman();
Man m3 = (Man)p3;
//编译通过,运行时也通过
Object obj = new Woman();
Person p = (Person)obj;
//编译不通过
Man m5 = new Woman();
String str = new Date();		
Object o = new Date();
String str1 = (String)o;
                

                
            
        
浙公网安备 33010602011771号