一.Java抽象类
概念:在面向对象的概念中,所有的对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描述对象的,如果一个类中没包含足够的信息来描述一个具体的对象,这样的类就是抽象类。
理解:对象跟类相互依赖,Java通过类来创建对象,类用来描述对象。
抽象类除了不能实例化对象之外,类的其他功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
理解:抽象类不能实例化对象,但是可以作为父类被继承。
抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
理解:单继承多实现
二.抽象方法
该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。
Abstract关键字用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
举例:public abstract void eat();
声明抽象方法需注意:
*如果一个类包含抽象方法,那么该类必须是抽象类。
*任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
三.抽象类总结规定:
1.抽象类不能被实例化。
2.抽象类中不一定包含抽象方法,但是有抽象方法的一定是抽象类。
3.抽象类中的抽象方法没有方法体。
4.构造方法、静态方法(Static修饰的方法)不能声明为抽象方法。
5.抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
四.代码
1.抽象类代码:
/**
* 抽象类(继承关系)
* 抽象方法(被实现)
* */
public abstract class Student {
/*
* 成员变量 用private修饰保证成员变量私有
*/
private int number;
private String name;
private String address;
/*
* 有参构造方法,创建对象时,首先调用构造方法
*/
public Student(int number,String name, String address){
this.name=name;
this.number=number;
this.address=address;
}
/*
* 抽象方法,没有方法体
*/
public abstract void jump();
/*
* 具体方法
*/
public void eat(){
System.out.println("eat!");
}
public void sleep(){
System.out.println("sleep!");
}
/*
* 通过get/set方法,获取私有成员变量的值。
*/
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student [number=" + number + ", name=" + name + ", address="
+ address + "]";
}
}
2.抽象类的子类——具体实现类:
/**
* 抽象类的子类——具体实现类
* */
public class ManStudent extends Student{
/*
* 子类的构造方法,首先super();
* 无参调用super();
* 有参就调用super(A,B,C);
* 调用父类的构造方法,才能通过父类的引用指向子类对象。
*/
public ManStudent(int number, String name, String address) {
super(number, name, address);
}
/*
* 可以重写父类的普通方法,也可以直接调用。看具体实现。
*/
public void eat(){
System.out.println("eat two!");
}
public void sleep(){
System.out.println("sleep two!");
}
/*
*必须重写抽象类的抽象方法
*/
@Override
public void jump() {
System.out.println("jump!");
}
public static void main(String[] args) {
Student stu =new ManStudent(1,"1","1");
stu.eat();
stu.sleep();
stu.jump();
}
}
六.面试题
下列哪一种叙述是正确的()
A abstract修饰符可修饰字符、方法和类
B抽象方法的body部分必须用一对大括号{}包住
C声明抽象方法,大括号可有可无
D声明方法不可写出大括号
正确答案:D
A选项abstract修饰符不能修饰字符
B,C选项声明方法body部分不可写大括号