面向对象(中)-向下转型的使用、instanceof关键字的使用、向下转型的几个常见问题
package top.qaqaq.java.P287;

public class Person {
	
	String name;
	int age;
	
	int id = 1001;
	
	public void eat() {
		System.out.println("人:吃饭");
	}
	
	public void walk() {
		System.out.println("人:走路");
	}

}
package top.qaqaq.java.P287;

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("男人霸气的走路");
	}
}
package top.qaqaq.java.P287;

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("女人窈窕的走路");
	}
}
package top.qaqaq.java.P287;

import java.util.Date;

/*
 * 面向对象特征之三:多态性
 * 
 * 1. 理解多态性:可以理解为一个事物的多种形态。
 * 2. 何为多态性:
 * 		对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
 * 
 * 3. 多态的使用:虚拟方法调用
 * 		有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
 * 		总结:编译,看左边;运行,看右边。
 * 
 * 4. 多态性的使用前提:① 类的继承关系 ② 方法的重写
 * 
 * 5. 对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边)
 * 
 * ******************************************************************
 * 
 * 
 */
public class PersonTest {
	
	public static void main(String[] args) {
		
		Person p1 = new Person();
		
		p1.eat();
		
		Man man = new Man();
		man.eat();
		man.age = 25;
		man.earnMoney();
		
		//*****************************************************
		System.out.println("***********************************");
		
		//对象的多态性:父类的引用指向子类的对象
		Person p2 = new Man();
//		Person p3 = new Woman();
		
		//多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法 ---虚拟方法调用
		p2.eat();
		p2.walk();
		
//		p2.earnMoney();
		
		System.out.println(p2.id);//1001
		
		System.out.println("***********************************************************");
		//不能调用子类所特有的方法、属性:编译时,p2是Person类型。
//		p2.earnMoney();
		p2.name = "Tom";
//		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。
		 * 
		 * 
		 * 使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先
		 * 进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
		 * 
		 * 如果a instanceof A返回true,则a instanceof B也返回true.
		 * 其中,类B是类A的父类
		 * 
		 * 
		 */
		
		if(p2 instanceof Woman) {
			Woman w1 = (Woman)p2;
			w1.goShopping();
			System.out.println("*******Woman*******");
		}

		if(p2 instanceof Man) {
			Man m2 = (Man)p2;
			m2.earnMoney();
			System.out.println("*******Man*******");
		}
		
		if(p2 instanceof Person) {
			System.out.println("*******Person*******");
		}
		
		if(p2 instanceof Object) {
			System.out.println("*******Object*******");
		}
		
		//练习:
		//问题一:编译时通过,运行时不通过
		//举例一:
//		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;
	}

}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇