1.抽象概念的引入
在继承关系中,我们将子类中的共性功能向上抽取到父类,并且对这些共性功能在父类中给出了具体的实现。但是实际上父类并不知道子类对于共性功能的具体实现,所以可以将共性功能抽象出来,具体的实现细节由子类自身的差异性,去具体实现。
换句话说,父类只需要给出共性功能的声明即可,也就是把共性功能定义为抽象的。
public class MyTest {
public static void main(String[] args) {
Aniaml aniaml= new Cat();
aniaml.setName("泰迪");
aniaml.setAge(3);
System.out.println(aniaml.getName());
System.out.println(aniaml.getAge());
aniaml.eat();
aniaml.sleep();
//需要访问子类中特有的功能,需要向下转型
Cat cat= (Cat) aniaml;
cat.catchMouse();
}
}
//父类,抽象类
abstract class Aniaml{
//父类中的成员变量
private String name;
private int age;
/*父类只需要给出共性功能声明即可,也就是把
共性功能定义为抽象的
*/
public abstract void eat();
public abstract void sleep();
//设置set,get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//子类:猫类
class Cat extends Aniaml{
@Override
public void eat() {
System.out.println("小猫吃鱼");
}
@Override
public void sleep() {
System.out.println("小猫喜欢在温暖的地方睡觉");
}
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
输出的结果为:
泰迪
3
小猫吃鱼
小猫喜欢在温暖的地方睡觉
猫抓老鼠
2.抽象类与抽象方法
- abstract关键字为抽象的意思,可以修饰方法,也可以修饰类
- 在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类须定义为抽象类
抽象类与抽象方法的注意事项 |
---|
一旦类中有了抽象方法,此类必须定义为一个抽象类 |
一个抽象类中,可以没有抽象方法,当然也可以有非抽象方法 |
抽象类中可以有抽象方法,也可以有非抽象的方法。非抽象方法,可以让子类进行继承使用;抽象方法强制子类必须进行重写 |
抽象类中存在构造方法,作用是:创建子类时,先初始化父类的数据 |
抽象类不能直接创建其对象,可以直接采取多态的方式,间接进行实例化 |
作为抽象类的子类,必须重写父类中所有的抽象方法;当然也可以不重写父类中的抽象方法,将自己定义为抽象类即可 |
public class MyTest {
public static void main(String[] args) {
/*1.一个类中有了抽象方法,此类也必须定义为抽象类
2.抽象类中可以有抽象方法,可以有非抽象方法
3.非抽象方法可以让子类继承使用,抽象方法要强制
子类必须进行重写
4.抽象类中存在构造方法,作用是:创建子类时,
先初始化父类的数据
5.抽象类不能直接创建其对象,可以采取多态的形式
进行实例化
*/
Fu fu = new Zi();
//多态形式访问成员变量,编译看父类,运行看父类
System.out.println(fu.num);//50
//多态访问成员方法,成员方法有重写,编译看父类,运行看子类
fu.show();
}
}
//父类,抽象类
abstract class Fu{
//父类的空参构造
public Fu(){
System.out.println("父类构造执行了");
}
//父类的成员变量
int num=50;
//抽象方法
public abstract void show();
}
class Zi extends Fu{
//子类的构造方法
public Zi(){
System.out.println("子类构造执行了");
}
//子类的成员变量
int num=200;
//子类重写父类中的成员方法
@Override
public void show() {
System.out.println("子类重写父类的show方法");
}
}
输出的结果为:
父类构造执行了
子类构造执行了
50
子类重写父类的show方法
/*作为抽象类的子类,必须重写子类中的抽象方法,
或者将子类自己定义为一个抽象类
*/
public abstract class CC {
public abstract void cc();
public abstract void cc1();
public abstract void cc2();
}
//方式一:重写父类CC中的所有抽象的方法
class DD extends CC{
@Override
public void cc() {
}
@Override
public void cc1() {
}
@Override
public void cc2() {
}
}
//方式二:将子类ee也定义为抽象类,将父类中抽象方法继承使用
abstract class EE extends CC{
}
3.抽象类与抽象方法的简答题
1.一个类中如果没有抽象方法,可不可以定义为抽象类?如果可以,有何意义?
抽象类中可以有抽象方法,可以有非抽象方法。非抽象方法可以继承让子类进行使用,抽象方法要求子类必须进行重写。
一个类中如果没有抽象方法,可以定义为抽象类。外界不能直接创建该抽象类的对象。
2.abstract关键字不能与哪些关键字进行共存?
abstract关键字不能共存的关键字 |
---|
abstrct不能与fianl关键字进行共存:abstract强制子类重写方法,final修饰的方法不能被子类进行重写 |
abstract不能与private关键字进行共存:private修饰的方法无法继承,也无法进行重写 |
abstract不能与static关键字共存:静态方法不参与重写,abstract修饰的方法要求子类进行重写 |