美文网首页
Java基础笔记

Java基础笔记

作者: _Once1 | 来源:发表于2018-11-25 20:59 被阅读0次

    在这里记录一下自己回顾Java基础时,一些觉得掌握的还不牢固的基础知识,查漏补缺!


    Java程序初始化顺序

    三个原则

    • 静态对象优先于非静态对象,静态对象只会初始化一次
    • 父类优先于子类
    • 成员变量则是根据定义的顺序进行初始化

    各种代码块的初始化顺序则如下:

    1. 父类静态变量,静态代码块
    2. 子类静态变量,子类静态代码块
    3. 父类费静态变量,代码块
    4. 父类构造方法
    5. 子类非静态变量,代码块
    6. 子类构造方法

    Java对象的作用域

    成员变量:作用范围与类的实例对象的作用范围相同
    静态变量:只要一个类被加载,jvm就会给该类的静态变量分配存储空间
    局部变量:仅限于该类所在的花括号内


    构造方法

    当父类没有提供无参的构造方法时,子类的构造方法中必须显式的调用父类的构造方法;
    当提供了无参构造方法,则无需显式调用,因为编译器会默认调用父类无参构造方法;
    在实例化对象时,先执行父类的构造方法,然后才是子类


    clone方法的理解

    • 首先,为什么会有该方法?
      这里涉及到Java方法的两种传递参数方式:

    处理基本数据类型时,采用的是按值传递;
    此外,当处理其他数据类型时,都是采用的按引用传递,包括在使用“=”赋值时也是如此

    这样就会导致一个问题:当需要创建一个和当前已有对象相同的对象,又需要对其中一个的修改不会影响到另一个对象时,使用一般的赋值操作显然无法达到该目的,因此提供了clone方法来提供这个能力

    • 如何实现clone方法?
      在将这个之前,先看两个概念:

    浅复制:被复制的对象的所有变量都和原来的对象有相同的值,而所有对其他对象的引用仍然指向其原来的对象;
    深复制:会将原对象所有引用的对象全都复制一遍

    下面看如何实现clone方法:

    1. 使目标类实现Cloneable接口,该接口中没有任何方法,只是一个标识接口
    2. 重写clone()方法
    3. 在该方法中返回super.clone(),也就是会调用至Object的clone方法
      上面是浅复制的实现方法,若需实现深复制,则需要对对象中的非基本类型数据都调用clone方法;
      注意,这里需要这些属性所属类全都实现clone方法才行

    组合和继承

    继承:is-a的关系
    组合: has-a关系
    能使用就尽量不要使用继承


    多态

    Java中的多态主要表现为两种方式:

    1. 方法的重载overload:编译时多态,在编译期间就可以确定调用哪一个方法
    2. 覆盖override:运行时多态,只有在运行时,才可以确定内存中实例化的是哪一个对象
      这里需要注意:只有方法才有多态的概念,类中的成员变量并没有方法的概念,因为成员变量是在编译期间就确定了的
      因此,成员变量的取值为new对象定义的类型的值
      举例如下:
      BaseClass b = new SubClass()
      假设sub是base的子类,这时打印b.age,此时打印出的是base中定义的值而非sub定义

    接口与抽象类
    接口,强调功能的特定实现,是has-a的关系
    抽象类,强调所属关系,是is-a的关系


    static代码块常用来初始化静态变量
    switch支持string类型,其实也是先判断字符串的hashcode是否相同,若相同, 再调用equals方法进行匹配


    volatile
    可以提供可见性,部分有序性,但是无法保证原子性,因此其还是无法替代synchronized关键字


    按值传递与引用传递

    • 值传递:原始数据类型,会拥有不同的存储空间,对参数的修改不会影响到原值
    • 引用传递:传递的是对象的地址,二者指向同一内存地址,对形参的修改会影响到实参

    Java的异常处理用到了多态的概念,在进行异常捕获时,如果需要捕获多个,应该先捕获子类,再捕获基类;
    否则若顺序相反,子类异常就不会被捕获到了


    相关文章

      网友评论

          本文标题:Java基础笔记

          本文链接:https://www.haomeiwen.com/subject/vgjmqqtx.html