Android java基础_多态性

一.Android Java基础_多态性

向上转换:只能定义被子类覆写的方法,不能调用在子类中定义的方法。

复制代码
class Father {
	private int money;	

	public int getMoney() {return money; }
	public void setMoney(int money) {this.money = money; }

	public void printInfo() {System.out.println("This is Father");}

}

class Son extends Father{
	public void printInfo() {System.out.println("This is son");}
	public void playGame() {System.out.println("playGame ...");}
	
}

class Daughter extends Father{
	public void printInfo() {System.out.println("This is daughter");}

	
}

public class Cnv {
	public static void main (String args[]) {
		Son son = new Son();
		Daughter daughter = new Daughter();

		Father f = son; /*  */
		f.printInfo();

		//f.playGame();

		f = daughter;
		f.printInfo();
		
	}
}

运行结果:

复制代码
root@ubuntu:/home/topeet/guyilian# javac Cnv.java 
root@ubuntu:/home/topeet/guyilian# java Cnv
This is son
This is daughter

JAVA向下转换的例子,在进行对象的向下转换前,必须首先发生对象的向上转换.否则会编译不过

复制代码
class Father {
	private int money;	

	public int getMoney() {return money; }
	public void setMoney(int money) {this.money = money; }

	public void printInfo() {System.out.println("This is Father");}

}

class Son extends Father{
	public void printInfo() {System.out.println("This is son");}
	public void playGame() {System.out.println("playGame ...");}
	
}

class Daughter extends Father{
	public void printInfo() {System.out.println("This is daughter");}

	
}

public class Cnv2 {
	public static void main (String args[]) {
		Father f = new Son();
		Son son = (Son)f;   /* Son son = new Son(); */
	}
}

运行结果:

复制代码
root@ubuntu:/home/topeet/guyilian# javac Cnv2.java 
root@ubuntu:/home/topeet/guyilian# java Cnv2

看一下,下面的例子,假如有一千个类继承了father这个类,如果我们要打印他们的信息,那样我们岂不是要写1千个print函数,下面的第二个代码则通过向上转换这个技巧实现.

复制代码
class Father {
	private int money;	

	public int getMoney() {return money; }
	public void setMoney(int money) {this.money = money; }

	public void printInfo() {System.out.println("This is Father");}

}

class Son extends Father{
	public void printInfo() {System.out.println("This is son");}
	public void playGame() {System.out.println("playGame ...");}
	
}

class Daughter extends Father{
	public void printInfo() {System.out.println("This is daughter");}

	
}

public class Cnv3 {
	public static void main (String args[]) {
		Father f = new Father();
		Son s = new Son();
		Daughter d = new Daughter();

		print(f);
		print(s);
		print(d);
	}

	public static void print(Father f) {
		f.printInfo();
	}

	public static void print(Son s) {
		s.printInfo();
	}

	public static void print(Daughter d) {
		d.printInfo();
	}
	
}

运行结果:

复制代码
root@ubuntu:/home/topeet/guyilian# javac Cnv3.java 
root@ubuntu:/home/topeet/guyilian# java Cnv3
This is Father
This is son
This is daughter

通过向上转换实现:

复制代码
class Father {
	private int money;	

	public int getMoney() {return money; }
	public void setMoney(int money) {this.money = money; }

	public void printInfo() {System.out.println("This is Father");}

}

class Son extends Father{
	public void printInfo() {System.out.println("This is son");}
	public void playGame() {System.out.println("playGame ...");}
	
}

class Daughter extends Father{
	public void printInfo() {System.out.println("This is daughter");}

	
}

public class Cnv4 {
	public static void main (String args[]) {
		Father f = new Father();
		Son s = new Son();
		Daughter d = new Daughter();

		print(f);
		print(s);
		print(d);
	}

	public static void print(Father f) {
		f.printInfo();
	}

	
}

运行结果:

复制代码
root@ubuntu:/home/topeet/guyilian# javac Cnv4.java 
root@ubuntu:/home/topeet/guyilian# java Cnv4
This is Father
This is son
This is daughter

instanceof: 用来判断一个对象是不是某个类的实例

复制代码
class Father {
	private int money;	

	public int getMoney() {return money; }
	public void setMoney(int money) {this.money = money; }

	public void printInfo() {System.out.println("This is Father");}
	public void drink() {System.out.println("drink ...");}

}

class Son extends Father{
	public void printInfo() {System.out.println("This is son");}
	public void playGame() {System.out.println("playGame ...");}
	
}

class Daughter extends Father{
	public void printInfo() {System.out.println("This is daughter");}
	public void dance() {System.out.println("dance ...");}

	
}

public class Cnv5 {
	public static void main (String args[]) {
		Father f = new Father();
		Son s = new Son();
		Daughter d = new Daughter();

		printAction(f);
		printAction(s);
		printAction(d);
	}

	public static void printAction(Father f) {
		if (f instanceof Son) {
			Son son = (Son)f;
			son.playGame();
		}
		else if (f instanceof Daughter) {
			Daughter d = (Daughter)f;
			d.dance();
		}
		else if (f instanceof Father) {
			f.drink();
		}
	}
}

运行结果:

复制代码
root@ubuntu:/home/topeet/guyilian# javac Cnv5.java 
root@ubuntu:/home/topeet/guyilian# java Cnv5
drink ...
playGame ...
dance ...
相关推荐
yurenpai(27届找实习中)3 分钟前
redis_点评(25.附件店铺—把数据库里的店铺按【类型分组】,批量导入Redis 的 GEO 地理位置结构)
java·redis·缓存
云烟成雨TD12 分钟前
Spring AI Alibaba 1.x 系列【66】Graph 长期记忆
java·人工智能·spring
Javatutouhouduan27 分钟前
Java面试大厂真题汇总!
java·java面试·java面试题·后端开发·java编程·java架构师·java八股文
maomao大哥闯天下37 分钟前
K8s对象deployment、job、service应用详解
java·容器·kubernetes
闪电悠米38 分钟前
黑马点评-优惠券秒杀-05_local_lock_cluster_problem
java·spring boot·redis·缓存
IronMurphy1 小时前
SSM拷打第二讲!!!
java·spring·mybatis
Hanniel1 小时前
Python 元类(下):进阶与实战建议
开发语言·python
小江的记录本1 小时前
【JVM虚拟机】类加载机制:类加载全流程:加载→验证→准备→解析→初始化(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·算法·安全·spring·面试
会编程的土豆1 小时前
Go interface 底层的 itab 到底是什么
开发语言·后端·golang
千纸鹤の脉搏1 小时前
多线程的初步了解---进程与线程
java·开发语言·学习·线程