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注意事项:接口中的常量必须赋值
1224

被折叠的 条评论
为什么被折叠?



