DOS命令窗口
- dir 查看当前目录下有啥东西
path环境变量
- path环境变量的作用就是给windows操作系统指路的,告诉windows操作系统去哪里找这个命令文件。
- path环境变量中有很多很多的路径,路径和路径之间用半角分号分隔。 path=A;B;C;D…( path是环境变量的名字。 A;B;C;D…是环境变量path的值。)
- 出现“命令找不到错误了”,这个时候能够想起来配置环境变量path。
- path环境变量中的路径可以指定多个
Java语言的特性
- . 简单性
在Java语言当中真正操作内存的是:JVM(Java虚拟机),所有的java程序都是运行在Java虚拟机当中的。而Java虚拟机执行过程中再去操作内存。
Java语言屏蔽了指针概念,程序员不能直接操作指针,或者说程序员
不能直接操作内存。
优点:不容易导致内存泄漏。
缺点:效率问题,包括驾驭感比较差。 - java是堪称完全面向对象的。
- 健壮性
自动垃圾回收机制(GC机制)。java不容易导致内存的泄漏。
JVM(C++语言写的一个虚拟的计算机)负责调度GC机制。程序员不需要干涉。 - java完全/完美支持多线程并发。
- 可移植性/跨平台
java语言只要编写一次,可以做到到处运行。(平台改变了,程序不需要改。)
JVM这种机制实现了跨平台,那么这种机制优点和缺点分别是什么?
优点:一次编写到处运行,可以跨平台。
缺点:麻烦。对于运行java程序来说必须先有一个JVM。
就像你要想在网页上看视频,你必须先安装一个flash是一样的。
JDK、JRE、JVM三者之间的关系?
- JDK:Java开发工具箱
- JRE:java运行环境
- JVM:java虚拟机
JDK包括JRE,JRE包括JVM。
JVM是不能独立安装的。RE和JDK都是可以独立安装的。
对Java的加载与执行的理解(理论比较重要)
- java程序从编写到最终运行经历了非常重要的两个阶段:
1、编译阶段(java程序员直接编写的java代码(普通文本,java源代码xxx.java)是无法执行被JVM识别的。JVM能够识别“字节码”(xxx.class)。 java代码这种普通文本变成字节码的过程,被称为:编译。 JDK的bin目录下有: javac.exe 负责编译
java.exe 负责运行 javac命令)
2.运行阶段(最终运行的是class文件。java命令) - 编译阶段和运行阶段可以在不同的操作系统上完成吗?
一次编写到处运行。1个java源文件是可以编译生成多个class文件的。 - 字节码文件是二进制文件吗?
字节码文件不是二进制文件。如果是二进制的话,就不需要JVM了。因为操作系统可以直接执行二进制。 - java程序从开发到最终运行经历了什么?
- 编译期:(可以在windows上)
第一步:在硬盘的某个位置(随意),新建一个xxx.java文件
第二步:使用记事本或者其它文本编辑器例如EditPlus打开xxx.java文件
第三步:在xxx.java文件中编写“符合java语法规则的”源代码。
第四步:保存(一定要将xxx.java文件保存一下)
第五步:使用编译器(javac【JDK安装后自带】)对xxx.java文件进行编译。
第六步:如果xxx.java文件中编写的源代码是符合语法规则的,编译会通过,
如果xxx.java文件中编写的源代码违背了语法规则,那么编译器会报错,编译器
报错之后class文件是不会生成的,只有编译通过了才会生成class字节码文件。
并且一个java源文件是可以生成多个class文件的。(编译实质上是检查语法) - 运行期(JRE在起作用):(可以在windows上,也可以在其他的OS上。)
第七步:如果是在Linux上运行,需要将windows上生成的class文件拷贝过去
不需要拷贝源代码,真正运行的是字节码。(但是源代码也不要删除,有用)
第八步:使用JDK自带的一个命令/工具:java(负责运行的命令/工具)执行字节码
第九步:往下的步骤就全部交给JVM了,就不需要程序员干涉了。
JVM会将字节码文件装载进去,然后JVM对字节码进行解释(解释器负责将字节码
解释为1010101010…等的二进制)
第十步:JVM会将生成的二进制码交给OS操作系统,操作系统会执行二进制码和
硬件进行交互。
小插曲:xxx.java源文件经过编译之后生成了A.class、B.class、C.class等文件,
那么我们称A是一个类、B是一个类、C是一个类。其中A、B、C是类的名字。
编译阶段 javac命令
javac java源文件的路径
- 编译报错的时候不会生成class字节码文件!
- 把java源文件直接拖进到DOS命令窗口,那么DOS命令窗口就有这个路径了。
- 怎么在DOS命令窗口中快速定位到某个路径呢?
打开计算机–>打开一些文件夹–>在地址栏上直接输入cmd回车,这样直接就过去了。 - javac <选项> <源文件>
使用 --help 可列出可能的选项
运行阶段 java命令
java 类名
- 运行的前提是:class文件(字节码)生成了。没有字节码文件程序是无法运行的。如果文件名是Test.class,那么:Test就是一个类名。
- 运行java程序需要哪些步骤呢?
第一步(必须这样做,这是必须的,先记住):
先使用cd命令切换到Test.class文件所在的路径。
第二步:执行java Test
“java HelloWorld”的执行过程以及原理。
D:\course\JavaProjects\02-JavaSE\chapter01>java HelloWorld
敲完回车,都发生了什么?????
第一步:会先启动JVM(java虚拟机)
第二步:JVM启动之后,JVM会去启动“类加载器classloader”
类加载器的作用:加载类的。本质上类加载器负责去硬盘上找“类”对应的“字节码”文件。
假设是“java HelloWorld”,那么类加载器会去硬盘上搜索:HelloWorld.class文件。
第三步:
类加载器如果在硬盘上找不到对应的字节码文件,会报错,报什么错?
错误: 找不到或无法加载主类
类加载器如果在硬盘上找到了对应的字节码文件,类加载器会将该字节码 文件装载到JVM当中,JVM启动“解释器”将字节码解释为“101010000...”这种 二进制码,操作系统执行二进制码和硬件交互。
默认情况下类加载器(classloader)会从当前路径下找。 我们可以设置一个环境变量,叫做:classpath,给“类加载器”指路。
classpath环境变量不属于windows操作系统,classpath环境变量隶属于java。 classpath环境变量是java特有的。
classpath=A路径;B路径;C路径…
classpath是一个变量名
A路径;B路径;C路径…是变量值
我们把classpath配置一下,这个环境变量在windows中没有,需要新建!!!!
计算机-->右键-->属性-->高级系统设置-->环境变量-->新建...
注意:变量名不能随意写:大小写无所谓,但必须叫做:classpath
CLASSPATH
ClassPath
Classpath
classpath
都行。
我目前是随意配置的:(重启CMD)
classpath=D:\course
非常重要的一个特点,必须记住:
配置了classpath=D:\course之后,类加载器只会去D:\course目录下找“xxx.class”文件
不再从当前路径下找了。
- classpath环境变量的作用是什么?
是给类加载器指路的。
在没有配置环境变量classpath的时候,默认从当前路径下加载。
如果配置了环境变量classpath的话,就只能从指定的路径下加载了。
path java_home classpath,这3个环境变量path需要配置,后面两个暂时不配置。
在高版本的JDK当中,有一个新特性,可以直接一步到位: java x/y/z/xxx.java
(ava后面直接加java源文件的路径。)
这个特性是为了简化开发而提出,但实际上底层的实现原理还是和以前一样的,
以上命令在执行过程中,还是会先进行编译,然后再运行。并且以上的运行方式,
编译生成的class文件在硬盘上不存在,看不到。
解释说明
// 单行注释
/*
多行注释
*/
/**
* javadoc注释:这里的注释信息可以自动被javadoc.exe命令解析提取并生成到帮助文档当中。
*/
标识符
1、标识符可以标识什么,什么是标识符,怎么理解这个概念!
2、标识符的命名规则、规范
关键字
java语言中的所有关键字都是全部小写。
注意:java语言中是严格区分大小写的。public和Public不一样。
Class和class不一样。static和Static也不一样。
关键字:
this
public
static
void
class
byte
short
int
long
float
double
boolean
char
true
false
if
while
for
private
protected
........
变量
- 字面量==数据
10 100 123 :整型
1.34 3.14 2.0:浮点型
true false :布尔型
'a' '国':字符型
"a" "abc" "国" "中国":字符串型
- 变量
变量就是一个存数据盒子。(盒子大小谁来决定啊?数据类型)
在内存中的最基本的存储单元。存数据用的,而且这个数据是可变的,所以叫做变量。
java中的变量必须先声明,再赋值才能访问(必须手动赋值。)
int k; System.out.println(k); 这样是不行的。
int a, b, c = 100;(c变量赋值100,a,b变量只声明了没有赋值。)
int a = 10, b = 20, c = 100;
声明和赋值可以分开,也可以一起做!!!
int i; // 先声明
i = 100;// 再赋值
int k = 200; // 声明的同时赋值
在“同一个域”当中,变量名不能重名,没有final修饰时可以重新赋值!!!
{
int i = 100;
//double i = 2.0; // 重名了编译器会报错,不允许。
i = 300; // 可以重新赋值。
int i = 3;//不能重复声明
}
一个大括号代表一个域。
变量可以重新赋值,但在同一个域当中,不能重复声明。
{A域
{B域
{C域
}
}
}
A域包括B域,B域包括C域。
- 变量的作用域
出了大括号就不认识了。别的先别管。
{
int i = 100;
{
在这里可以访问i
}
}
{
在这里是无法访问i变量。
}
成员变量:
- 变量的分类
在方法体当中声明的变量叫做局部变量。在方法体外以及类体内声明的变量叫做成员变量。 - 成员变量
a、成员变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型);
b、在定义成员变量时可以对其初始化,如果不初始化,java会使用默认的值对其初始化(引用类型为null,布尔类型为false,其余基本类型的初始值都为0);
分类:(1)类属性(以static修饰):类属性从这个类的准备阶段开始存在,直到系统完全销毁这个类,类属性的作用域与这个类的生存周期相同;类属性可以理解为类成员变量,与类共存亡;只要类存在,程序就可以访问该类的类属性,在程序中可以通过如下格式:类.类属性。一个类属性的内存空间只有一个,多个该类的对象共享该类属性的内存;当其中一个实例对其修改时,就会改变,static修饰的存放在data segment;
(2)实例属性(不以static修饰):实例属性从这个类的实例被创建开始起存在,直到系统完全销毁这个实例,实例属性的作用域与该实例的生存周期相同;实例属性可以理解为实例的成员变量,它作为实例的一个成员,与实例共存亡;只要实例存在,程序就可以访问该实例属性,在程序中可以通过如下格式: 实例.实例属性。当创建实例的时候,在堆里面会对成员变量进行初始化;每个对象通过对应的类实例化后会有一个实例属性。
提示:一个类在使用之前要经过类加载、类验证、类准备、类解析、类初始化等几个阶段。
- 局部变量:
(1)局部变量可以使用java语言中的任何一种数据类型;
(2)除了形参外,局部变量都必须进行显式初始化,如果不初始化,编译不会通过;
分类:(1)形参(方法签名中定义的变量):作用域在在整个方法内;当类或对象调用某个方法时,系统会在该方法栈区为所有形参分配内存空间,并将实参的值赋给对应形参,这样就完成了形参的初始化;
(2) 方法局部变量(在方法内定义):作用域从定义该局部变量的地方开始生效,到该方法结束时消失;
(3)代码块局部变量(在代码块内定义):作用域从定义该变量的地方开始生效,到该代码块结束时失效;
方法重载overload
- 什么情况下我们考虑使用方法重载机制?
当功能相似的时候,建议将方法名定义为一致的,
这样代码美观,又方便编程。
注意:如果功能不相似,坚决要让方法名不一致。
- 代码满足什么条件的时候构成了方法重载?
条件1:在同一个类当中
条件2:方法名相同
条件3:形式参数列表不同(类型、个数、顺序)
注意:
方法重载和返回值类型无关,和修饰符列表无关。
方法递归
- 需要理解什么是方法递归?
方法自身调用自身。 - 使用递归的时候,必须添加结束条件,没有结束条件,会发生栈内存溢出错误。
StackOverflowError
原因:一直压栈,没有弹栈,栈内存不够用。 - 会画出递归方法的内存结构图。
递归的过程当中可以将图画出来。 - 能够使用循环代替递归的尽量使用循环,循环的执行耗费内存少一些,
递归耗费内存相对多一些,另外递归使用不当很容易内存溢出,JVM停止工作。
当然,只有极少数情况下,只能用递归,其它代码解决不了问题。 - 当递归有结束条件,并且结束条件合法的时候,就一定不会内存溢出吗?
也不一定。可能递归的太深了。 - 分享了一些递归方面的经验
在实际的开发中遇到递归导致的栈内存溢出错误是怎么办?
第一步:先检查结束条件是否正确。
第二步:如果正确,可以调整JVM的栈内存大小。(java -X)
面向对象包括三大特征
- 封装
第一步:属性私有化(使用private关键字进行修饰。)
第二步:对外提供简单的操作入口。set和get方法都是实例方法,实例方法的调用必须先new对象。不能带static。 - 继承
- 多态
有了封装,才有继承,有了继承,才能说多态。
静态代码块
- 类加载时执行
实例语句块
- 在构造方法执行之前,自动执行“实例语句块”中的代码。实际上这也是SUN公司为java程序员准备一个特殊的时机,叫做对象构建时机。
类体
类体{
实例变量;
实例方法;
静态变量;
静态方法;
构造方法;
静态代码块;
实例语句块;
方法(){
// 局部变量
int i = 100;
}
}
this
- this是一个关键字,是一个变量,是一个引用,保存内存地址指向自身。
- this存储在堆内存当中对象的内部。
- this可以使用在实例方法中,也可以使用在构造方法中。
- this出现在实例方法中其实代表的是当前对象。
- this不能使用在静态方法中。
- this. 大部分情况下可以省略,但是用来区分局部变量和实例变量的时候不能省略。
- this() 这种语法只能出现在构造方法第一行,表示当前构造方法调用本类其他的
构造方法,目的是代码复用。