继承的关键字是extends;
继承是Java中类与类之间的一种关系;
使用继承的好处就是可以用父类封装所有子类的公共代码,让子类继承,实现代码复用
Dog类只有strain一个成员变量
但是在测试类中可以通过dog对象指针调用其父类的成员变量
发生继承的类称为子类(派生类),被继承的类称为父类(基类);
父类:
子类:
一个类只能继承父类,但是一个父类可以有多个子类;
父类:
子类:
如果一个类没有显式的继承父类,则隐式继承object类;
Animal类没有使用extends继承父类,但是在构造方法中会隐式的继承object类,可以使用object类的toString方法。
Java不支持多继承,只支持单继承,但支持多级继承;
多级继承:Dog类继承了Animal类,Animal类虽然没有显示继承,但是隐式继承了父类,父类为object类。
在继承体系的顶层是object类,object类称为祖先类、上帝类
构造方法中的第一行有一条隐式指令,super()调用其父类的构造方法
使用Dog类的构造方法,测试隐式super()
结果:
第一个返回dog对象的指针地址;第二个返回toString方法的地址。发现这两种打印方式出来的结果是相同的,所以可以说明,Dog类在调用构造方法的时候,会先执行super()方法,找到Animal类的构造方法,继续执行Animal类的构造方法里的super(),使用object类的构造方法创建对象,Animal再创建对象,最后Dog创建对象,这样dog对象就可以调用object类的toString方法。
this和super的区别
this是指向当前对象,super是指向当前父类对象
this和super的使用方法:
1、调用构造方法(只能在构造方法中调用,而且必须出现在第一行)
this();可以使用this()调用本类构造方法
super();可以使用super()调用父类构造方法
使用Dog类的构造方法,测试隐式super()
结果:
第一个返回dog对象的指针地址;第二个返回toString方法的地址。发现这两种打印方式出来的结果是相同的,所以可以说明,Dog类在调用构造方法的时候,会先执行super()方法,找到Animal类的构造方法,继续执行Animal类的构造方法里的super(),使用object类的构造方法创建对象,Animal再创建对象,最后Dog创建对象,这样dog对象就可以调用object类的toString方法。
子类可以继承父类的非私有(非private修饰)成员(成员变量、成员方法);
Animal类中的nickName成员变量为静态变量,dog对象无法调用nickName变量
父类的构造方法不能被子类继承,但可以被子类调用,且子类的无参构造方法中会默认调用父类的无参构造方法;
使用Dog类的构造方法,测试隐式super()
结果:
第一个返回dog对象的指针地址;第二个返回toString方法的地址。发现这两种打印方式出来的结果是相同的,所以可以说明,Dog类在调用构造方法的时候,会先执行super()方法,找到Animal类的构造方法,继续执行Animal类的构造方法里的super(),使用object类的构造方法创建对象,Animal再创建对象,最后Dog创建对象,这样dog对象就可以调用object类的toString方法
能发生继承关系的类在逻辑上应该具有一个"is a"的关系
狗 is a 动物
猫 is a 动物
猪 is a 动物
枪 is a 武器
刀 is a 武器
剑 is a 武器
点餐点赞小程序Dish类
package HomeWork03;
public class Dish {
private String name;
private Integer price;
private Integer stock;
private Integer saleNum;
private Integer likeNum;
public void show(){
System.out.println("**名称:"+this.name);
System.out.println("*******************************************");
System.out.print("价格:"+this.price+" ");
System.out.print("库存:"+this.stock+" ");
System.out.print("已售:"+this.saleNum+" ");
System.out.println("点赞数:"+this.likeNum+" ");
System.out.println("*******************************************");
}
public void sale(){
like();
this.saleNum++;
}
public void saleOut(int n){
this.saleNum+=n;
}
public void like(){
this.likeNum++;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
public Integer getSaleNum() {
return saleNum;
}
public void setSaleNum(Integer saleNum) {
this.saleNum = saleNum;
}
public Integer getLikeNum() {
return likeNum;
}
public void setLikeNum(Integer likeNum) {
this.likeNum = likeNum;
}
}
测试Demo01类
package HomeWork03;
import java.util.Scanner;
public class Demo01 {
static Scanner sc=new Scanner(System.in);
static Dish[] dishArray=new Dish[5];
static{
Dish dish1 = new Dish();
dish1.setName("清汤白菜");
dish1.setPrice(18);
dish1.setStock(20);
dish1.setSaleNum(253);
dish1.setLikeNum(102);
dishArray[0]=dish1;
Dish dish2 = new Dish();
dish2.setName("青椒爆炒土豆丝");
dish2.setPrice(15);
dish2.setStock(16);
dish2.setSaleNum(100);
dish2.setLikeNum(89);
dishArray[1]=dish2;
Dish dish3 = new Dish();
dish3.setName("老干妈炒饭");
dish3.setPrice(13);
dish3.setStock(1000);
dish3.setSaleNum(500);
dish3.setLikeNum(486);
dishArray[2]=dish3;
}
public static void main(String[] args) {
int choice=0;
do {
System.out.println("**********欢迎进入菜品系统**********");
System.out.println("1、菜品展示");
System.out.println("2、添加菜品");
System.out.println("3、删除菜品");
System.out.println("4、菜品数组扩容");
System.out.println("5、点餐");
System.out.println("6、点赞");
System.out.println("请输入你的选择:");
choice=sc.nextInt();
switch(choice) {
case 1:
System.out.println("1、菜品展示");
display();
break;
case 2:
System.out.println("2、添加菜品");
addDish();
break;
case 3:
System.out.println("3、删除菜品");
deleteDish();
break;
case 4:
System.out.println("4、菜品数组扩容");
dilatation();
break;
case 5:
System.out.println("5、点餐");
saleDish();
break;
case 6:
System.out.println("6、点赞");
likeDish();
break;
case 7:
System.out.println("退出");
default:
break;
}
} while (choice!=7);
}
//菜品展示
public static void display(){
System.out.println("进入菜品展示业务");
System.out.println();
for (int i = 0; i < dishArray.length; i++) {
if (dishArray[i]==null){
System.out.println("菜品暂空");
}else{
dishArray[i].show();
}
}
}
//添加菜品
public static void addDish(){
if (dishArray[dishArray.length-1]!=null){
System.out.println("菜品已满,请为菜品存储扩容");
return;
}
System.out.println("进入添加菜品业务");
Dish dish = new Dish();
System.out.println("请输入菜品名称:");
dish.setName(sc.next());
System.out.println("请输入菜品价格:");
dish.setPrice(sc.nextInt());
System.out.println("库存数量:");
dish.setStock(sc.nextInt());
for (int i = 0; i < dishArray.length; i++) {
if (dishArray[i]==null){
dishArray[i]=dish;
System.out.println("菜品添加成功");
return;
}
}
}
//删除菜品
public static void deleteDish(){
System.out.println("进入删除菜品业务");
display();
System.out.println("请输入想要删除的菜品编号:");
int deleteDishId=sc.nextInt()-1;
for (int i = 0; i < dishArray.length; i++) {
if (dishArray[deleteDishId]==null){
System.out.println("菜品为空");
return;
}
else if (dishArray[deleteDishId].getStock()-dishArray[deleteDishId].getSaleNum()>0){
System.out.println("该菜品有剩余库存,无法删除!");
return;
}else{
dishArray[deleteDishId].setName(null);
dishArray[deleteDishId].setPrice(null);
dishArray[deleteDishId].setStock(null);
dishArray[deleteDishId].setSaleNum(null);
dishArray[deleteDishId].setLikeNum(null);
System.out.println("菜品删除成功!!!");
}
}
}
//菜品数组扩容
public static void dilatation() {
System.out.println("进入菜品扩容业务");
Dish[] newArr = new Dish[dishArray.length + dishArray.length/2];
for (int i = 0; i < dishArray.length; i++) {
newArr[i]=dishArray[i];
}
dishArray=newArr;
System.out.println("扩容成功,现在菜品可存:"+dishArray.length+"个");
}
//点餐
public static void saleDish(){
System.out.println("进入订餐业务");
display();
System.out.println("请输入菜品编号,以方便点餐:");
int i=sc.nextInt()-1;
System.out.println("请输入想要菜品的份数:");
int n=sc.nextInt();
for (int i1 = 0; i1 < dishArray.length; i1++) {
if (dishArray[i1]==null){
System.out.println("对不起,你输入的菜品不存在或已被删除!");
return;
}else {
int pay=dishArray[i].getPrice()*n;
dishArray[i].saleOut(n);
System.out.println("点餐成功,你已支付:"+pay+"元");
return;
}
}
}
//点赞
public static void likeDish(){
System.out.println("进入点赞业务");
display();
System.out.println("请输入想要点赞的菜品编号:");
int i=sc.nextInt()-1;
for (int i1 = 0; i1 < dishArray.length; i1++) {
if (dishArray[i]==null){
System.out.println("菜品为空,输入错误或者菜品已被删除");
return;
}else{
dishArray[i].like();
System.out.println("点赞成功!");
return;
}
}
}
}



