天天看點

【java初學筆記4】馬士兵-java-面向對象-37->38對象轉移

1.對象轉移與基礎類型的轉換類似,隻不過這個是針對對象的類型轉換;

2.一個基類的引用類型變量可以指向其子類的對象,也就是說基類可以把子類當做自己這個類的一個對象引用,但是有一些限制(見下條)。

   如Animal類的一個對象a,可以轉化成Dog類的一個對象使用。

3.但是基類的引用不能其子類新增的變量和方法。也就是說,a這個Animal對象轉化成Dog後可以當Animal用,但不可以當Dog來用;

4. 見下例:

class Animal{
	String name;
	public Animal(String name){
		this.name = name;
	}
}

class Dog extends Animal{
	String furcolor;
	public Dog(String name,String furcolor){
		super(name);
		this.furcolor = furcolor;
	}
}

class Cat extends Animal{
	String eyecolor;
	public Cat(String name,String eyecolor){
		super(name);
		this.eyecolor = eyecolor;
	}
}

public class TestCasting{


	public static void main(String[] args){
		Animal a = new Animal("Animal_Name");
		Dog d = new Dog("Dog_Name","Yellow");
		Cat c = new Cat("Cat_Name","Blue");

		System.out.println(a.name);
		System.out.println(d.name+"  "+d.furcolor);
		System.out.println(c.name+"  "+c.eyecolor);

		a = new Dog("Snow","White");
		System.out.println(a.name);
		//System.out.println(a.furcolor);//error
		System.out.println(a instanceof Animal);
		System.out.println(a instanceof Dog);

		Dog d2 = (Dog)a;
		System.out.println(d2.furcolor);

		TestCasting tc = new TestCasting();//記住,要調用main函數裡面的方法,要先建立一個main類的對象,用該對象調用
		tc.getInfo(a);
		tc.getInfo(d);
		tc.getInfo(c);
		tc.getInfo(d2);
	}


	public void getInfo(Animal a){
		System.out.println("name is "+a.name);
		if(a instanceof Dog){
			Dog dog = (Dog)a;
			System.out.println("furcolor is "+dog.furcolor);
		}
		else if(a instanceof Cat){
			Cat cat = (Cat)a;
			System.out.println("eyecolor is "+cat.eyecolor);
		}
	}
}