总结:
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 + "]";
}
}