在Java中,匿名类为什么不可以是抽象类?谁来详细地解释一下子
匿名类抽象没有意义啊,抽象类必须被派生具体化才有用,匿名类怎么派生?
是一种思想。可以用在很多方面。比如数据库方面。
悲观锁就是for update(锁定查询的行)
乐观锁就是 version字段(比较跟上一次的版本号,如果一样则更新,如果失败则要重复读
比较写的操作。)
JDK方面:
悲观锁就是sync
乐观锁就是原子类(内部使用CAS实现)
本质来说,就是悲观锁认为总会有人抢我的。乐观锁就认为,基本没人抢。
乐观锁是一种思想,即认为读多写少,遇到并发写的可能性比较低,所以采取在写时先读出 当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重 复读比较写的操作。
CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。CAS顶多算是乐观锁写那一步操作的一种实现方式罢了,不用CAS自己加锁也是可以的。
乐观锁的业务场景及实现方式
每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会进行加锁, 但是在更新数据的时候需要判断该数据是否被别人修改过。如果数据被其他线程修改,则不 进行数据更新,如果数据没有被其他线程修改,则进行数据更新。由于数据没有进行加锁, 期间该数据可以被其他线程进行读写操作。
乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可 能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量 的查询操作,降低了系统的吞吐量。
问题回答:
匿名类不能为抽象类的原因主要是因为匿名类默认是继承自一个父类或实现一个接口,而Java中只支持单继承和多实现,如果匿名类为抽象类,则会违背这一原则。因此,Java中规定匿名类只能继承具体类或实现接口,不能继承抽象类。
如果想要实现需求,可以使用具体类或接口来实现。具体的实现步骤如下:
public interface MyInterface {
void doSomething();
}
public class MyInterfaceImpl implements MyInterface {
@Override
public void doSomething() {
System.out.println("do something in MyInterfaceImpl");
}
}
public class Test {
public static void main(String[] args) {
MyInterface myInterface = new MyInterfaceImpl() {
@Override
public void doSomething() {
super.doSomething();
System.out.println("do something in anonymous class");
}
};
myInterface.doSomething();
}
}
输出结果为:
do something in MyInterfaceImpl
do something in anonymous class
其中,创建匿名类的代码:MyInterface myInterface = new MyInterfaceImpl() { @Override public void doSomething() { super.doSomething(); System.out.println("do something in anonymous class"); } };
,意思是创建了一个实现MyInterface接口的匿名类,并重写该接口中的doSomething()方法,在其中执行该方法的原本逻辑,然后再执行自己的逻辑。
这样,就可以实现类似于抽象类的效果了。