java基础——day07-2 继承、super、this、抽象类
抽象类
概述
父类中的方法,被其子类重写,子类各自的实现不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,方法主体则没有存在的意义了。

我们将这种没有方法主体的方法称为抽象方法。java语法规定,包含抽象方法的类就是抽象类。
定义
抽象方法:没有方法体的方法
抽象类:含抽象方法的类
使用格式——abstract(修饰)
使用abstract关键字修饰方法,该方法就成了抽象方法,抽象方法只包含方法名,没有方法体。
1.格式
修饰符 abstract 返回值类型 方法名(参数列表);
public abstract void run();
2.注意事项
抽象方法:加上abstract关键字修饰,去掉大括号,直接分号结束。
public abstract void eat();
抽象类:抽象方法所在的类,必须是抽象类才行。在class前加上abstract关键字修饰。
3.如何使用
1.不能直接创建抽象对象(不能直接new抽象对象)
2.必须创建子类,继承抽象类父类
3.子类必须重写父类中的抽象方法
4.创建子类对象进行使用
add:子类对父类的抽象方法覆盖重写,去掉抽象方法的abstract关键字,然后补上方法体大括号;
抽象的使用
package day07.demo01.demo10; //抽象类 public abstract class Animal { //定义动物的抽象方法——吃(吃什么不能确定) public abstract void eat(); //定义普通的成员方法 public void method(){ System.out.println("父类普通的成员方法(抽象类中普通的成员方法)"); } }
package day07.demo01.demo10; public class Cat extends Animal { @Override //对父类的抽象方法进行重写 public void eat() { //实现抽象类 System.out.println("猫:我吃鱼"); } }
package day07.demo01.demo10; public class Dog extends Animal { @Override //对父类中的抽象方法进行重写 public void eat() { System.out.println("狗:我爱吃骨头"); } }
package day07.demo01.demo10; public class demo { public static void main(String[] args) { // Animal animal = new Animal() 错误写法 Cat cat = new Cat(); cat.eat(); Dog dog = new Dog(); dog.eat(); } }
注意:Animal animal = new Animal() //错误写法,直接new抽象类是错误的
继承的综合案例
综合案例:群主发普通红包
1.规则:
1.群主的一笔金额,从群主的余额扣除,平均分成n等分,让成员领取
2.成员领取红包后,保存到成员余额中。
2.分析:

package day07.demo01.demo11; import javax.print.DocFlavor; public class User { //成员变量 private String name; //用户名 private double leftMoney; //余额 //构造方法 public User(){}; public User(String name,double leftMoney){ this.name = name; this.leftMoney = leftMoney; } //定义get and set方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public double getLeftMoney() { return leftMoney; } public void setLeftMoney(double leftMoney) { this.leftMoney = leftMoney; } //定义显示信息 public void show(){ System.out.println("用户名:"+name+",当前余额为:"+leftMoney); } }
package day07.demo01.demo11; import java.util.ArrayList; public class qunZhu extends User{ //添加构造方法 public qunZhu(){}; //谈过super父类的构造方法父类的构造方法 public qunZhu(String name,double leftMoney){ super(name, leftMoney); } public ArrayList<Double> faHongbao(double money,int count){ //获取群主余额 double leftMoney = getLeftMoney(); //如果发的钱大于余额 则返回null if(money > leftMoney){ return null; } //群主余额 = 余额 - 发出去的钱 this.setLeftMoney(leftMoney-money); //创建集合 保存等分金额 ArrayList<Double> list = new ArrayList<>(); //扩大100倍 相当于折算成“分”为单位 money = money *100; //每份金额 = 总额 /总人数 double m = money/count; //不能整除的数 double l = money %count; //无论是否整除,n-1份,都是每份的等额金额 发一个人 减少一个人 for (int i = 0; i <= count - 1; i++) { //缩小100倍折算成“元” if(l == 0){ list.add(m/100.0); }else { list.add((m+1)/100.0); } } return list; } }
package day07.demo01.demo11; import java.util.ArrayList; import java.util.Random; public class chengYuan extends User{ public chengYuan(){}; public chengYuan(String username,double leftMoney){ super(username,leftMoney); } //打开红包 从集合随机获取一份 保存到自己余额 public void openHongbao(ArrayList<Double> list){ Random r = new Random(); int index = r.nextInt(list.size()); //移除一个 金额 double money = list.get(index); list.remove(index); //直接调用父类方法 设置到金额. setLeftMoney(money); } }
package day07.demo01.demo11; import java.util.ArrayList; import java.util.Scanner; public class demo { public static void main(String[] args) { //创建群主 初始name 金额 qunZhu qunzhu = new qunZhu("群主",300); //创建键盘录入红包数值和红包个数 Scanner sc = new Scanner(System.in); System.out.print("请输入红包金额:"); double money = sc.nextDouble(); System.out.print("请输入红包数:"); int num = sc.nextInt(); //发红包 ArrayList<Double> sendList = qunzhu.faHongbao(25.5,3); //判断余额 if(sendList == null){ System.out.println("余额不足"); return; } //创建三个成员变量 chengYuan cy1 = new chengYuan("张三",0.00); chengYuan cy2 = new chengYuan("李四",0.50); chengYuan cy3 = new chengYuan("王五",1.00); //打开红包 cy1.openHongbao(sendList); cy2.openHongbao(sendList); cy3.openHongbao(sendList); //展示信息 qunzhu.show(); cy1.show(); cy2.show(); cy3.show(); } }

浙公网安备 33010602011771号