基础
Java
Java
  • 基础知识
    • Java 语言的特点
    • Java 基础
      • 语法基础
      • 类型
      • 泛型
      • 注解
      • 异常
      • 反射机制
      • Java 容器
    • Java IO
      • 基础IO
      • NIO
    • Java 并发
      • Java 内存模型
        • 主内存与工作内存
        • 对于 volatile 型变量的特殊规则
        • long 和 double 的非原子性协定
        • 原子性、可见性与有序性
        • 先行发生(Happens-Before)原则
      • 线程
        • 状态转换
        • 线程安全性
          • 对象的共享
            • 可见性
            • 线程封闭
            • 不可变性
            • 安全发布
          • 在现有的线程安全类中添加功能
        • 线程池
          • Executor 框架
          • ExecutorService
          • Executors
          • Future
          • CompletionService
          • 设置线程池的大小
          • ThreadPoolExecutor
      • 线程安全的容器
        • 同步容器类
        • 并发容器
          • ConcurrentHashMap
          • CopyOnWriteArrayList
          • BlockingQueue
            • 串行线程封闭
            • 双端队列与工作密取
      • 任务取消
        • 自定义的取消标志
        • 线程中断
        • 通过 Future 来实现取消
      • 条件队列
        • 内置条件队列
        • 显式的 Condition 对象
      • JUC 中的 AQS
        • AbstractQueuedSynchronizer
        • ReentrantLock
        • ReentrantReadWriteLock
        • Semaphore
        • CountDownLatch
      • 原子变量
        • CAS
        • 原子变量类
        • ABA 问题
        • 非阻塞算法
          • 非阻塞的栈
          • 非阻塞的链表(X)
    • Java 虚拟机
      • JVM 的运行机制
      • 类加载器
      • 运行时数据区
        • JVM 的内存区域
        • 永久代与元空间
        • OutOfMemoryError
      • Java 中的 4 种引用类型
      • 垃圾收集(GC)
        • 如何确定垃圾
        • 垃圾回收算法
        • 垃圾收集器
          • Serial 收集器
          • ParNew 收集器
          • Parallel Scavenge 收集器
          • Serial Old 收集器
          • Parallel Old 收集器
          • CMS 收集器
          • Garbage First 收集器
  • Group 1
    • JDK 与 JRE
    • JVM默认配置
    • java与HTTPS
    • 构建高效且可伸缩的结果缓存
    • 基础补充
      • 在 Switch 中使用 String
      • 为什么 Java 语言不支持多重继承?
      • 为什么在重写 equals 方法的时候需要重写 hashCode 方法
      • 为什么 String 要设计为不可变的?
      • 移位运算符
      • SPI 机制
      • 为何 HashMap 不是线程安全的
      • Class.forName() 和ClassLoader.loadClass() 区别
      • synchronized 关键字
    • 零拷贝
    • Java中的锁优化技术
      • 自旋锁与自适应自旋
      • 锁消除
      • 锁粗化
      • 轻量级锁
      • 偏向锁
    • Arthas
    • Thread.sleep()、Object.wait()、Condition.await()、LockSupport.park()
由 GitBook 提供支持
在本页
  • 接口和抽象类
  • 内部类
  1. 基础知识
  2. Java 基础

类型

接口和抽象类

相同点:

  • 都不能被实例化。

  • 接口的实现类或抽象类的子类需实现接口或抽象类中的抽象方法才能被实例化。

不同点:

  • 一个子类只能继承一个抽象类,但能实现多个接口。

  • 抽象类可以有构造方法,接口没有构造方法。

  • 成员变量:

    • 抽象类可以有普通成员变量,接口没有普通成员变量。

    • 抽象类和接口都可有静态成员变量,但接口只能是 public static final(默认),而抽象类则没有此限制。

  • 方法:

    • 抽象类可以没有抽象方法,抽象类可以有普通方法;接口在 JDK8 之前都是抽象方法,在 JDK8 可以有 default 方法,在 JDK9 中允许有私有普通方法。

    • 抽象类可以有静态方法;接口在 JDK8 之前不能有静态方法,在 JDK8 中可以有静态方法,且只能被接口类直接调用(不能被实现类的对象调用)。

    • 抽象类中的方法可以是 public、protected;接口方法在 JDK8 之前只有 public abstract,在 JDK8 可以有 default 方法,在 JDK9 中允许有 private 方法。

内部类

内部类根据不同的定义方式,可分为静态内部类、成员内部类、局部内部类和匿名内部类这 4 种。

  • 静态内部类:定义在类内部的静态类被称为静态内部类。

    • 静态内部类可以访问外部类的静态变量和方法。

    • 在静态内部类中可以定义静态变量、方法、构造函数等。

    • 静态内部类通过“外部类.静态内部类”的方式来调用。

  • 成员内部类:定义在类内部的非静态类叫作成员内部类。

    • 成员内部类不能定义静态方法和变量(final 修饰的除外)。

    • 可以访问外部类的私有属性和方法。

    • 外部类想要访问内部类属性或方法时,必须要创建一个内部类对象,然后通过该对象访问内部类的属性或方法。

    • 外部类也可访问 private 修饰的内部类属性。

  • 局部内部类:存在于方法中的内部类。访问权限类似局部变量,只能访问外部类的 final 变量。

  • 匿名内部类:只能使用一次,没有类名,只能访问外部类的 final 变量。

上一页语法基础下一页泛型

最后更新于9个月前