Java的基础知识

124 阅读3分钟

Java的基本数据类型

boolean char byte short int long float double
1比特 2字节 1字节 2字节 4字节 8字节 4字节 8字节

String、Stringbuffer、StringBuilder的区别?

String:用于存放字符的char数组被final修饰符修饰,只允许一次赋值,每改变一次重新生成一个对象。

验证

        String a = "aaa";
        String b = a;
        //a、b相同
        System.out.println(a == b);
        a = "bbb";
        //a引用了另一个对象,因此a、b不相同
        System.out.println(a == b);
        StringBuilder s1 = new StringBuilder("qqq");
        StringBuilder s2 = s1;
        System.out.println(s1 == s2);
        s1.replace(0,s1.length(),"www");
        System.out.println(s1 == s2);

结果

true
false
true
true

StringBuilder:线程安全的可变字符序列 StringBuffer:非线程安全的可变字符序列

类的实例化顺序

  1. 父类的静态成员
  2. 父类的静态代码块
  3. 子类的静态成员
  4. 子类的静态代码块
  5. 父类的普通成员
  6. 父类的普通代码块
  7. 子类的普通成员
  8. 子类的普通代码块

相同级别的元素按照在代码中出现的顺序执行。

验证代码

static class FatherDemo {
        private static int numF1;
        private int numF2;

        {
            System.out.println("父类的成员变量  : " + numF2);
            System.out.println("父类的非静态代码块");
        }

        static {
            System.out.println("父类的静态字段 : " + numF1);
            System.out.println("父类的静态代码块");
        }



        public FatherDemo() {
            System.out.println("父类的构造器");
        }
    }

    static class SonDemo extends FatherDemo {
        private static int numS1;
        private int numS2;

        {
            System.out.println("子类的成员变量 : " + numS2);
            System.out.println("子类的非静态代码块");
        }

        static {
            System.out.println("子类的静态字段 : " + numS1);
            System.out.println("子类的静态代码块");
        }


        public SonDemo() {
            System.out.println("子类的构造器");
        }
    }

    static public class Box {
        public static void main(String[] args) {
            FatherDemo ab = new SonDemo();
            System.out.println();
            ab = new SonDemo();
        }
    }

结果

父类的静态字段 : 0
父类的静态代码块
子类的静态字段 : 0
子类的静态代码块
父类的成员变量  : 0
父类的非静态代码块
父类的构造器
子类的成员变量 : 0
子类的非静态代码块
子类的构造器

父类的成员变量  : 0
父类的非静态代码块
父类的构造器
子类的成员变量 : 0
子类的非静态代码块
子类的构造器
备注:现在只知道类加载的基本顺序,还不理解类加载的基本原理

抽象类与接口的区别

  1. 接口可以有多个实现而抽象类只能单继承
  2. 抽象类定义的变量只能是公共静态常量
  3. 接口类只能定义方法的声明
  4. 接口实现必须实现接口定义的所有方法,而抽象类可以进行选择

Final的用途

  1. 修饰类时,类为最终类,不可被继承
  2. 修饰方法时,方法不可被重写
  3. 修饰引用变量,引用变量的值可以改变,但是引用自身不可改变,如果修饰的是基本数据类型,则将变量的值不可改变
  4. 修饰常量,在编译阶段将常量写入调用类的常量池中
备注:调用类的常量池不理解

访问修饰符

  1. public 任意访问
  2. default 本类和同一个包内
  3. protected 本类和子类
  4. private 本类

浅拷贝和深拷贝的区别

  1. 浅拷贝只拷贝对象本身,本身包含的引用变量指向的对象不拷贝
  2. 深拷贝拷贝本身以及所有引用指向的所有对象

序列化

什么是序列化

把数据结构或者对象转换成二进制串

怎么序列化

为什么序列化

反序列化会遇到什么问题

反射

什么是反射?