抽象类
抽象类的主要作用在于对子类中覆写方法进行约定,在抽象类里定义一些抽象方法,抽象方法是使用了abstract关键字并且未提供方法体的方法,抽象方法所在的类必须为抽象类(也可能是接口,但接口中所有的方法都不能有方法体),抽象类必须使用abstract关键字进行定义
abstract class Message1{ //定义抽象类
private String msg;
public abstract void getInfo() ; //抽象方法
public void setMsg(String msg){ //普通方法
this.msg = msg;
}
public String getMsg(){ //普通方法
return this.msg;
}
}
抽象类是不可以直接new的,如果要想使用抽象类:
1.抽象类必须提供有子类,子类使用extends继承一个抽象类(一个子类只能继承一个类)
2.抽象类的子类(该子类不是抽象类)一定要覆写抽象类中的所有抽象方法
3.抽象类的对象实例化可以利用对象多态性通过子类向上转型完成
class Amessage extends Message1{
@Override //覆写
public void getInfo() {
System.out.println("xxxxxxxxxx");
}
}
public class demo01 {
public static void main(String[] args) {
Message1 message1 = new Amessage();
message1.getInfo();
message1.setMsg("aaaaaaaa");
System.out.println(message1.getMsg());
}
}
-----------------------------------------------------
结果:
xxxxxxxxxx
aaaaaaaa
-----------------------------------------------------
关于抽象类的使用:
1.注意:抽象类无法自己实例化。
2.使用抽象类是为了解决继承时所带来的的代码重复处理。
3.不能使用final修饰一个抽象类,因为抽象类必须有子类,而final定义的类是不能有子类的。
4.抽象类是在普通类上扩展的,即只是在普通类里追加抽象方法,所以抽象类中可以有属性和普通方法,也可以有构造方法,并且子类也一定会按照子类对象的实例化原则进行父类构造调用。
5.抽象类中可以没有抽象方法,但是也不可以直接实例化。
abstract class Message1{ //抽象类
private String msg;
public Message1(String msg){ //有参构造
this.msg = msg;
}
public abstract void getInfo() ; //抽象方法
public void setMsg(String msg){ //普通方法
this.msg = msg;
}
public String getMsg(){ //普通方法
return this.msg;
}
}
class Amessage extends Message1{
public Amessage(String msg){ //有参构造
super(msg); //调用父类有参构造
}
@Override
public void getInfo() {
System.out.println("xxxxxxxxxx");
}
}
public class demo01 {
public static void main(String[] args) {
Message1 message1 = new Amessage("aaaaaaaa");
message1.getInfo();
System.out.println(message1.getMsg());
}
}
6.抽象类可以提供有static方法,并且方法不受到抽象的影响
abstract class Message1{ //抽象类
public abstract void getInfo() ; //抽象方法
public static Message1 getInstance(){ //static方法
return new Amessage();
}
}
class Amessage extends Message1{
@Override
public void getInfo() {
System.out.println("xxxxxxxxxx");
}
}
public class demo01 {
public static void main(String[] args) {
Message1 message1 = Message1.getInstance();
message1.getInfo();
}
}
---------待补充------------
final、private、static关键字不能与abstract共存
被abstract修饰的方法在被子类继承时全都要重写实现