对象内存分布

在main中new一个对象后的内存变化

  • 一个手机类Phone,在main中实例化一个对象One
    • 方法区存放类信息,包括main、Phone
    • 在main中 Phone one = new Phone(); ,其中堆区开辟一块空间来存放new对象的内容,其地址为0x666,内容包括成员变量的值以及成员方法在方法区的首地址0x333。在栈区仅存放该对象在堆区的首地址0x666。
    • one.brand = "苹果" 根据0x666找到在堆区的位置,并查询到成员变量,修改内容
    • one.call("乔布斯") 根据0x666找到在堆区的位置,并查到成员方法在方法区的地址0x333。该方法入栈执行。之后出栈,开始执行 one.sendMessage();

对象作为方法参数

  • 对象作为方法中的参数时,传递的是对象在堆区的地址
    • one 在栈区的地址为0x666,执行method(one) 时,传入了0x666这个地址,在方法体内,使用这个地址到堆区查找修改。

对象作为返回值

  • 对象作为返回值传递的也是在堆区开辟的空间的地址
    • Phone two = getPhone(); getPhone方法入栈,在方法中新建了一个对象one,在堆区的地址是0x666,最后返回这个地址,赋值给two。

对象的创建和使用(IDEA-Java-导包)

创建类

  • 在src目录下选择或者新建一个包,再该目录下右键创建Java class,在属性名处使用快捷键Alt+insert或者右键选择Generate可以快速生成get和set方法。

  • 项目中包和类目录结构,当使用到的类和main不在一个包路径下时,需要使用import关键字导入所在类包。IDEA中输入类名时会自动出现import代码。

Java内存分布

Java的内存划分为5个部分

  1. 栈区(Stack):存放方法中的局部变量:方法的参数,方法{}内部的变量。方法的运行一定在栈中
  2. 堆区(Heap):用new分配的变量都在堆中,堆内存中的东西都有一个16进制的地址。
  3. 方法区(Method Area):存储.class相关信息,包含方法的信息。
  4. 本地方法栈(Native Method Stack):与操作系统相关
  5. 寄存器(pc Register):和CPU相关

数组

数组的定义格式

  • 动态初始化

    1
    2
    3
    4
    5
    //数据类型 [] 数组名 = new 数据类型[数组长度];
    int [] array = new int[300];
    /*或者
    int [] array;
    array = new int[300];*/
  • 静态初始化

    1
    2
    3
    4
    5
    //数据类型 [] 数组名 = new 数据类型[]{元素1,元素2,...};
    int [] arrayA = new int[]{1,2,3};
    /*或者
    int [] arrayA;
    arrayA = new int[]{1,2,3};*/
  • 省略格式的初始化

    1
    2
    3
    4
    5
    //数据类型 [] 数组名 = {元素1,元素2,...};
    int [] arrayB = {1,2,3};
    //下面这种写法是错误的
    /*int []arrayB;
    arrayB = {1,2,3};*/

数组默认值

  • 动态初始化数组,其中每个元素的默认值如下

    数据类型 默认值
    整数类型 0
    浮点类型 0.0
    字符类型 ‘\u000’(不可见字符)
    布尔类型 false
    引用类型 null

数组内存分布

  • 在方法内定义的数组,在栈区存放该数组的首地址,在堆区存放该数组元素的内容。
  • 例如查找array[1]的内容,先在栈区查找到该数组的首地址,然后再堆区按照序号获取元素值

  • 若将数组重新进行new,那么再栈区存放的首地址将发生变化

数组初始化空指针异常

  • 所有的引用类型量,都可以赋值为一个null值,数组是引用类型
  • 数组必须进行new初始化,才能使用其中的元素
  • 如果只是给数组赋初值为null,那么访问时会发生空指针异常(NullPointerException)

数组作为方法参数

  • 数组作为方法参数,传递的是数组的地址值
1
2
3
4
5
6
7
8
9
10
public class Hello {
public static void main(String[] args) {
int[] arrayA = new int[]{1, 2, 3};
System.out.println(arrayA);
print(arrayA);
}
public static void print(int[] arrayA) {
System.out.println(arrayA);//数组地址
}
}

数组输出

  • Java封装了Arrays
1
2
int[] arrayA = new int[]{1, 2, 3};
System.out.println(Arrays.toString(arrayA));

IDEA新建和导入Java项目

IDEA项目结构

新建Java项目

  1. New Project—->Empty Project,点击Next

  1. 填入项目名称,选择项目存放路径 ,点击Finish

  1. 添加模块Modules,点击 + 号,默认Java模块,检查SDK,点击Next

  1. 填入Module名称,不要使用中文,点击Finish

  1. 确认模块配置,点击OK

  1. 左侧目录中,点开Project,右击src,选择new一个package

  1. 给包命名,只能出现英文小写字母、数字、英文句点。点击回车

  1. 右击包名称,新建Java class,给类命名

  1. 编辑HelloWorld.java文件,加入Main类(输入psvm,点击回车可以直接生成)

  1. 在Main中简单输出一个字符串(输入sout可以快捷出现代码)

  1. HelloWorld.java空白处右键,选择run HelloWorld.main(),点击页面下方的Terminal可看到执行结果

关闭当前Java项目

打开已有Java项目

  • 点击open or import(在文件名旁边有个黑色框框)

导入已有Java模块

  • 点击file—>Project Structure,点击Modules下的+号,选择import Module

  • 选择对应的模块文件,一直选择下一步就可以

java基础语法笔记

命名规则

  • 标识符可以包含 英文字母26个(区分大小写) 、 0-9数字 、 $(美元符号) 和 _(下划线) 。
  • 标识符不能以数字开头。
  • 标识符不能是关键字。

命名规范: 软性建议

  • 类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。

  • 方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式)。

  • 变量名规范:全部小写。

switch

  • switch后面小括号当中只能是以下数据类型
    • 基本数据类型:byte、short、char、int
    • 引用数据类型:String字符串、enum枚举

Scanner的使用

1
2
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();

基本数据类型和包装类

基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

四种权限修饰符

  • Java中有四种修饰符

HelloWorld入门(命令行)

1. 程序开发步骤说明

  • Java程序开发三步骤:编写、编译、运行
  • Java源文件的编译工具 javac.exe ,Java程序 .class文件 的运行工具 java.exe ,在JDK安装目录的bin目录下。但是由于配置了环境变量,可以再任意目录下使用。

2. 编写源程序

  1. F:\Java_Code\demo1目录下新建文本文件,将文件名修改为HelloWorld.java
  2. 用记事本打开该文件,输入以下文本,注意其中的类名必须和文件名一致
1
2
3
4
5
public class HelloWorld { 
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

3. 编译Java源文件

  • 打开Windows命令窗口,进入HelloWorld.java源文件的目录,使用 javac HelloWorld.java 命令进行编译。

  • 编译成功后,在该目录下产生了一个新的文件HelloWorld.class字节码文件

4. 运行Java程序

  • 使用 java HelloWorld 运行【命令格式: java 类名

Java和c的跨平台特性

  • 跨平台

    我理解下的是跨平台:在不同的平台(windows、linux、xp等各种系统+CPU)下,源代码不需要重新编译便可运行

    不同的平台下对应的机器指令、操作系统机制有很大的差异。

Java跨平台原理

  • Java程序编译执行过程

    1. 源文件由编译器编译成.class字节码文件,javac.exe是编译器
    2. 字节码由Java虚拟机解释生成最终的机器代码来执行,java.exe是解释器,属于JVM的一部分
  • JVM

    JVM全称是Java Virtual Machine,也就是Java虚拟机。Java程序运行在虚拟机上,不同的平台有对应的自己的虚拟机版本

  • Java跨平台

    因此,跨平台的不是Java语言本身,实际上是.class文件。.class文件可以在任何运行JVM的平台上解释执行,不需要重新编译生成新的.class文件。

C语言的跨平台?

  • C程序编译过程

    1. 预处理:对宏、头文件等进行处理,生成最终需要编译的文件
    2. 编译:将高级语言代码文件编译为汇编语言文件(.s)
    3. 汇编:通过编译器将汇编语言编译成目标代码(.o/.obj)
    4. 链接:将一个程序执行需要的二进制文件关联起来,形成可执行文件(.exe)
  • C语言跨平台

    C语言不能跨平台,是因为生成的目标文件不能在不同的平台下执行,而是要用该平台下的编译器重新编译运行。

PS:

本文参考链接:https://blog.csdn.net/qq_36718740/article/details/82902754?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-3-82902754.nonecase

IDEA运行报错【java:错误不支持发行版本14】

解决办法1

  • 在新建工程前,点击configure下的Structure for New Projects

  • 在Projecting Settings中的Project,检查Project SDK和Project language level,后者版本不能高于前者。

解决办法2

  • 在新建的工程中,点击菜单栏上File中的Project Structure

  • 在Projecting Settings中的Project,检查Project SDK和Project language level,后者版本不能高于前者。

  • 在Projecting Settings中的Modules,检查:language level版本不能高于当前JDK版本。