1.抽象类的定义
1.1 抽象类是一种模板模式。子类可以继承这个模板进行扩展。
1.2 通过抽象类,避免了子类设计的随意性。抽象类可以定义抽象方法,子类继承抽象类就必须实现这些抽象方法才能进行实例化。
2.格式
abstract class 类名称{
属性;
方法;
}
抽象方法格式:权限修饰符 abstract 返回值类型 方法名();
3.代码示范
定义抽象类Person,有抽象方法eat().
public abstract class Person {
//属性
private String name;
private int age;
private char gender;
int i;
//构造方法
public Person(){}
public Person(String name, int age, char gender){
this.name = name;
this.age = age;
this.gender = gender;
}
//生成get/set方法
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;
}
public char getGender(){
return gender;
}
public void setGender(char gender){
this.gender = gender;
}
public String toString(){
return "name="+name+", age="+age+", gender="+gender;
}
//eat方法
public abstract void eat();
//sleep方法
void sleep(){
System.out.println("这是sleep方法。。。");
}
}
定义学生类,继承了Person类,实现了Person类的eat()方法
public class Student extends Person{
//属性
private int score;
int i = 10;
//构造
public Student(){}
public Student(String name, int age, char gender, int score){
super(name, age, gender);
this.score = score;
}
//生成get/set方法
public int getScore(){
return score;
}
public void setScore(int score){
this.score = score;
}
public String toString(){
return "name="+getName()+", gender="+getGender()+", score="+score;
}
@Override
public void sleep() {
System.out.println("学生的sleep方法。。。");
}
public void score(){
System.out.println("学生的score方法。。。");
}
@Override
public void eat() {
System.out.println("实现的抽象方法:eat方法");
}
}
测试类
public class Test {
public static void main(String[] args) {
//多态测试
Person p = new Student("李四", 18, '男', 99);
System.out.println(p.i);
System.out.println(p.getName());
p.eat();
p.sleep();
System.out.println(p);
}
}
结果
0
李四
实现的抽象方法:eat方法
学生的sleep方法。。。
name=李四, gender=男, score=99
总结:
1.抽象方法和抽象类必须要用abstract来修饰;
2.抽象方法没有方法体,只需声明不需实现(没有方法体);
3.有抽象方法的类必须是抽象类;
4.抽象类里面的方法不一定都是抽象方法,也可能没有抽象方法;
5.抽象类可以包括属性,方法和构造方法;
6.抽象类不能被实例化,只能被继承,子类继承重写方法之后可以利用多态的对象向上转型,为其实例化;
7.抽象方法必须被子类实现。子类必须重写了所有抽象方法才能被实例化,否则子类还是抽象类。