Java继承的三个特点
1. Java语言是【单继承】的。一个类的直接父亲只能有唯一一个。
例如: class A {}
class B extends A {} //正确
class C {}
class D extends A,C {} //错误
2. Java语言可以【多级继承】。我有一个父亲,我父亲还有一个父亲,也就是爷爷。
例如: class A {}
class B extends A {} //正确
class C extends B {} //正确
【java.lang.Object是祖宗类】
3. 一个子类的直接父亲是唯一的,但是一个父类可以拥有很多个子类。可以有很多个兄弟姐妹,生二胎。
例如: class A {}
class B extends A {} //正确
class C extends A {} //正确
方法区中保存的Zi.class{}中包含[[super_class]]
抽象方法与抽象类
如果父类当中的方法不确定如何进行{}方法体实现,那么这就应该是一个【抽象方法】。
父类:计算图形面积的方法 //【抽象方法】 子类:正方形、三角形、圆形
父类:动物爱吃的东西 //【抽象方法】 子类:狗爱吃骨头、猫爱吃鱼
抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束。
例如: public abstract void eat();
//这是一个抽象方法,代表吃东西,但是具体吃什么(大括号的内容)不确定。
抽象类:抽象方法所在的类,必须是抽象类才行。在class之前写上abstract即可。
例如: public abstract class Animal {}
如何使用抽象类和抽象方法:
1. 不能直接创建(new)抽象类对象。
例如: // Animal animal = new Animal();//错误写法!
2. 必须用一个子类来继承抽象父类。
例如: public class Cat extends Animal{}
3. 子类必须覆盖重写抽象父类当中所有的抽象方法。
覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体大括号。
例如: @Override
public void eat(){
System.out.println("猫吃鱼");
}
4. 创建子类对象进行使用。
例如: Cat cat = new Cat();
光标放在抽象子类处,按alt+回车再回车 可以自动覆盖重写
- 抽象类注意事项
1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
理解:抽象方法没有具体的方法体,没有意义。
2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。
3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象的。
理解:一个抽象不一定含有抽象方法,只要保证抽象方法所在的类是抽象类,即可。
这样没有抽象方法的抽象类,也不能直接创建对象,在一些特殊场景下有用途。
4. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。
发红包案例练习
- 案例分析
用户类:姓名、余额
extends:群主类:【发红包的方法】 普通成员类:【收红包的方法】
【发红包】的逻辑,三要素:
返回值类型:ArrayList<Integer>
方法名称:send
参数列表:1. 总共发多少钱 int totalMoney
2. 分成多少份 int count
public ArrayList<Integer> send(int totalMoney, int count) {
//...
}
【收红包】的逻辑,三要素:
返回值类型:void
方法名称:receive
参数列表:ArrayList<Integer>
public void receive(ArrayList<Integer> list) {
//...
}
- 用户类
public class User {
private String name;//姓名
private int money;//余额,也就是当前用户拥有的钱数
//展示一下当前用户有多少钱
public void show() {
System.out.println("我叫:" + name + ",我有多少钱:" + money);
}
// 有参构造、无参构造、Getter/Setter用Alt+Insert自动生成
}