Java抽象类构造器的作用
抽象类中的构造器方法会在子类实例化的时候调用
如下:
abstract class Person {
Person(){
System.out.println("Person 无参");
}
Person(String a){
System.out.println("Person 有参"+a);
}
}
//boy继承person
public class Boy extends Person{
Boy(){
System.out.println("Boy 无参");
}
Boy(String a){
System.out.println("Boy 有参"+a);
}
Boy(int a){
super(a+"");
System.out.println("Boy int有参"+a);
}
public static void main(String[] args) {
Boy h=new Boy();
System.out.println("-----------");
new Boy("aa");
}
}
结果如下:
Person 无参
Boy 无参
-----------
Person 无参
Boy 有参aa
可以看到子类继承抽象类后,子类实例化时会自动执行父类的无参构造方法。
延申使用:
1:可以利用抽象类构造器的此特点获取所有的子类,并调用子类中的方法
Person.java
public abstract class Person {
public static final List<Person> ALLLIST=new ArrayList<>();
//父类初始化添加子类实例
Person(){
Person.ALLLIST.add(this);
System.out.println("Person 无参");
}
Person(String a){
System.out.println("Person 有参"+a);
}
abstract void init();
}
Girl.java
public class Girl extends Person{
@Override
void init() {
System.out.println("girl 初始化...");
}
}
Boy.java
//boy继承person
public class Boy extends Person{
public static void main(String[] args) {
//在普通方法中需要实例化。ALLLIST才会把子类添加到list集合中
//在springboot项目中,只要将Boy与Girl方法添加@Component注解即可将子类添加到集合中,无需new实例化对象
Boy b=new Boy();
Girl g=new Girl();
//list中可以获取所有继承Person的子类
List<Person> list=Person.ALLLIST;
System.out.println("所有的子类:"+list);
//调用子类中的方法
list.forEach(e -> e.init());
}
@Override
void init() {
System.out.println("boy 初始化...");
}
}
运行结果:
Person 无参
Person 无参
所有的子类:[abstrac.Boy@9e89d68, abstrac.Girl@3b192d32]
boy 初始化...
girl 初始化...
抽象类可以实现接口,然后不用重写接口中的任何方法
在定义接口后,若有接口的实现类,那么必须去重写接口中的所有方法。能不能不重写接口的方法呢,当然是可以的,如果是抽象类实现了接口,即可不用重写接口的任何方法。
public interface TestService {
void printTest();
String printTest1();
}
public class TestServiceImpl implements TestService {
@Override
public void printTest() {
System.out.println("进入printTest");
}
@Override
public String printTest1() {
System.out.println("进入printTest1");
return "进入printTest1";
}
}
public abstract class AbstractTest implements TestService{
//可以不去实现TestService中的任何接口
}