1、抽象类的概念
包含抽象方法的类称之为抽象类,抽象方法是指只声明,并不实现的方法,抽象方法和类名都要由abstract修饰。如下就是一个标准的抽象类:
abstract class A{
public abstract void setName();
}
用abstract修饰的类,如果不包含抽象方法,也叫抽象类。
2、使用抽象类的原则
抽象类不能被实例化,如下代码中实例化抽象类会出错:
public class Test{
public static void main(String args[]){
A a;//声明对象
a = new A();//出错
}
}
应用抽象类只能通过子类,换句话说,抽象类必须被子类继承,这与final修饰的类正好相反。子类继承抽象类,必须把抽象类中的所有抽象方法都实现。
值的注意的是,抽象类虽然不能直接实例化,却有构造方法,它的构造方法仅在子类中被调用。
通过对象的多态性实现抽象类,通过子类实例化并向上转型为父类,调用的方法是被重写过的方法,代码如下所示:
abstract class A{
public abstract void printA();
}
class B extends A{
public void printA(){
system.out.printin("A");
}
}
class Test{
public static void main(String args[]){
A a = new B();
A.printA();//输出A
}
}
3、抽象类的用途
简单来说,抽象类就是一个模板,它约束子类必须实现的方法。如下所示,体会一下抽象类的作用:
abstract class Person1{
private String name;
private int age;
public Person1(String name,int age){
this.name =name;
this.age = age;
}
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 void say(){
System.out.println(this.getContent());
}
public abstract String getContent();
}
class Student1 extends Person1{
private float score;
public Student1(String name,int age,float score){
super(name,age);
this.score = score;
}
public float getScore(){
return this.score;
}
public void setScore(float score){
this.score = score;
}
public String getContent(){
return "学生姓名:"+super.getName()+"年龄:"+super.getAge()+"分数:"+this.score;
}
}
class Worker extends Person1{
private float salary;
public Worker(String name,int age,float salary){
super(name,age);
this.salary = salary;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
public String getContent(){
return "工人姓名:"+super.getName()+"年龄:"+super.getAge()+"分数:"+this.salary;
}
}
public class AbatractExample {
public static void main(String args[]){
Person1 ps = new Student1("张三",16,89);
Person1 pw = new Worker("张二",23,10000);
ps.say();
pw.say();
}
}
学生和工人都有姓名、年龄属性,都有说say的方法,但说的内容不同,此外学生还有成绩属性,工人还有工资属性。
定义Person类为模板,使得学生和工人都要有姓名、年龄属性,并实现say方法,学生say的内容加上成绩,工人say的内容加上工资。
执行结果如下: