Java的继承机制是面向对象编程的重要概念之一,它允许一个类(子类)基于另一个类(父类)来构建,并且可以继承父类的属性和方法。下面是关于Java继承机制的一些重要点:
extends关键字:在Java中,通过使用 extends 关键字来建立类之间的继承关系。子类使用 extends 关键字引用父类,这样子类就可以继承父类的特性。
单继承:Java是单继承的,意味着一个类只能继承一个直接的父类。但是可以通过多层继承来间接地继承多个类的特性。
super关键字:子类可以使用 super 关键字来引用父类的成员变量和方法。通过 super
关键字,子类可以调用父类的构造方法、访问父类的属性或者调用父类的方法。
方法重写:子类可以重写(覆盖)父类的方法,以便在子类中提供特定的实现。子类通过提供与父类中相同名称和参数列表的方法来实现方法重写。
访问权限:子类可以访问其父类中的 public 和 protected 成员,但不能直接访问父类中的 private 成员。
继承层次:继承可以形成层次结构,即一个类可以作为另一个类的子类,而这个子类又可以作为另一个类的父类,以此类推。这样的层次结构可以通过继承来实现代码的组织和复用。
抽象类和接口:Java中还有抽象类和接口的概念,它们也是用来实现代码重用和多态性的重要机制。抽象类可以包含抽象方法和具体方法,而接口只包含常量和抽象方法。子类可以通过继承抽象类或者实现接口来实现特定的功能。
继承机制是Java编程语言中的核心概念之一,它使得代码的组织和复用变得更加灵活和方便,同时也提供了多态性的支持,使得代码更具有扩展性和可维护性
这段代码(代码在最后)涉及了继承、定时任务调度和Spring的Bean管理。
定义一个父类Fu,两个子类分别为ZiOne、ZiTwo。在父类中定义类变量str,通过定时任务打印出各自调用print方法后的输出结果。
Fu
类是一个普通的Spring服务类,使用了 @Service
注解,表示它是一个Spring Bean,会被Spring容器管理。它还使用了 @EnableScheduling
注解,表示启用了定时任务调度功能。
ZiOne
和 ZiTwo
类分别继承了 Fu
类。它们也是Spring服务类,并使用了相同的注解,表示它们也是Spring Bean,并且继承了父类 Fu
中的定时任务调度功能和 str
字段。
在 Fu
类中,有一个 print()
方法,使用了 @Scheduled
注解,表示这是一个定时任务方法,会定期执行。它会在每隔15秒输出当前线程名和 str
字段的值。
在子类 ZiOne
和 ZiTwo
中,重写了 print()
方法,并在方法中调用了父类的 print()
方法,从而实现了定时任务的调用链。在构造方法中,它们分别修改了父类中的 str
字段的值。
在Spring启动后,由于使用了 @EnableScheduling
注解,定时任务调度功能会自动生效。因此,每隔15秒,所有Bean中的 print()
方法都会被调用一次。由于子类重写了父类的 print()
方法,所以每个子类的 print()
方法会被分别调用,输出当前线程名和对应子类中 str
字段的值。
输出结果(日志均由父类的线程打印出,所以线程名一致,但输出的str变了):
pool-7-thread-1--------->zione
pool-7-thread-1--------->fu
pool-7-thread-1--------->zitwo
代码演示了继承和方法重写的概念,以及Spring Boot中定时任务的调度机制。通过继承父类和重写方法,子类可以对父类的行为进行扩展或修改。同时,Spring Boot的定时任务功能可以方便地进行任务调度,使得定时执行的任务可以轻松地集成到应用程序中。
继承是面向对象编程中的一个重要概念,常用于以下场景:
代码复用:继承可以使子类获得父类的属性和方法,从而避免了重复编写相同的代码。通过继承,可以将共性的功能提取到父类中,子类只需专注于实现自己特有的功能。
多态性:继承是实现多态性的基础之一。通过继承,子类可以重写父类的方法,从而实现多态。在程序运行时,可以根据实际情况调用子类的方法,从而实现不同对象的不同行为。
软件设计中的抽象化:继承可以帮助软件设计者抽象出更一般化、更通用的类,从而提高代码的可维护性和可扩展性。通过继承,可以建立层次结构,将相关的类组织在一起,使代码更易于理解和管理。
实现接口和抽象类:接口和抽象类通常用于定义类的行为和规范。通过继承,可以实现接口和抽象类中定义的方法,从而使类具有特定的行为和功能。
框架和库的设计:在框架和库的设计中,继承常常被用来定义基础类或通用类,然后由具体的子类来扩展和定制功能。这样可以提高代码的重用性,并且使框架和库更加灵活和易于扩展。
实现“is-a”关系:继承用于描述类之间的“is-a”关系,即子类是父类的一种特殊形式。例如,猫是动物的一种,所以可以用继承来表示猫是动物类的子类。
覆盖特定行为:有时候,父类提供的方法不能完全满足子类的需求,子类可以通过继承来覆盖父类的方法,以实现特定的行为。
这些是继承常见的应用场景,通过合理的使用继承,可以使程序设计更加模块化、可扩展和易于维护。然而,过度使用继承也会导致代码的耦合性增加,使得代码变得复杂和难以理解,因此在设计和使用时需要谨慎考虑。
Fu.Class
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
/**
* @Author: Kyle
* @date 2024/2/18 16:07
*/
@EnableScheduling
@Service
public class Fu {
protected String str = "fu";
@Scheduled(cron = "0/15 * * * * ?")
public void print(){
System.out.println(Thread.currentThread().getName()+"--------->"+str);
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
ZiOne.Class
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
/**
* @Author: Kyle
* @date 2024/2/18 16:10
*/
@EnableScheduling
@Service
public class ZiOne extends Fu{
public ZiOne() {
super.str = "zione";
}
@Scheduled(cron = "0/15 * * * * ?")
public void print(){
super.print();
}
}
ZiTwo.Class
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
/**
* @Author: Kyle
* @date 2024/2/18 16:10
*/
@EnableScheduling
@Service
public class ZiTwo extends Fu{
public ZiTwo() {
super.str = "zitwo";
}
@Scheduled(cron = "0/15 * * * * ?")
public void print(){
super.print();
}
}