Java基础复习

时间:2021-07-28
本文章向大家介绍Java基础复习,主要包括Java基础复习使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Java基础复习

Java语言特点

  1. 简单易学;
  2. 面向对象(封装,继承,多态);
  3. 平台无关性( Java 虚拟机实现平台无关性);
  4. 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
  5. 可靠性;
  6. 安全性;
  7. 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便);
  8. 编译与解释并存;
  9. 在企业级开发中有极其强大的生态

JVM

Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。(实现跨平台的特性)。


.java文件可以被Javac程序编译成.class字节码文件,JVM在将其解释成机器可执行的机器码。(JVM只面向字节码,只要符合JVM字节码规范的都可以运行,无论字节码是由Java文件编译过来还是python文件都可以运行)

Java数据类型


Java具有确定的数据类型,它不像其它的编程语言一样会随着硬件的架构变换而变化,这也是Java比其他语言具有更好的可移植性的原因之一。

boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 支持 boolean 数组,但是是通过读写 byte 数组来实现的。

基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。以Integer为例

Integer x = 2;     // 装箱 调用了 Integer.valueOf(2)
int y = x;         // 拆箱 调用了 X.intValue()

面试题

Integer x = new Integer(124);
Integer y = new Integer(124);
System.out.println(x == y);    // false
Integer z = Integer.valueOf(123);
Integer w = Integer.valueOf(123);
System.out.println(z == w);		// true
Integer k = 123;
System.out.println(w == k);		// true

x,y是两个不同的对象,他们不相等可以理解,那么为什么z == w呢?这就涉及到Java里面的缓存池技术了。以Integer为例,Java会缓存-128 ~127范围内的对象,调用Integer.valueOf()会判断传入的值在不在范围,若在直接返回缓存池里的对象

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
static final int low = -128;
static final int high;
static final Integer cache[];

static {
    // high value may be configured by property
    int h = 127;
    String integerCacheHighPropValue =
        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
    if (integerCacheHighPropValue != null) {
        try {
            int i = parseInt(integerCacheHighPropValue);
            i = Math.max(i, 127);
            // Maximum array size is Integer.MAX_VALUE
            h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
        } catch( NumberFormatException nfe) {
            // If the property cannot be parsed into an int, ignore it.
        }
    }
    high = h;

    cache = new Integer[(high - low) + 1];
    int j = low;
    for(int k = 0; k < cache.length; k++)
        cache[k] = new Integer(j++);

    // range [-128, 127] must be interned (JLS7 5.1.7)
    assert IntegerCache.high >= 127;
}


在 jdk 1.8 所有的数值类缓冲池中,Integer 的缓冲池 IntegerCache 很特殊,这个缓冲池的下界是 - 128,上界默认是 127,但是这个上界是可调的,在启动 jvm 的时候,通过 -XX:AutoBoxCacheMax= 来指定这个缓冲池的大小,该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 系统属性,然后 IntegerCache 初始化的时候就会读取该系统属性来决定上界。

为什么浮点型数据没有缓存池?
你能说出 0~1直接到底有多少个浮点型数据不?

Java参数传递

Java的参数传递都是值传递而不是引用传递,对应基本数据类型,Java会拷贝一份值,然后传递到形参中,对于引用数据类型Java会把引用的地址以值的形式传递给形参。
示例:

public static void main(String[] args) {
    int num1 = 10;
    int num2 = 20;

    swap(num1, num2);

    System.out.println("num1 = " + num1);
    System.out.println("num2 = " + num2);
}

public static void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;

    System.out.println("a = " + a);
    System.out.println("b = " + b);
}
/*
*结果:
 * num1 = 10;
 * num2 = 20;
 * a = 20;
 * b = 10;
*/

分析

class PassByValueExample {
    public static void main(String[] args) {
        Dog dog = new Dog("A");
        func(dog);
        System.out.println(dog.getName());          // B
    }

    private static void func(Dog dog) {
        dog.setName("B");
    }
}
// 结果: B

final关键字

  • final关键字修饰类,类不能被继承,类里的所有方法都隐式的被final关键字修饰
  • final关键字修饰方法,方法不能被重写,private方法被final关键字隐式修饰
  • final关键字修饰变量,变量就为编译时常量,在运行时可以通过反射进行修改,若final变量赋予了初始值,在编译期进行了优化 return (final) var ---> retunrn var的字面量。

static关键字

  • 修饰成员变量和成员方法: 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被 static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式:类名.静态变量名 类名.静态方法名()
  • 静态代码块: 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。 该类不管创建多少对象,静态代码块只执行一次.
  • 静态内部类(static 修饰类的话只能修饰内部类): 静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非 static 成员变量和方法。

Java异常体系


Java异常分为Exceptions 和 Errors,他们都继承与Throwable。

  • Exception:程序能处理的异常,可以通过try,catch处理掉,其又分为受检查Exceptions和非受检查异常
  • Errors:程序自己不能处理的异常,如内存溢出异常,栈溢出异常,发生这种异常虚拟机会选择结束掉线程
  1. 受检查异常
    Java 代码在编译过程中,如果受检查异常没有被catch/throw处理的话,就没办法通过编译 。
    除了RuntimeException及其子类以外,其他的Exception类及其子类都属于受检查异常 。常见的受 检查异常有: IO 相关的异常、ClassNotFoundExceptionSQLException...。
  2. 非受检查异常
    Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。
    RuntimeException及其子类都统称为非受检查异常,例如:NullPointerExceptionNumberFormatException(字符串转换为数字)、ArrayIndexOutOfBoundsException(数组越界)、ClassCastException(类型转换错误)、ArithmeticException(算术错误)等。

原文地址:https://www.cnblogs.com/yzwandhjy/p/15071279.html