java 抽象类,子类调用抽象父类的公用方法
时间: 2024-01-09 10:01:48 浏览: 145
Java中的抽象类是一种不能被实例化的类,只能被继承的类。抽象类中可以包含抽象方法和普通方法,抽象方法是没有具体实现的方法,需要子类来实现,而普通方法则有具体的实现。
当子类继承抽象父类时,可以调用父类的公用方法。这是因为抽象类的公用方法在抽象类中已经有了具体的实现,子类可以直接调用这些方法来完成相应的功能。子类可以通过创建对象来调用这些公用方法,也可以通过super关键字来调用父类的方法。
在子类中调用抽象父类的公用方法有几个注意事项。首先,子类必须实现所有抽象方法,否则会导致编译错误。因为抽象方法没有具体的实现,在子类中必须重写这些方法来提供具体的实现。其次,父类的公用方法必须是public或protected类型的,才能在子类中被调用。如果父类的方法是private类型的,子类是无法访问的。最后,子类在调用父类的公用方法时,可以根据需要对方法进行重写,以实现特定的功能。
总而言之,子类可以调用抽象父类的公用方法,但需要注意实现所有的抽象方法,并且确保父类的公用方法可访问。这样可以通过子类来使用抽象父类中已有的功能,并且可以在子类中对方法进行重写,以满足特定需求。
相关问题
spring 抽象类 属性注入
在Spring中,抽象类可以被注入属性。可以使用@Autowired或@Resource注解来注入属性。这样做的好处是可以避免重复的代码,通过继承抽象类来实现公用的代码。同时,抽象类也可以被Spring管理,可以在抽象类中定义一些公共的方法和属性,供子类继承和使用。在子类中,可以通过super关键字来调用抽象类中的方法和属性。
用C++代码写一个模板方法模式
模板方法模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤延迟到子类中实现。该模式主要由一个抽象类和提供实现的具体子类组成。C语言可以通过函数指针实现模板方法模式,具体实现如下:
```c
#include <stdio.h>
/* 抽象基类 */
struct AbstractClass{
/* 模板方法,该方法定义了算法的骨架 */
void (*templateMethod)(struct AbstractClass*);
};
/* 具体实现类1 */
struct ConcreteClass1{
struct AbstractClass super; /* 具体实现类1继承了抽象基类 */
/* 子类实现的具体方法 */
void (*primitiveOperation1)(void){
printf("ConcreteClass1 implements primitiveOperation1\n");
}
/* 子类实现的具体方法 */
void (*primitiveOperation2)(void){
printf("ConcreteClass1 implements primitiveOperation2\n");
}
};
/* 具体实现类2 */
struct ConcreteClass2{
struct AbstractClass super; /* 具体实现类2继承了抽象基类 */
/* 子类实现的具体方法 */
void (*primitiveOperation1)(void){
printf("ConcreteClass2 implements primitiveOperation1\n");
}
/* 子类实现的具体方法 */
void (*primitiveOperation2)(void){
printf("ConcreteClass2 implements primitiveOperation2\n");
}
};
/* 具体实现类1实现的模板方法 */
void ConcreteClass1_templateMethod(struct AbstractClass* this){
struct ConcreteClass1* concrete = (struct ConcreteClass1*)this;
concrete->primitiveOperation1();
concrete->primitiveOperation2();
}
/* 具体实现类2实现的模板方法 */
void ConcreteClass2_templateMethod(struct AbstractClass* this){
struct ConcreteClass2* concrete = (struct ConcreteClass2*)this;
concrete->primitiveOperation2();
concrete->primitiveOperation1();
}
int main(int argc, char* argv[]){
/* 初始化具体实现类1对象 */
struct ConcreteClass1 concrete1 = {
.super = {.templateMethod = &ConcreteClass1_templateMethod},
.primitiveOperation1 = &ConcreteClass1_primitiveOperation1,
.primitiveOperation2 = &ConcreteClass1_primitiveOperation2
};
/* 初始化具体实现类2对象 */
struct ConcreteClass2 concrete2 = {
.super = {.templateMethod = &ConcreteClass2_templateMethod},
.primitiveOperation1 = &ConcreteClass2_primitiveOperation1,
.primitiveOperation2 = &ConcreteClass2_primitiveOperation2
};
/* 调用具体实现类1的模板方法 */
concrete1.super.templateMethod(&concrete1.super);
/* 调用具体实现类2的模板方法 */
concrete2.super.templateMethod(&concrete2.super);
return 0;
}
```
以上就是使用C语言实现模板方法模式的代码。每个具体实现类继承了抽象基类,并实现了自己的子类具体方法。模板方法以函数指针方式存在于抽象基类中,并被具体实现类所调用。通过模板方法模式,我们可以公用代码骨架,实现代码的复用性和扩展性。
阅读全文