2020-09-08((继承+多态)总结和练习 )待补充...

总结:
1.继承:允许子类去继承父类非私有化的属性和行为,关键字extends来实现,能发生继承的类,
关系上要满足is a xxx,(继承是发生在对象层面上的,所以子类对象被new出来,必然有父类对象new出来让子类继承)
2.继承的好处:a.减少代码的冗余
			b。允许开发者定义分等级层次的类
3.简单了解下super关键字:指代当前对象的父类对象
4.重写:子类不满足于父类继承过来的方法,用自己的方式去重写相关的方法体
5.重写和重载的区别:重写是两个类,重载是一个类
6.多态:同一个行为在不同对象身上不同的表现
7.多态的三个实现条件:
	a.要有继承
	b.要有方法重写
	c.父类引用指向子类对象
8.向上转型:父类引用指向子类对象
	好处:父类引用可以作为参数去接收各种子类对象,带来了减少代码冗余,提高了代码的可扩展性
	缺点:会把子类独有属性和方法隐藏
9.向下转型:你想找回子类对象隐藏的属性和方法,就需要做向下转型
能不能转?用instanceof判断下,然后强转

        在做向下转型时,强制要求必须要做instanceof判断
            Animal a= new Cat();
	        if(a instanceof Cat){
		        Cat c=(Cat)a;
	        }else if(a instanceof Dog){
		        Dog d=(Dog)a;
	        }
练习:
第一步 新建一个Person类,包含name sex age,sleep();thinking();
第二步:新建宠物类Pet,name happyNum(体力值) 行为:eat();
第三步:新建狗类Dog,重写eat方法,吃东西会让happyNum值加3
第四步:新建狗类Cat,重写eat方法,吃东西会让happyNum值加2
第五步:扩展Person类,用来描述以下问题
张三有一个宠物狗,他喂了狗,狗happyNum加3
李四有一只宠物猫,她喂了猫,猫happyNum加2
新建测试类,测试上述过程

题目:
1.定义一个动物类Animal,有动物类型属性type和动物发声的方法sound();定义基于动物类的狗类Dog和猫类 
  Cat,这两个类都要求覆盖父类的发声方法;定义AnimalDemo类,声明一个Animal对象,分别创建一个 
  Dog、Cat类的对象,然后通过Animal引用来访问Dog、Cat类对像的Sound()方法。

2.设计一个名为Person的类和它的两个名为Student和Employee子类。Employee又有子类:教员Faculty和职 
  员类Staff。每个人都有姓名、地址、电话号码和电子邮件地址。学生有班级状态(大一、大二、大三和大 
  四)。将这些状态定义为常量。一个雇员有办公室、工资、和受聘日期。定义一个MyDate的类,包含数据域 
  year、month、day。教员有办公时间和级别。职员有职务称号。覆盖每个类中的toString方法,显示相应 
  的类名和人名。实现这些类。编写一个测试程序,创建Person、Student、Employee、Faculty和Staff, 
  并调用他们的并调用他们的toString方法。

3.利用JAVA继承和多态性编写程序:分别利用不同的公式来计算长方形正方形圆的面积 

4.动物园歌唱大赛动物园中有狗,猫,牛,羊四种动物狗唱歌:汪汪汪~~猫唱歌:喵喵喵~~牛唱歌:哞哞哞~~ 
  羊唱歌:咩咩咩~~比赛一共有10个动物参加先初始化10个不同的动物,然后让它们依次演唱

5.关于继承与重载,请按下列要求编写代码.
1.继承的应用
1) 编写一个商品类Good;
2) 编写商品类的子类牛奶,增加了表示会员价格的属性,覆盖父类的计算折扣的方法,要求能计算出会员和非会 
   员折扣后各是多少钱.
3) 编写测试类,初始化牛奶的价格为3元,会员价格为2.6元,折扣的百分比为0.8,测试子类的应用,输出折扣后 
   的价格.

2.重载
1) 编写一个类Telephone
2) 属性:号码和话费余额
3) 构造方法:一个带参的,一个不带参的
4) 方法:计算话费的方法telephoneCharge,计算话费的方式不同,一种是:3毛钱+(本次通话时间-3分钟) 
   *1毛钱,另外一种是:每分钟的话费*本次通话时间.使用重载的方式完成两个同名方法的的编写.
5) 包含查询余额的方法.
6) 编写测试类,分别创建两个电话对象,调用不同的计算话费的方法,并显示余额.



拓展:

用java程序完成以场景:

有一个主人(Master类),他养了两只宠物(Pet类),一只宠物是狗(Dog类),名字叫旺财,
另一只宠物是猫(Cat类),名字叫小花,现在有两种食物(Food类),分别是骨头(Bone)和鱼(Fish)。
主人分别给两只宠物喂食物,两只宠物厌食,狗只吃骨头(如果主人喂狗吃别的食物,
就显示狗不吃某某食物),猫只吃鱼(如果主人喂猫吃别的食物,就显示猫不吃某某食物)
主方法:
package com.wdd.week03.day02.test03;

/**
 * 定义一个动物类Animal,有动物类型属性type和动物发声的方法sound();
 * 定义基于动物类的狗类Dog和猫类Cat,这两个类都要求覆盖父类的发声方法;
 * 定义AnimalDemo类,声明一个Animal对象,分别创建一个Dog、Cat类的对象,
 * 然后通过Animal引用来访问Dog、Cat类对像的Sound()方法。
 * 
 * @author WDD
 *
 */

public class AnimalDemo {
	public static void main(String[] args) {
		Animal d = new Dog();
		Animal c = new Cat();

		d.sound();
		c.sound();
	}

}


Animal类:
package com.wdd.week03.day02.test03;

public class Animal {
	String type;// 类型

	public void sound() {
		System.out.println("叫叫叫....");
	}

	public Animal() {
		super();
	}

	public Animal(String type) {
		super();
		this.type = type;
	}

	@Override
	public String toString() {
		return "Animal [type=" + type + "]";
	}

}


猫类:
package com.wdd.week03.day02.test03;

public class Cat extends Animal {

	@Override
	public void sound() {
		// TODO Auto-generated method stub
		System.out.println("喵喵喵....");
	}

}


狗类:
package com.wdd.week03.day02.test03;

public class Dog extends Animal {

	@Override
	public void sound() {
		// TODO Auto-generated method stub
		System.out.println("汪汪汪.....");
	}

}
主方法:
package com.wdd.week03.day02.test05;

/**
 * 利用JAVA继承和多态性编写程序: 分别利用不同的公式来计算长方形正方形圆的面积
 * 
 * @author WDD
 *
 */

public class Main {
	public static void main(String[] args) {
		Graphics r = new Rectangle(3, 5);
		r.getArea(r);
		System.out.println(r.toString());

		Graphics q = new Quadrate(5);
		q.getArea(q);
		System.out.println(q.toString());

		Graphics c = new Circle(10);
		c.getArea(c);
		System.out.println(c.toString());
	}
}


package com.wdd.week03.day02.test05;

//图形类
public class Graphics {
	double area;// 面积

	public void getArea(Graphics g) {
		System.out.println("该图形的面积为:" + g.area);
	}

	public Graphics() {
		super();
	}

	public Graphics(double area) {
		super();
		this.area = area;
	}

	@Override
	public String toString() {
		return "Graphics [area=" + area + "]";
	}

}


package com.wdd.week03.day02.test05;

//圆类

public class Circle extends Graphics {
	double radius;// 半径

	@Override
	public void getArea(Graphics g) {
		// TODO Auto-generated method stub
		System.out.println("圆的面积为:" + (3.14 * this.radius * this.radius));
	}

	public Circle() {
		super();
	}

	public Circle(double radius) {
		super();
		this.radius = radius;
	}

	@Override
	public String toString() {
		return "Circle [radius=" + radius + ", area=" + (3.14 * this.radius * this.radius) + "]";
	}

}


package com.wdd.week03.day02.test05;

//正方形类

public class Quadrate extends Graphics {
	double length;// 正方形的边长

	@Override
	public void getArea(Graphics g) {
		// TODO Auto-generated method stub
		System.out.println("正方形的面积为:" + (this.length * this.length));
	}

	public Quadrate() {
		super();
	}

	public Quadrate(double length) {
		super();
		this.length = length;
	}

	@Override
	public String toString() {
		return "Quadrate [length=" + length + ", area=" + (this.length * this.length) + "]";
	}

}



package com.wdd.week03.day02.test05;

//长方形类
public class Rectangle extends Graphics {
	double length;// 长
	double width;// 宽

	@Override
	public void getArea(Graphics g) {
		// TODO Auto-generated method stub
		System.out.println("长方形的面积为:" + (this.length * this.width));
	}

	public Rectangle() {
		super();
	}

	public Rectangle(double length, double width) {
		super();
		this.length = length;
		this.width = width;
	}

	@Override
	public String toString() {
		return "Rectangle [length=" + length + ", width=" + width + ", area=" + (this.length * this.width) + "]";
	}

}
package com.wdd.week03.day02.test06;

/**
 * 动物园歌唱大赛动物园中有狗,猫,牛,羊四种动物 
 * 狗唱歌:汪汪汪~~ 
 * 猫唱歌:喵喵喵~~ 
 * 牛唱歌:哞哞哞~~ 
 * 羊唱歌:咩咩咩~~
 * 比赛一共有10个动物参加先初始化10个不同的动物,然后让它们依次演唱
 * 
 * @author WDD
 *
 */

public class Main {
	public static void main(String[] args) {
		Animal[] a = new Animal[10];
		a[0] = new Sheep();
		a[1] = new Cat();
		a[2] = new Dog();
		a[3] = new Cat();
		a[4] = new Cow();
		a[5] = new Cow();
		a[6] = new Dog();
		a[7] = new Sheep();
		a[8] = new Dog();
		a[9] = new Cat();
		
		for (int i = 0; i < a.length; i++) {
			a[i].song();
		}
	}

}

其他类略...
package com.wdd.week03.day02.test08;

/**
 * 1) 编写一个类Telephone
 * 2) 属性:号码和话费余额
 * 3) 构造方法:一个带参的,一个不带参的
 * 4) 方法:计算话费的方法telephoneCharge,计算话费的方式不同,
 *     一种是:3毛钱+(本次通话时间-3分钟)*1毛钱,
 *     另外一种是:每分钟的话费*本次通话时间.
 *     使用重载的方式完成两个同名方法的的编写.
 * 5) 包含查询余额的方法.
 * 6) 编写测试类,分别创建两个电话对象,调用不同的计算话费的方法,并显示余额.
 * @author WDD
 *
 */

public class Main {
	public static void main(String[] args) {
		Telephone tp = new Telephone("17856179093", 100);
		tp.telephoneCharge(60);
		
		Telephone tp1 = new Telephone("17856179827", 100);
		tp1.telephoneCharge(60, 0.2);
	}
}




package com.wdd.week03.day02.test08;

public class Telephone {
	String number; //号码
	double balance; //话费余额
	
	//计算话费的方法一
	public void telephoneCharge(double minTime) {
		System.out.println("本次通话时间为:" + minTime + "分钟.");
		System.out.println("本次通话累计扣除话费:" + (0.3 + (minTime - 3) * 0.1) + "元.");
		System.out.println("话费余额为:" + (this.balance -= (0.3 + (minTime - 3) * 0.1)) + "元.");
	}
	//计算话费的方法二
	public void telephoneCharge(double minTime,double minMoney) {
		System.out.println("本次通话时间为:" + minTime + "分钟.");
		System.out.println("本次通话累计扣除话费:" + (minTime * minMoney) + "元.");
		System.out.println("话费余额为:" + (this.balance -= (minTime * minMoney)) + "元.");
	}
	
	
	public Telephone() {
		super();
	}
	
	public Telephone(String number, double balance) {
		super();
		this.number = number;
		this.balance = balance;
	}

	@Override
	public String toString() {
		return "Telephone [number=" + number + ", balance=" + balance + "]";
	}
	
	
	
	
}

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值