向下转型及instanceof关键字的使用和常见问题

向下转型&使用instanceof进行判断
向上转型&多态
强制类型转换
自动类型提升
父类
子类
较高级的基本数据类型
较低级的基本数据类型

2.向下转型:nstanceof关键字的使用
*
* a instanceof A:判断对象a是否是A的实例。如果是,返回true;如果不是,返回false.
*
*使用情景:为了避免在向下转型时出现ClassCastExpection的异常,我们在向下转型之前,
* 先进行instaceof的判断,一旦返回true,就进行向下转型;否则,不进行向下转型。
*
* 如果a instaceof A返回true,且a instanceof B也返回true,
* 则类B是类A的父类。
3. //问题一:编译时通过,运行时不通过
// Person p3=new Woman();
// Man m3=(Man)p3;

// Person p4=new Person();
// Man m4=(Man)p4;

    //问题二:编译通过,运行时也通过
    Object obj=new Woman();
    Person p=(Person)obj;

    //问题三:编译也不过

// Man m5=new Woman();
// String str=new Date();

// Object o=new Date();
// String str1=(String)o;

package tttt;

public class Person{
	String name;
	int age;

	public void eat(){
	System.out.println("人可以吃饭");
	}
	public void walk(){
	System.out.println("人可以走路");
	}
}

public class Man extends Person{
	boolean isSmoking;
	
	public void earnMoney(){
	System.out.println("会挣钱");
	}
	
	public void eat(){
	System.out.println("多吃饭");
	}
	public void walk(T){
	System.out.println("多走路");
	}
}

public class Woman extends Person{
	boolean isBeauty;
	
	public void goShopping(){
	System.out.println("喜欢购物");
	}
	
	public void eat(){
	System.out.println("少吃饭");
	}
	public void walk(){
	System.out.println("走路");
	}
}

public class PersonTest{
	public static void main(String args[]){
		Person p1=new Person();
		p1.eat();
		
		Man man=new Man();
		man.eat();
		man.age=30;
		man.earnMoney();

		System.out.println("#####################");
		//对象的多态性:父类的引用指向子类的对象
		Person p2=new Man();
		//多态的使用:当调用子父类同名同参数的方法时,实际上是子类重写父类的方法---虚拟方法调用
		p2.eat();
		p2.walk();
		
		System.out.println("######################");
		//不能调用子类所持有的方法,编译时,p2是Person类型。
//		p2.earnMoney();
//      p2.isSmoking=true;
//      有了对象的多态性以后内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类       //      类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。

        //如何才能调用子类特有的属性和方法呢?
        //向下转型:使用强制类型转换符。
        Man m1=(Man)p2;
        m1.earnMoney();
        m1.isSmoking=true;
         //使用强转时,可能出现ClassCastException的异常。
//      Woman w1=(Woman)p2;
//      w1.goShopping;
		
		/*
        * instanceof关键字的使用
        *
        * a instanceof A:判断对象a是否是A的实例。如果是,返回true;如果不是,返回false.
        *
        *使用情景:为了避免在向下转型时出现ClassCastExpection的异常,我们在向下转型之前,
        * 先进行instaceof的判断,一旦返回true,就进行向下转型;否则,不进行向下转型。
        *
        * 如果a instaceof A返回true,且a instanceof B也返回true,
        * 则类B是类A的父类。
        *
        * */
        if(p2 instanceof Man){
            Man m2=(Man)p2;
            m2.earnMoney();
            System.out.println("****Man*****");
		 //问题一:编译时通过,运行时不通过
//      Person p3=new Woman();
//      Man m3=(Man)p3;

//      Person p4=new Person();
//      Man m4=(Man)p4;

        //问题二:编译通过,运行时也通过
        Object obj=new Woman();
        Person p=(Person)obj;

        //问题三:编译也不过
//      Man m5=new Woman();
//      String str=new Date();

//      Object o=new Date();
//      String str1=(String)o;
	}
}

发布了30 篇原创文章 · 获赞 0 · 访问量 81

猜你喜欢

转载自blog.csdn.net/qq_45370866/article/details/105480692
今日推荐