面向对象的抽象类
一、抽象类概念
-
在面向对象的概念中,所有的对象都是通过类来描绘的。但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
-
抽象类除了
不能实例化对象
之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。 -
由于
抽象类不能实例化对象,所以抽象类必须被继承,才能被使用
。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。 -
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
-
在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
二、抽象类
1.abstract:抽象的
2.注意:
1.抽象类不能被实例化
2.虽然抽象类没有办法实例化,但是抽象类也有构造方法。 该构造方法是给子类创建对象用的。
3.一个非抽象的类继承抽象类,必须将抽象类中的抽象方法覆盖、实现、重写。
4.只有当子类中重写父类中所有的抽象方法时,才能实现实例化。否则子类还是一个抽象类。
public abstract class Pet {
// 属性
private String name = "无名氏"; // 名字 默认值
private int health = 100; // 健康值 默认值
private int love = 0; // 亲密度 默认值
/**
* 无参构造方法
*/
public Pet(){
this.health = 95;
System.out.println("执行宠物的无参构造方法。");
}
/**
* 有参构造方法
* @author DELL 昵称
*/
public Pet(String name){
this.name = name;
}
/**
* 指定读取宠物的姓名
* @return
*/
public String getName() {
return name;
}
/**
* 指定读取宠物的健康信息
* @return
*/
public int getHealth() {
return health;
}
/**
* 指定读取宠物的亲密度信息
* @return
*/
public int getLove() {
return love;
}
/**
* 输出宠物的信息
*/
public abstract void print();
}
三、抽象方法
1.抽象方法只声明不实现,不能用static修饰。
2.声明抽象方法会造成以下两个结果:
- 如果一个类包含抽象方法,那么该类必须是抽象类。 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
- 继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
public class Dog extends Pet {
private String strain; // 品种
/**
* 有参构造方法
*
* @param name
* 昵称
* @param strain
* 品种
*/
public Dog(String strain) {
this.strain = strain;
}
public Dog(String name, String strain) {
super(name); // 这里不能用 this.name=name
this.strain = strain;
}
public String getStrain() {
return strain;
}
/**
* 重写父类中的print()方法,由于父类为抽象类
* 只有当子类中重写父类中所有的抽象方法时,才能实现实例化
* 否则子类还是一个抽象类
*/
public void print() {
System.out.println("我是一只"+this.strain+"。");
}
}
在上述代码中,子类继承并重写了父类里的抽象方法,具体输出宠物的品种。
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// Pet p = new Pet("贝贝"); //抽象的类不能被实例化
// p.print();
//错误: Cannot instantiate the type Pet
Pet p = new Dog("雪纳瑞");
p.print();
}
}
结果:
执行宠物的无参构造方法。
我是一只雪纳瑞。
四、总结
-
抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
-
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
-
抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
-
构造方法、类方法(用 static 修饰的方法)不能声明为抽象方法。
-
抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。