virtual这个关键字有啥用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了virtual这个关键字有啥用相关的知识,希望对你有一定的参考价值。

virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。
public virtual double Area()

return x * y;
虚拟成员的实现可由派生类中的重写成员更改

调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。

默认情况下,方法是非虚拟的。不能重写非虚方法。

virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。

除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。

在静态属性上使用 virtual 修饰符是错误的。

通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。

参考资料:http://msdn.microsoft.com/zh-cn/library/9fkccyh4(VS.80).aspx

参考技术A 表示为虚函数

子类override 这个函数后, 当调用些函数,就掉用的是子类的函数
比如:
class A

public virtual void fun()

class B:A

public override void fun()


调用函数:
static void main()

A b1 = new B(); //这里b1是A类型 的
b1.fun();//调用的是B里的fun()函数


楼内的几位朋友你们弄错了吧,虚函数是可以有函数体的,不要把它与抽象函数搞混了
参考技术B 可以让子类重新实现用virtual标记的类成员 参考技术C 虚函数:由virtual声明,它允许在派生类中被重写,要重写方法,必须先声名为virtual
简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。
参考技术D 2楼在误人子弟,你说的那叫抽象函数(abstract)。

@Transactional 与 JPA 和 Hibernate 有啥用?

【中文标题】@Transactional 与 JPA 和 Hibernate 有啥用?【英文标题】:What is the use of @Transactional with JPA and Hibernate?@Transactional 与 JPA 和 Hibernate 有什么用? 【发布时间】:2019-06-16 23:42:48 【问题描述】:

我正在学习如何使用 JPA 和 Hibernate 以及 MySQL 数据库创建 REST API,我看到了这个 @Transactional 注释。有人可以解释这个注释的用途吗?

例如我有这个简单的 DAO 类:

@Repository
public class EmployeeDAOHibernateImpl implements EmployeeDAO 

    // define field for entitymanager
    private EntityManager entityManager;

    // set up constructor injection
    @Autowired
    public EmployeeDAOHibernateImpl(EntityManager entityManager) 
        this.entityManager = entityManager;
    

    @Override
    @Transactional
    public List<Employee> findAll() 

        // get the current hibernate session
        Session currentSession = entityManager.unwrap(Session.class);

        // create a query
        Query<Employee> theQuery = 
                currentSession.createQuery("from Employee", Employee.class);

        // execute query and get result list
        List<Employee> employees = theQuery.getResultList();

        // return the results
        return employees;
    


您可以看到用于 findAll() 方法的@Transactional,但是如果我删除这个@Transactional 我会得到相同的输出...那么这个@Transactional 有什么用?

【问题讨论】:

Spring - @Transactional - What happens in background?的可能重复 这与 JPA ... FWIW 无关。那是春天 【参考方案1】:

@Transactional 注释用于当您希望某个方法/类(=内部的所有方法)在事务中执行时。

假设用户 A 想要将 100 美元转给用户 B。会发生什么:

    我们将 A 的账户减少 100 美元 我们向 B 的帐户添加 100 美元

假设在成功1) 之后和执行2) 之前抛出异常。现在我们会出现某种不一致,因为A 损失了 100 美元,而B 一无所获。 交易意味着全部或全部。如果方法中某处抛出异常,则更改不会持久保存在数据库中。发生了名为rollback 的事情。

如果您不指定@Transactional,每个数据库调用将在不同的事务中。

【讨论】:

一个不错的答案,但应该添加一件事 - 如果示例代码 @Transactional 是不必要的,也许它是“迷信编程”,有人总是添加 @Transactional 即使它没有效果“只是万一”:)【参考方案2】:

一般@Transactional注解写在服务层。

它用于将多个写入在数据库上作为单个原子操作

当有人调用带有@Transactional 注释的方法时数据库上的所有或没有写入被执行

在读取操作的情况下它没有用,因此在单个原子写入的情况下也是如此。您在单次读取(选择)中使用它,因此添加或删除 @Transactional 注释没有影响。

【讨论】:

在读取操作中,如果使用 Java Streams 来放置选择结果会很有用... 值得补充的是,当对处于persistent 状态(由实体管理器管理)的实体进行多次更新时,应使用@Transactional,因此save() 不能显式放入代码,但设置器在实体上调用 @viruskimera 你能详细说明或提供一些链接吗?【参考方案3】:

该类在其自身或其成员上声明@Transactional,Spring 创建一个代理,该代理实现与您正在注释的类相同的接口。换句话说,Spring 将 bean 包装在代理中,而 bean 本身不知道它

代理为 Spring 提供了一种在方法调用之前、之后或周围将行为注入被代理对象的方法。

在内部,它与使用事务通知(使用 AOP)相同,其中首先创建代理并在目标 bean 的方法之前/之后调用。

生成的代理对象由 Spring 创建的 TransactionInterceptor 提供。因此,当从客户端代码调用@Transactional 方法时,首先从代理对象调用TransactionInterceptor,代理对象开始事务并最终调用目标bean 上的方法。当调用完成时,TransactionInterceptor 相应地提交/回滚事务

【讨论】:

以上是关于virtual这个关键字有啥用的主要内容,如果未能解决你的问题,请参考以下文章

C中__IO和静态关键字有啥用?

typedef有啥用?

使用关键字“ref”传递类对象有啥用?默认情况下,它们是通过引用传递的[重复]

瞬态变量有啥用? [复制]

python中print()有啥用?

AS3中的void有啥用