基础
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 提供支持
在本页
  • 多态
  • 重载与重写
  • static 关键字
  • final、finally 和 finalize
  • 判等运算符 == 与 equals 的区别?
  • Java 的基本数据类型
  • 自动装箱与拆箱
  • String、StringBuffer 与 StringBuilder
  • Object 类常用方法
  1. 基础知识
  2. Java 基础

语法基础

多态

多态主要指继承父类和实现接口时,可使用父类引用指向子类对象。

运行时多态的实现主要依靠方法表,方法表中最先存放的是 Object 类的方法,接下来是该类的父类的方法,最后是该类本身的方法。

如果子类改写了父类的方法,那么子类和父类的那些同名方法共享一个方法表项,都被认作是父类的方法。因此可以实现运行时多态。

重载与重写

  • 重写是父类与子类之间的关系,是垂直关系;重载是同一类中方法之间的关系,是水平关系。

  • 重写要求方法签名相同;重载要求方法签名不同。

方法重写的限制条件:

public class Test {

    public static class SuperClass {
        public Object test() {
            return "";
        }
    }

    public static class ChildClass extends SuperClass {
        @Override
        public String test() {
            return "child";
        }
    }

    public static void main(String[] args) {
        // 子类方法的返回类型与父类方法的返回类型不同
        SuperClass obj = new ChildClass();
        System.out.println(obj.test());
    }
}

static 关键字

  • 修饰变量

    • 用 static 关键字修饰的静态变量在内存中只有一个副本。

    • 只要静态变量所在的类被加载,这个静态变量就会被分配空间。

    • 可以使用“类.静态变量”和“对象.静态变量”的方法使用。

  • 修饰方法

    • static 修饰的静态方法无需创建对象就可以被调用。

    • static 方法中不能使用 this 和 super 关键字,不能调用非 static 方法,只能访问所属类的静态成员变量和静态成员方法。

  • 修饰代码块

    • JVM 在加载类的时候会执行 static 代码块。

    • static 代码块常用于初始化静态变量。

    • static 代码块只会被执行一次。

  • 修饰内部类

    • static 内部类可以不依赖外部类的实例对象而被实例化。

    • 静态内部类不能与外部类有相同的名字,不能访问普通成员变量,只能访问外部类中的静态成员和静态成员方法。

final、finally 和 finalize

  • final 是一个修饰符,可以修饰变量、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。

  • finally 作为异常处理的一部分,只能在 try/catch 语句中使用,finally 附带一个语句块用来表示这个语句最终一定被执行,经常被用在需要释放资源的情况下。

  • finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的 finalize() 方法。当垃圾回收器准备好释放对象占用的内存空间时,首先会调用 finalize() 方法,并在下一次垃圾回收动作发生时真正回收对象占用的内存。

判等运算符 == 与 equals 的区别?

  • == 比较的是引用,equals 比较的是内容。

  • 如果变量是基础数据类型,== 用于比较其对应值是否相等。如果变量指向的是对象,== 用于比较两个对象是否指向同一块存储空间。

  • equals 是 Object 类提供的方法之一,每个 Java 类都继承自 Object 类,所以每个对象都具有 equals 方法。Object 类中定义的 equals 方法在内部直接调用 == 进行比较,而通过重写 equals 方法可以让它不是比较引用而是比较对象内容。

Java 的基本数据类型

  • 整型:byte、short、int、long

  • 浮点型:float、double

  • 字符型:char

  • 布尔型:boolean

自动装箱与拆箱

对于 Java 基本数据类型,均对应一个包装器类。

  • 装箱就是自动将基本数据类型转换为包装器类型,如 int -> Integer

  • 拆箱就是自动将包装器类型转换为基本数据类型,如 Integer -> int

String、StringBuffer 与 StringBuilder

  • 一个 String 对象在 Java 中表示一个字符串常量,是一个不可变对象,任何修改 String 的操作都不会改变原有的字符串,而是会生成一个新的字符串对象。

  • StringBuffer 和 StringBuilder 均是工具类,主要用于构造字符串,减少频繁修改字符串导致创建过多的字符串对象。两者的区别主要在于 StringBuffer 具有线程安全性,而 StringBuilder 并不具有线程安全性。

Object 类常用方法

  • hashCode:返回对象的散列码,一般当对象作为 HashSet 中的元素或 HashMap 中的键时,需要重写该方法。

  • equals:判断两个对象是否相等,需保证 equals 结果为 true 的两个对象的 hashCode 值也一样。

  • toString:返回对象的字符串表示。

  • clone:克隆一个对象,需要实现 Clonable 接口该方法才能使用。

  • wait:当调用该方法时,当前线程会被放入对象的条件队列中进行等待,并释放对象锁。

  • notify / notfiyAll:当调用该方法时,会唤醒在对象条件队列中等待的线程。其中 notify 会唤醒其中某一个线程,而 notifyAll 则会唤醒所有线程。

上一页Java 基础下一页类型

最后更新于9个月前