关于匿名类的一个问题/

在Java中,匿名类为什么不可以是抽象类?谁来详细地解释一下子

匿名类抽象没有意义啊,抽象类必须被派生具体化才有用,匿名类怎么派生?

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7669989
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:深度剖析那些Java开发中碰到的异常,一次性全帮你处理掉
  • 同时,你还可以查看手册:java-集合 - 关于使用和扩展Java集合框架的课程。- 聚合操作 代表你对集合进行迭代,这使你能够编写更简洁和有效的代码,处理存储在集合中的元素。 -平行主义 中的内容
  • 除此之外, 这篇博客: 肝一个周整理Java中容易混淆的基础知识中的 悲观锁,乐观锁 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 是一种思想。可以用在很多方面。比如数据库方面。
    悲观锁就是for update(锁定查询的行)
    乐观锁就是 version字段(比较跟上一次的版本号,如果一样则更新,如果失败则要重复读­
    比较­写的操作。)
    JDK方面:
    悲观锁就是sync
    乐观锁就是原子类(内部使用CAS实现)
    本质来说,就是悲观锁认为总会有人抢我的。乐观锁就认为,基本没人抢。

    乐观锁是一种思想,即认为读多写少,遇到并发写的可能性比较低,所以采取在写时先读出 当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重 复读­比较­写的操作。
    CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。CAS顶多算是乐观锁写那一步操作的一种实现方式罢了,不用CAS自己加锁也是可以的。

    乐观锁的业务场景及实现方式

    每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会进行加锁, 但是在更新数据的时候需要判断该数据是否被别人修改过。如果数据被其他线程修改,则不 进行数据更新,如果数据没有被其他线程修改,则进行数据更新。由于数据没有进行加锁, 期间该数据可以被其他线程进行读写操作。
    乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可 能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量 的查询操作,降低了系统的吞吐量。

  • 您还可以看一下 汤小洋老师的手把手搭建Java在线考试系统【附源码】(毕设)课程中的 在线考试系统的部署运行小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题回答:

    匿名类不能为抽象类的原因主要是因为匿名类默认是继承自一个父类或实现一个接口,而Java中只支持单继承和多实现,如果匿名类为抽象类,则会违背这一原则。因此,Java中规定匿名类只能继承具体类或实现接口,不能继承抽象类。

    如果想要实现需求,可以使用具体类或接口来实现。具体的实现步骤如下:

    1. 定义一个具体的类或接口,例如:
    public interface MyInterface {
        void doSomething();
    }
    
    1. 实现该接口的子类,例如:
    public class MyInterfaceImpl implements MyInterface {
        @Override
        public void doSomething() {
            System.out.println("do something in MyInterfaceImpl");
        }
    }
    
    1. 在需要使用该类的地方创建匿名类,并实现该类中的方法,例如:
    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()方法,在其中执行该方法的原本逻辑,然后再执行自己的逻辑。

    这样,就可以实现类似于抽象类的效果了。