java基础day10 抽象类、接口

1抽象类写法:public abstract class Xxx{   }

2抽象方法写法:public abstract void xx()注意没有方法体的大括号;

3抽象类和抽象方法的使用方法

                1不能直接创建new抽象类对象,要先创建一个子类,继承抽象类,让抽象变得具体

                2覆盖重写所有抽象方法,也就是把abstract关键字去掉写上具体的名称

                3创建子类对象调用方法

4使用中的注意事项:1:不能直接创建new抽象类对象

                                  2:抽象类中可以有构造方法,是在创建子类对象时使用的(默认super)

                                  3:抽象类可以没有方法,但是抽象方法所在类一定是抽象类(适配器模式)

                                  4:见图

案例1 发红包 

人员总类:
package HongBao;

public class User {
    private String name;//姓名
    private int money;//当前用户余额

    public User() {
    }

    public User(String name, int money) {
        this.name = name;
        this.money = money;
    }
    public void show(){
        System.out.println("我叫"+name+"我有"+money+"元");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}
群主类:
package HongBao;

import java.util.ArrayList;

public class Qunzhu extends User {
    public Qunzhu(){
    }

    public Qunzhu(String name, int money) {
        super(name, money);//继承父类的有参构造
    }
    public ArrayList<Integer> faHongBao(int ZongE,int JiFen){//群主发红包方法
        ArrayList<Integer> Hongbao=new ArrayList<>();//创建一个集合,里面是分成X份的金额
        int qunzhuyue=getMoney();//群主目前余额,
        if (qunzhuyue<ZongE){
            System.out.println("余额不足");
            return Hongbao;
        }
        super.setMoney(qunzhuyue-ZongE);//目前群主余额

        int avg=ZongE/JiFen;//每个红包的金额
        int Lingtou=ZongE%JiFen;//除不开的零头

        for (int i = 0; i< JiFen-1; i++) {//除了最后一个,前面几个红包的金额是平均分的
            Hongbao.add(avg);//将平均分好的金额装进集合
        }
        Hongbao.add(avg+Lingtou);//最后一个红包金额是平均金额+零头,也装进集合
        return Hongbao;
        }
    }

组员类:
package HongBao;

import java.util.ArrayList;
import java.util.Random;

public class ZuYuan extends User {
    public ZuYuan() {
    }

    public ZuYuan(String name, int money) {
        super(name, money);
    }
    public void receive(ArrayList<Integer> list){//收红包功能
        int index=new Random().nextInt(list.size());//从红包集合中,随机抽出第index号元素
        int wodehongbao=list.remove(index);//得到红包并将红包从集合中删除
        int dangqiangyue=super.getMoney();//该组员原来有多少钱
        super.setMoney(wodehongbao+dangqiangyue);//现在余额
    }
}
实施:
package HongBao;

import java.util.ArrayList;

public class Demo01FaHongBao {
    public static void main(String[] args) {
        Qunzhu qunzhu=new Qunzhu("群主",20);
        ZuYuan zuYuana=new ZuYuan("a",0);
        ZuYuan zuYuanb=new ZuYuan("b",0);
        ZuYuan zuYuanc=new ZuYuan("c",0);

        qunzhu.show();
        zuYuana.show();
        zuYuanb.show();
        zuYuanc.show();
        System.out.println("====================");

        ArrayList<Integer> Hongbao=qunzhu.faHongBao(16,3);
        zuYuana.receive(Hongbao);
        zuYuanb.receive(Hongbao);
        zuYuanc.receive(Hongbao);

        qunzhu.show();
        zuYuana.show();
        zuYuanb.show();
        zuYuanc.show();
        System.out.println("====================");

    }
}

二、接口interface(多个的公共规范标准)

1接口:1概念:是多个的公共规范标准,是一种引用数据类型,其中最重要的内容就是抽象方法

             2格式:public interface 接口名称{接口内容}

             3接口中可以包含的内容有:1常量 2抽象方法 3默认方法   4静态方法  5私有方法

             4注意事项:1接口不能有静态代码块

                                 2接口不能有构造方法(因为不能从接口直接新建对象)

                                 3一个接口的实现类,可以同时实现多个接口,写法:

                                        public class InterFaceImpl implements InterFaceA,InterFaceB{    }

                                                        InterFace实现类        继承               接口A   ,  接口B

                                 4如果实现类所实现的多个接口中存在重复抽象方法,那么只需覆盖重写一个

                                 5如果实现类没有覆盖重写所有接口中的所有方法,那么这个实现类就是一个

                                   抽象类

                                6如果实现类所实现的多个接口中存在重复默认方法(出现冲突),

                                   那么需要覆盖重写其中一个

                                7一个类可以继承父类并且同时实现接口方法,写法:

                                  public Zi extends Fu implements InterFace,此时如果Fu方法和InterFace

                                  中的方法重名,要优先父类方法执行。

                                8接口和接口之间也可以是多继承关系:写法:

                                  InterFace extends InterFacaA,InterFaceB;此时如果接口A,B中的

                                  默认方法有冲突,要进行覆盖重写,并且其中default关键字不能省略

2接口抽象方法的使用:(使用方法和子类父类中的抽象方法很像,就是关键字不同)

                                        1前两个修饰符必须是public absract两个固定关键字

                                                (也可省略,但不能是别的)

                                        2接口不能直接使用,要创建一个实现类,来实现接口。格式:        

                                                   (public class 实现类名称 implements 接口名称)

                                        3接口的实现类必须覆盖重写(实现)接口中所有方法

                                        4创建实现类的对象,对接口进行使用

3接口的默认方法:1格式:public default 返回值类型 方法名称(参数列表){方法体}

                               2作用:用来解决接口升级(升级=接口增加新的抽象方法,

                                             同时还有保证原有的实现类继续使用)的问题

                               3使用方法:将新添加的方法改成默认方法,可以在实现类的对象中直接调用                                                       也可以在实现类中对默认方法进行覆盖重写

4接口的静态方法:public static 返回值类型 方法名称(参数列表){   }  (此处回忆static的含义)

                         使用静态方法的格式:接口名称.静态方法名(参数)                            

                         注意:静态方法不能从接口实现类新建对象来使用

5接口的私有化方法:解决多个方法体中重复代码的问题,因为是写在接口父类中的,

                                   并不想让接口的实现类调用,所以要用到私有化,私有化有两种:

             1普通私有方法(解决默认方法之间重复代码问题):

                                        格式:private 返回值类型 方法名称(参数列表){方法体}

             2静态私有方法(解决静态方法之间重复代码问题):

                                         格式:private static 返回值类型 方法名称(参数列表){方法体}
 

6接口的常量定义及使用:1格式:public static final 数据类型 常量名称=数据值;

                                           其中常量名称使用完全大写 并用“_”进行连接

                                        (final就是不可变的意思,不写也行,但只要写在interface里就是常量)

                                          2注意事项:接口中的常量必须赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值