java基础之基本常识

数据类型

  • 基本数据类型
    • 整型
      • byte:1个字节
      • short:2个字节
      • int:4个字节(默认类型)
      • long:8个字节
    • 浮点型
      • float:4个字节
      • double:8个字节(默认类型)
    • 字符
      • char:2个字节
    • 布尔类型
      • boolean
  • 引用数据类型(类,接口,数组)

位运算符

  • <<: 左移几位就乘以2的几次方
  • >>: 右移几位就除以2的几次方
  • >>>: 无符号右移运算符
  • <<<: 无符号左移运算符

函数,构造函数,抽象类,接口

  • 函数
    • 函数也叫方法
    • 方法的重载(overload):方法名相同,参数不同
    • 方法的重写(override):
      • 存在继承关系中,子类重写父类方法
      • 子类方法权限一定要大于等于父类方法权限
      • 覆盖是重写的另一种叫法
      • 静态只能覆盖静态
  • 构造函数
    • 作用:用于给对象的属性进行初始化
    • 特点:
      • 你不定义空参数的构造函数,系统会自动给一个空参构造,你定义了构造函数无论是有参还空参的,系统就不再生成。
      • 子类中所有的构造方法默认都会访问父类中空参数的构造方法,因为每一个构造方法的第一行都有一条默认的语句super();
    • 重载构造函数:参数列表不同的构造函数
  • 抽象类(abstract)
    • 说明:abstract修饰的类就是抽象类
    • 抽象关键字abstract不可以和哪些关键字共存?
      • private:abstrac修饰的方法就是为了让子类继承并重写的
      • static:那么这个时候抽象方法就可以可以通过类名调用,但是这样是没有意义的
      • final:final修饰的方法不能被重写。所以它和abstract冲突
    • 应用:模版方法设计模式
  • 接口(interface)
    • 说明:interfacet修饰的类,所有的方法都是抽象的
    • 特点:
      • 只有成员变量和成员方法
      • 成员变量 默认修饰符 public static final
        • int X = 20;
        • 其实是这样的 public static final int X = 20;
      • 成员方法 默认修饰符 public abstract
        • void show();
        • 其实是这样的 public abstract void show();
      • 高内聚,低耦合:降低了程序的耦合性

数组

数组的定义:

// 数组中元素未确定
int[] arr = new int[3];
int[0] = 3;

// 数组元素已确定
int[] arr = new int[]{1,2,3};
int[] arr = {1,2,3};

// 二维数组的定义
int[][] arr = new int[3][2];
int[][] arr = new int[3][];
int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};

java内存机制

栈:

  • 存放什么:基本数据类型,对象引用
  • 变量使用完后立即释放

堆:

  • 存放什么:对象实体,数组
  • 堆内存的特点:
    • 每个实体都有内存地址
    • 堆内存变量都有默认初始化
    • 当实体不再使用时,会在jvm空闲的时候,通过垃圾回收机制GC回收

方法区:

  • 存放什么:静态成员变量(类变量)

异常(Exception)

  • Throwable

    • Error:重大问题
    • Exception:除了 RuntimeException 和其所有子类问题
    • RuntimeException:运行时报异常
      • ArrayIndexOutOfBoundsException:当你访问到数组中的最后一个元素时,还想继续访问,这个时候,会发生角标越界异常。
      • NullPointerException:当数组不在指向某个实体时,你还继续访问,就会发生空指针异常。
      • FileNotFoundException:创建FileInputStream对象, 指定一个文件. 当文件不存在时会抛出
  • 异常的处理:

      try{
          ...
      }catch(Exception e){
          ...
      }finally{ //关闭流,数据库等,释放资源
          ...
      }
    
  • Throwable类中常用的方法

    • getMessage():返回此 throwable 的详细消息字符串
    • toString():获取异常类名和异常信息,返回字符串
    • printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void
  • 自定义异常

    • 自定义类继承Exception或者其子类(RuntimeException)

static和final关键字

static关键字

  • 说明:static是 “静态” 关键字,可以修饰成员变量和成员方法
  • 什么时候使用:当类中的成员需要被所有对象共享时,用static修饰
  • 特点:
    • 随着类的加载而加载,随着类的消失而消失,生命周期最长
    • 优先于对象而存在
    • 被所有的对象所共享
    • 比非静态成员多了一种访问方式(类名.调用)
  • 静态成员变量(类变量)和非静态的成员变量(实例变量)的区别:
    • 存在内存中的位置:
      • 静态变量(类变量)随着类的加载,存在于方法区
      • 非静态成员变量(实例变量)随着对象的创建而建立,存在于堆内存
    • 生命周期:
      • 静态变量的生命周期长,随着类的消失而消失
      • 非静态成员变量的生命周期短,随着对象的消失而消失
    • 所属不同:
      • 静态变量也称为类变量,属于整个类,被整个类的对象所共享
      • 非静态成员变量也成为实例变量,是对象的特有数据,所属于对象

final关键字

  • final可以用来修饰类:被fainl修饰的类不能被继承
  • final可以用来修饰成员方法:被final修饰的成员方法不能被重写。
  • final可以用来修饰变量:被final修饰的变量为常量,值不能被修改。

代码块

  • 局部代码块
    • 一般语句顺序执行
  • 构造代码块
    • 每次创建对象都会被调用,用于初始化对象
  • 静态代码块
    • 只会执行一次,用于初始化类
    • 加载顺序:静态代码块-->构造代码块-->构造函数-->局部代码块
public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        p.test();
    }
}

class Person{
    static{
        System.out.println("静态代码块:只会执行一次,用于初始化类");
    }
    
    {
        System.out.println("构造代码块:每次创建对象都会被调用,用于初始化对象");
    }
    
    public Person() {
        System.out.println("构造函数:Person");
    }
    
    public void test(){
        System.out.println("A");
        {
            System.out.println("局部代码块:一般语句顺序执行");
        }
        System.out.println("B");
    }
}

/**
静态代码块:只会执行一次,用于初始化类
构造代码块:每次创建对象都会被调用,用于初始化对象
构造函数:Person
A
局部代码块:一般语句顺序执行
B
*/

Object类的简单介绍

  • getClass():返回对象的运行时类
  • hashCode():哈希值
  • toString():打印
  • equals()
    • ==号和equals方法的区别:
      • ==号既可以比较基本数据类型,也可以比较引用数据类型,比较基本数据类型比较的是值,比较引用数据类型比较的是地址值
      • equals方法只能比较引用数据类型;equals方法在Object类中的定义比较的是引用数据的内存地址;但是我们在自定义类如果想比较对象中属性,就需要重写equals方法
  • finalize():垃圾收集器将对象从内存中清除出去之前做必要的清理工作

StringBuilder和StringBuffer

StringBuilder和StringBuffer的区别:

  • StringBuilder是线程不安全的,所以效率比较高,1.5版本出现
  • StringBuffer是线程安全的,效率相对较低,1.0版本出现的

递归

  • 递归的好处:
    • 可以不知道循环次数 (方法调用次数)
  • 递归的弊端:
    • 有可能会栈内存溢出
  • 构造函数是否可以用递归?
    • 构造函数不能使用递归, 因为如果可以, 那将不断创建对象, 永不停止
  • 递归调用是否必须有返回值?
    • 递归调用可以有返回值也可以没有

你可能感兴趣的:(java基础之基本常识)