3.1 背景知识

3.1.1 JVM

JVM(Java Virtual Machine) 是一种规范。就是一个虚拟的用于执行bytecodes字节码的计算机。
image.png

3.1.2 字符集

image.png

3.1.3 Java内存划分

  • 栈(Stack):存放的都是方法中的局部变量,方法的运行一定要在栈当中

局部变量:方法的参数或方法内部的变量
作用域:一旦超出作用域,立刻从栈内存中消失

  • 堆(Heap)凡是new出来的东西,都在堆中

堆内存里面的东西都有一个地址值:16进制
堆内存里面的数据,都有默认值,规则:整数 0 浮点数 0.0 字符 ‘\u0000’ 布尔 false 引用类型 null

  • 方法区(Method Area):存储.class相关信息,包含方法的信息。
  • 本地方法栈(Native Method Stack):与操作系统相关
  • 寄存器(pc Register):与CPU相关

当使用一个对象作为返回值,其实是返回这个对象的地址值。
image.png

3.2 语法

3.2.1 成员变量与局部变量

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

  1. 定义的位置不一样:局部变量方法的内部 成员变量在类中
  2. 作用域不同:局部变量只有方法当中才能使用 成员变量在类中可用
  3. 默认值不同:局部变量无默认值,如果要想使用必须手动进行赋值 成员变量默认会有起始值 不赋值的局部变量不可用
  4. 内存位置不同 局部变量位于栈中 成员变量位于堆内存中
  5. 生命周期不同 局部变量随着方法进栈而诞生,随着方法出栈而消失 成员变量随着对象创建而诞生,随着对象销毁而回收

    3.2.2 面向对象三大特征

    封装、继承、多态
    封装在Java中的体现:封装就是将一些细节信息隐藏起来,对于外界不可见。
    1.方法就是一种封装
    2.关键字private也是一种方法:
    在获取boolean类型的成员变量值的时候不是getMale,而是IsMale ```java package com.outlook.szdxzhy;

public class Person { private boolean male;

  1. public void show(){
  2. System.out.println("我叫:"+name+",年龄是:"+age);
  3. }
  4. public boolean isMale(){
  5. return male;
  6. }

}

<a name="bkJp5"></a>
## 3.2.3 this关键字
**当类的成员变量和方法的局部变量重名时,遵循就近原则。需要用this关键字来区分。**<br />**通过谁调用的方法,谁就是this。地址是一样的。**
```java
p.name="Albert"; 
p.sayHello("王健林"); p调用p就是this
        System.out.println(p);

 public void sayHello(String name){
        System.out.println(name +",你好,我是"+this.name);
        System.out.println(this);
    }

王健林,你好,我是Albert
com.outlook.szdxzhy.Person@3941a79c
com.outlook.szdxzhy.Person@3941a79c

3.2.4 构造方法

1.构造方法的名称必须和所在类名称完全一样,就连大小写也要一样
2.构造方法不要写返回值类型,连void都不需要写

3.2.5 标准类 Java Bean

标准类要拥有下面四个组成部分:
1.所有成员变量都要使用private关键字修饰:Code-Generate(ALT+INSERT)
2.为所有成员编写get/set方法
3.编写一个无

3.2.6 API

Application Programming Interface
JDK API 1.6.0中文版官方翻译
包名
构造方法
方法摘要

3.2.7 Scanner

引用类型的一般使用步骤:

  • 导包 import 包路径.类名称

如果需要使用的目标类和当前类位于同一包下,则可以省略导包语句不写
只有java.lang包下的内容不需要导包,其他的都需要import

  • 创建
  • 使用

Scanner类可实现键盘输入数据到程序中

package com.rigol.albert;

import java.util.Scanner;

/*
Scanner类可实现键盘输入数据到程序中

获取int数字 int num = sc.nextInt();
获取字符串 String str = sc.next();
 */
public class ScannerHelper {
    public static void main(String[] args) {
        //System.in代表从键盘进行输入
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        System.out.println("当前输入的数字是:"+num);
        String str = sc.next();
        System.out.println("当前输入的字符串是:"+str);
    }
}

3.2.8 匿名对象

new 类名称();

package com.outlook.szdxzhy;

public class 匿名对象 {
    public static void main(String[] args) {
        Person p = new Person();
        /*
        匿名对象只能使用唯一一次,下次再用不得不再创建一个新对象。
        使用建议:如果确定有一个对象只需要使用唯一的一次,就可以用匿名对象。
         */
        new Person().name = "高圆圆";
    }
}

package com.outlook.szdxzhy;

import java.util.Scanner;

public class Demo06_Scanner {
    public static void main(String[] args) {
        //匿名对象方式,只使用一次
        System.out.println(new Scanner(System.in).nextInt());
    }
}

3.2.9 Random

左闭右开区间
Random r = new Random();
int num = r.nextInt(3); [0-3)

3.2.10 ArrayList

package com.rigol.albert;

import java.util.ArrayList;

public class Demo02_ArrayList {
    public static void main(String[] args) {
        ArrayList<Student> listPerson = new ArrayList<Student>();
        Student p = new Student("Albert",18);
        listPerson.add(p);
        System.out.println(listPerson.get(0).name);//放进去是一个学生,拿出来也是一个学生

        ArrayList<String> listStudent = new ArrayList<>();
        listStudent.add("Albert");
        listStudent.add("Jack");
        System.out.println(listStudent);
    }
}