抽象类
抽象方法: 没有方法体的方法(只有方法的声明)
public void sayHello(); // 抽象方法
抽象类:包含抽象方法的类就是抽象类
定义抽象类
abstract 类名 {
// 抽象方法
}
举例
package com.myc.day04;
public abstract class Animal {
// 抽象方法
public abstract void run();
}
实现类
package com.myc.day04;
public class Cat extends Animal{
@Override
public void run() {
System.out.println("小猫在墙头飞奔");
}
// 继承抽象类的普通类必须实现其所有的抽象方法
}
测试
public class Test {
public static void main(String[] args) {
Cat cat = new Cat();
cat.run();
}
}
注意事项
- 抽象类本身不能创建对象
- 抽象类中可以有构造方法,是供子类创建对象时使用的,用于初始化父类成员患使用
3.抽象类中不一定含有抽象方法, 但是有抽象方法的类必定是抽象类
4.抽象类的子类, 必须重写抽象父类中所有的抽象方法, 否则就会报错, 除非这个子类继续是抽象类
发红包案例
package com.myc.day04.redbag;
public abstract class User {
// 成员变量
private String name; // 用户名
private double leftMoney; // 余额
// 构造方法
public User() {
}
public User(String name, double leftMoney) {
this.name = name;
this.leftMoney = leftMoney;
}
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("用户名" + this.name + "余额" + this.leftMoney);
}
}
群主
package com.myc.day04.redbag;
import java.util.ArrayList;
public class Manager extends User{
// 群主类
public Manager() {
}
public Manager(String name, double leftMoney) {
super(name, leftMoney);
}
/**
* 发红包
* @param totalMoney 总金额
* @param totalCount 几个红包
* @return 红包集合
*/
public ArrayList<Double> send(int totalMoney, int totalCount){
// 获取余额
double leftMoney = getLeftMoney();
if (leftMoney < totalMoney)
return null;
// 更新余额
setLeftMoney(leftMoney-totalMoney);
// 扩大100倍变成 分
totalMoney *= 100;
// 每一个红包的金额
int avg = totalMoney/totalCount;
// 余数
int mod = totalMoney%totalCount;
// 先将 totalCount减一份赋值
// 创建红包集合
ArrayList<Double> list = new ArrayList<>();
for (int i = 0; i < totalCount - 1; i++) {
list.add(avg/100.00);
}
//
if (mod==0)
list.add(avg/100.00);
else
list.add((avg+mod)/100.00);
return list;
}
}
成员
package com.myc.day04.redbag;
import java.util.ArrayList;
import java.util.Random;
// 普通成员
public class Member extends User{
public Member() {
}
public Member(String name, double leftMoney) {
super(name, leftMoney);
}
// 收红包
public void open(ArrayList<Double> list){
Random random = new Random();
int index = random.nextInt(list.size());
// 移除一个金额
Double money = list.remove(index);
setLeftMoney(money+getLeftMoney());
}
}
测试
package com.myc.day04.redbag;
import java.util.ArrayList;
public class TestRedBag {
public static void main(String[] args) {
Manager manager = new Manager("马云", 200);
ArrayList<Double> list = manager.send(200, 3);
System.out.println("群主红包发放情况");
System.out.println(list);
// 创建普通成员 3个
Member member1 = new Member("张三", 20);
Member member2 = new Member("李四", 0);
Member member3 = new Member("王五", 120);
member1.open(list);
member2.open(list);
member3.open(list);
manager.show();
member1.show();
member2.show();
member3.show();
}
}
接口
接口定义格式
public interface 接口名 {
}
栗子
package com.myc.day04.jiekou;
// 接口主要用途 : 规范被继承的类
public interface LiveAble {
public abstract void eat();
public void sleep();
}
实现接口
package com.myc.day04.jiekou;
public class Animal implements LiveAble{
@Override
public void eat() {
System.out.println("吃吃吃吃");
}
@Override
public void sleep() {
System.out.println("睡睡睡");
}
}
测试
package com.myc.day04.jiekou;
public class Test {
public static void main(String[] args) {
Animal animal = new Animal();
animal.eat();
animal.sleep();
}
}
接口的多实现
Java 中类的继承是单继承(一个子类只能继承一个父类)
C++ 中类的继承是多继承(一个子类能继承多个父类)
Java 中的接口是多实现的
多态
多态: 同一种行为(方法), 具有不同的表现形式;
多态的前提:
- 继承或者实现(二选一)
- 方法的重写
- 父类引用指向子类对象【格式体现】
多态的书写格式
父类类型 变量名 = new 子类类型()
变量名.方法名()
父类
package com.myc.day04.duotai;
public abstract class Animal {
// 抽象方法
public abstract void run();
}
子类
package com.myc.day04.duotai;
public class Cat extends Animal{
@Override
public void run() {
System.out.println("慢慢的跑");
}
}
package com.myc.day04.duotai;
public class Dog extends Animal{
@Override
public void run() {
System.out.println("飞快的跑");
}
}
测试类
package com.myc.day04.duotai;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
// 多态书写格式测试
// Animal cat = new Cat();
// cat.run();
// Animal dog = new Dog();
// dog.run();
// 没有用多态 的代码
// Cat cat = new Cat();
// showCatRun(cat);
// Dog dog = new Dog();
// showDogRun(dog);
// 使用多态
Animal cat = new Cat();
Animal dog = new Dog();
// showAnimalRun(cat);
showAnimalRun(dog);
List<Object> list = new ArrayList<>();
}
// 没有用多态 的代码
// 分别以cat 和 dog 为参数需要写两个方法
public static void showCatRun(Cat cat){
cat.run();
}
// 没有用多态 的代码
public static void showDogRun(Dog dog){
dog.run();
}
public static void showAnimalRun(Animal animal){
animal.run();
}
}