基础篇-Java基础1

并发编程学习策略

01 | Java基础语法

1、JDK、JRE、JVM简单介绍

1)Java的虚拟机本身不具备跨平台功能的,每个操作系统下都有不同版本的虚拟机。
2) JRE (Java Runtime Environment) :是Java程序的运行时环境,包含 JVM 和运行时所需要的 核心类库 。
3)JDK (Java Development Kit):是Java程序开发工具包,包含 JRE 和开发人员使用的工具。

在这里插入图片描述

2、方法重载介绍

1)方法重载:指在同一类中,允许存在一个以上的同名方法,只要他们的参数列表不同即可,与修饰符和返回值类型无关。
2) 参数列表:个数不同,数据类型不同,顺序不同
3)重载方法调用:JVM通过方法的参数列表,调用不同的方法

3、Java中的内存划分
在这里插入图片描述

1)Java的内存需要划分为5个部分:

  1. 栈(stack):存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。
    a. 局部变量:方法的参数,或者是方法{}内部的变量。
    b. 作用域:一旦超出作用域,立刻从栈内存当中消失。
  2. 堆(heap):凡是new出来的东西,都在堆当中。
    a. 堆内存里边的东西都有一个地址值,16进制
    b. 堆内存里边的数据,都有默认值。
  3. 方法区(Method Area):存储 .class 相关信息,包含方法的信息。
  4. 本地方法栈(Native Method Stack):与操作系统相关。
  5. 寄存器(PC Register):与 CPU 相关。

2) 总结:

  1. 栈(Stack):方法的运行一定要在栈当中运行。
  2. 堆(heap):凡是new出来的东西,都在堆中。
  3. 方法区(Method Area):存储 .class 相关信息,包含方法的信息。

4、数组

1)参数类型的区别:

  1. 数组作为方法参数传递,传递的参数是数组内存的地址。
  2. 方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值.

02 | 面向对象和封装

1、局部变量和成员变量的区别

1)定义的位置不一样:

  1. 局部变量:方法中或者方法声明上(形式参数)
  2. 成员变量:类中,方法外

2) 作用范围不一样:

  1. 局部变量:只有方法当中才可以使用,出了方法就不能再用
  2. 成员变量:整个类全都可以通用。

3) 默认值不一样:

  1. 局部变量:没有默认值,如果要想使用,必须手动进行赋值
  2. 成员变量:如果没有赋值,会有默认值,规则和数组一样

4) 内存的位置不一样:

  1. 局部变量:位于栈内存
  2. 成员变量:位于堆内存

5) 生命周期不一样

  1. 局部变量:随着方法进栈而诞生,随着方法出栈而消失
  2. 成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失

6) 当方法的局部变量和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。

2、封装性

1)面向对象三大特征:封装、继承、多态。

2)封装性在Java当中的体现:

  1. 方法就是一种封装
  2. 关键字private也是一种封装

3)封装就是将一些细节信息隐藏起来,对于外界不可见。

3、Java中的内存划分

1)成员变量:在类中定义的属性;局部变量:在方法的参数或者在方法内定义的变量。
2)总结:

  1. 栈(Stack):方法的运行一定要在栈当中运行。
  2. 堆(heap):凡是new出来的东西,都在堆中。
  3. 方法区(Method Area):存储 .class 相关信息,包含方法的信息。

3)一个对象,调用一个方法内存图

在这里插入图片描述

4)两个对象,调用同一方法内存图:
对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间。

在这里插入图片描述

5)一个引用,作为参数传递到方法中内存图:
引用类型作为参数,传递的是地址值。

在这里插入图片描述

4、this的含义

1)this代表所在类的当前对象的引用(地址值),即对象自己的引用。
2)记住 :方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁

03 | 常用API 1

1、Scanner的使用

1)Scanner类的功能:可以实现键盘输入数据,到程序当中。
2)获取键盘输入的一个int数字:int num = sc.nextInt();
3)获取键盘输入的一个字符串:String str = sc.next();

2、匿名对象

1)创建对象的标准格式:
类名称 对象名 = new 类名称();
2)匿名对象就是只有右边的对象,没有左边的名字和赋值运算符。
new 类名称();
3)注意事项:匿名对象只能使用唯一的一次,下次再用不得不再创建一个新对象。
4)使用建议:如果确定有一个对象只需要使用唯一的一次,就可以用匿名对象。

3、Random的使用

1)Random类用来生成随机数字。
2)创建
Random r = new Random(); // 小括号当中留空即可
3)public int nextInt(int n) :返回一个伪随机数,范围在 0 (包括)和 指定值 n (不包括)之间的int 值。
4)备注:创建一个 Random 对象,每次调用 nextInt() 方法,都会生成一个随机数。

4、ArrayList的创建

1)数组的长度不可以发生改变。但是ArrayList集合的长度是可以随意变化的。
2)对于ArrayList来说,有一个尖括号 < E > 代表泛型。

  1. 泛型:也就是装在集合当中的所有元素,全都是统一的什么类型。
  2. 注意:泛型只能是引用类型,不能是基本类型。只有 Integer 和 Character 需要特殊记忆,其他基本类型只是首字母大写即可。

3)注意事项:

  1. 对于ArrayList集合来说,直接打印得到的不是地址值,而是内容。
  2. 如果内容是空,得到的是空的中括号:[]

4)ArrayList当中的常用方法有:

  1. public boolean add(E e)
  2. public E get(int index)
  3. public E remove(int index)
  4. public int size()

5、String

1)字符串的常量池图
字符串常量池:程序当中直接写上的双引号字符串,就在字符串常量池中。

在这里插入图片描述

2)静态的内存图:
一旦使用了static关键字,那么这样的内容就不再属于对象自己,而是属于类的。凡是本类的对象,都共享同一份。

在这里插入图片描述

3)String当中与获取相关的常用方法有:

  1. public int length()
  2. public String concat(String str)
  3. public char charAt(int index) (索引从0开始。)
  4. public int indexOf(String str)

4)字符串的截取方法:

  1. public String substring(int index):截取从参数位置一直到字符串末尾,返回新字符串。
  2. public String substring(int begin, int end) 备注:[begin,end),包含左边,不包含右边。

5)String当中与转换相关的常用方法:

  1. public char[] toCharArray()
  2. public byte[] getBytes()
  3. public String replace(CharSequence oldString, CharSequence newString)

6)分割字符串的方法:

  1. public String[] split(String regex):按照参数的规则,将字符串切分成为若干部分。

6、static

1)如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象共享同一份数据。
2)一旦使用static修饰成员方法,那么这就成为了静态方法。静态方法不属于对象,而是属于类的。

3)注意事项:

  1. 静态不能直接访问非静态。
    原因:因为在内存当中是【先】有的静态内容,【后】有的非静态内容。
    “先人不知道后人,但是后人知道先人。”
  2. 静态方法当中不能用this。
    原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。

4)当第一次用到本类时,静态代码块执行唯一的一次。静态内容总是优先于非静态,所以静态代码块比构造方法先执行。

5)静态原理图解

在这里插入图片描述

7、Arrays

1)java.util.Arrays是一个与数组相关的工具类,里面提供了大量静态方法,用来实现数组常见的操作。

  1. public static String toString(数组):将参数数组变成字符串(按照默认格式:[元素1, 元素2, 元素3…])
  2. public static void sort(数组):按照默认升序(从小到大)对数组的元素进行排序。

2)备注:

  1. 如果是数值,sort默认按照升序从小到大
  2. 如果是字符串,sort默认按照字母升序
  3. 如果是自定义的类型,那么这个自定义的类需要有Comparable或者Comparator接口的支持。

04 | 思维导图

1、基础篇-Java基础1思维导图
在这里插入图片描述
参考文献:

[1] 黑马. Java基础[M]. 传智播客, 2019.