JAVA day08:代码练习(多态)
1.练习向上转型和向下转型
中国南北差异较大,主要体现在饮食上,南方人喜欢吃米饭,北方人比较喜欢吃馒头,现在定义一个Person类,Person类中提供一个name属性,提供一个eat方法;定义一个SouthPerson类,SouthPerson类继承自Person类,重写父类的eat方法,输出“米饭”;定义一个NorthPerson类,继承自Person类,重写父类的eat方法,输出馒头;定义一个厨师类Cook,厨师类中提供一个做饭的方法cook,方法传递一个Person对象参数,在cook方法中调用Person的eat方法;写一个测试类,定义两个人,分别是南方人和北方人,定义一个厨师,调用厨师的cook方法,烹调出适合南北方人习惯或北方人习惯的食物
//Person类
public class Person {
public String name;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name) {
super();
this.name = name;
}
public void eat(){
}
}
//SouthPerson类
public class SouthPerson extends Person{
@Override
public void eat() {
System.out.println("米饭");
}
}
//NorthPerson类
public class NorthPerson extends Person{
@Override
public void eat() {
System.out.println("馒头");
}
}
//Cook类
public class Cook {
/*public void cook(Person p){
if(p.name.equals("南方人")){
p=new SouthPerson();
p.eat();
}else if(p.name.equals("北方人")){
p=new NorthPerson();
p.eat();
}
}*/
//向上转型
public void cook(Person p){
if(p instanceof SouthPerson){
//向下转型
SouthPerson sp=(SouthPerson)p;
sp.eat();
}else if(p instanceof NorthPerson){
NorthPerson np=(NorthPerson)p;
np.eat();
}
}
}
//测试类
public class Test {
public static void main(String[] args) {
Cook c=new Cook();
/*Person p1=new Person("北方人");
Person p2=new Person("南方人");*/
//定义一个南方人
SouthPerson p1= new SouthPerson();
p1.name="张南方";
//定义一个北方人
NorthPerson p2= new NorthPerson();
p2.name="李北方";
//定义一个厨师
Cook p3 = new Cook();
p1.eat();
p2.eat();
//调用厨师做菜方法
c.cook(p1);
c.cook(p2);
}
}
运行结果:
2.
定义一个书店类BookStore,书店类中提供一个书店名称的属性name,提供一个书的类别的方法bookType;定义一个新华书店类XHBookStore继承自BookStore类,重写父类的bookType方法,输出“售卖中小学生读物”;定义一个东宇书社类DYBookStore继承自BookStore类,重写父类的bookType方法,输出“售卖中学生杂志读物”;定义一个学生类Student,提供一个买书的方法buy,将BookStore作为方法的参数,在buy方法中调用BookStore的bookType方法;写一个测试类,创建东宇书社和新华书店,创建2个学生对象,分别是小学生和中学生,调用学生的buy方法,购买适合该学生阅读的图书
//BookStore类
public class BookStore {
public String name;
public void bookType(){
}
}
//DYBookStore类
public class DYBookStore extends BookStore{
@Override
public void bookType() {
System.out.println("售卖中学生杂志读物");
}
}
//XHBookStore类
public class XHBookStore extends BookStore{
@Override
public void bookType() {
System.out.println("售卖中小学生读物");
}
}
//Student类
public class Student {
public void buy(BookStore b){
if(b instanceof DYBookStore){
//向下转型
DYBookStore db=(DYBookStore)b;
db.bookType();
}else if(b instanceof XHBookStore){
XHBookStore xb=(XHBookStore)b;
xb.bookType();
}
}
}
//测试类
public class Test {
public static void main(String[] args) {
XHBookStore xb=new XHBookStore();
DYBookStore db=new DYBookStore();
Student xiaostu=new Student();
Student zhongstu=new Student();
xiaostu.buy(xb);
zhongstu.buy(db);
}
}
3.
定义一个汽水类Drink,汽水类中有一个味道的方法taste;定义一个可口可乐类,Coco继承自汽水类,重写父类的taste方法,输出“我是可口可乐,我是甜汽水”;定义一个盐汽水类SaltDrink继承自汽水类,重写父类的taste方法,输出“我是盐汽水,我是咸的”;定义一个测试类,提供一个售卖汽水的方法sell,接收用户输入的值,如果是“甜的”,就卖给客户甜的汽水,否则卖给客户咸的汽水
//Drink类
public class Drink {
public void taste(){
}
}
//Coco类
public class Coco extends Drink{
@Override
public void taste() {
System.out.println("我是可口可乐,我是甜汽水");
}
}
//SaltDrink类
public class SaltDrink extends Drink{
@Override
public void taste() {
System.out.println("我是盐汽水,我是咸的");
}
}
//测试类
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.println("请输入您的口味:");
Scanner sc=new Scanner(System.in);
String wei=sc.next();
//sell(wei);
Drink d=sell(wei);
d.taste();
}
/*public static void sell(String wei){
if(wei.equals("甜的")){
Drink d= new Coco();
Coco c=(Coco)d;
c.taste();
}else if(wei.equals("咸的")){
Drink d= new SaltDrink();
SaltDrink s=(SaltDrink) d;
s.taste();
}
}*/
public static Drink sell(String wei){
Drink d=null;
if(wei.equals("甜的")){
//向上转型
d= new Coco();
}else if(wei.equals("咸的")){
//向上转型
d= new SaltDrink();
}else{
System.out.println("输入错误");
d=new Drink();//避免空指针异常
}
return d;
}
}
6.题目3:综合应用3
完成以下题目
要求:
定义一个人类(Person),有吃饭,睡觉,走路3种方法,
再定义一个银行家类(Banker),继承自人类,有自己的特有方法:投资(invest)。 重写走路方法-乘飞机。
再定义一个程序员类(Coder),继承自人类,有自己的特有方法:写代码(coding)重写走路方法-成火箭。
编写测试类,在测试类中生成一个程序员和一个银行家,然后实现多态性的程序设计
评分标准:
(7) 正确定义人类(Person)(10分)
(8) 正确定义银行家类(Banker)(10分)
(9) 正确定义编写测试类,并正确输出10分)
//Person类
public class Person {
public void eat(){
}
public void sleep(){
}
public void walk(){
}
}
//Banker类
public class Banker extends Person{
//投资
public void invest(){
System.out.println("投资");
}
@Override
public void walk() {
System.out.println("乘飞机");
}
}
//Coder类
public class Coder extends Person{
public void coding(){
System.out.println("敲代码");
}
@Override
public void walk() {
System.out.println("乘火箭");
}
}
//测试类
public class Test {
public static void main(String[] args) {
Person p;
p=new Coder();
p.walk();
Coder c=(Coder)p;
c.coding();
p=new Banker();
p.walk();
Banker d=(Banker)p;
d.invest();
if(p instanceof Coder){//判断对象类型
System.out.println("是程序员");
}else if(p instanceof Banker){//判断对象类型
System.out.println("是银行家");
}else{
System.out.println("不是");
}
}
}
运行结果 :
上一篇: C++ 循环单链表(带头结点)