1.JVM、JRE、JDK关系
JVM:java虚拟机,体现在跨平台,可移植性。
2.JAVA内存划分
3.javac.exe java.exe
javac.exe:java编译器工具。
命令:javac xx.java
使用了package机制:javac xx.java
将当前目录.java文件编译到指定目录:javac -d 指定目录 xx. java
将当前目录.java文件编译到当前目录:javac -d . xx. java
java.exe:java解释器,解释执行字节码。
命令:java xx
使用了package机制,手动创建目录,将xx.class放到指定目录下,运行:java 包名.xx
注:JVM的类加载器ClassLoader默认从当前路径下加载。
4.基本数据类型默认值
基本数据类型 | 默认值 | 说明 |
---|---|---|
boolean | false | false为0,true为1 |
char | ‘/uoooo’ | (null) |
byte | 0 | |
short | 0 | |
int | 0 | |
long | 0L | |
float | 0.0f | |
double | 0.0d |
注:
1、八种基本数据类型当中除布尔类型之外剩下的7种类型之间都可以互相转换。
2、小容量向大容量转换,称为自动类型转换,容量从小到大排序:
byte< short/char < int< long < float < double
1)任何浮点类型不管占用多少个字节,都比整数型容量大。
2)char和short可表示的种类数量相同,但是char可以取更大的正整数。
3、大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符,程序才能编译通过,但是在运行阶段可能会损失精度,所以递慎使用。
4、当整数子面值没有超出byte,short,char的取值范围,可以直接赋值给byte,short,char类型的变量。
5、 byte, short,char混合运算的时候,各自先转换成int类型再做运算。
6、多种数据类型混合运算,先转换成容量最大的那种类型再做运算。
5.win系统启动jar包
命令:java -jar xxx.jar
1)如果出现编码问题,启动命令为:java -jar -Dfile.encoding=utf-8 xxx.jar
2)在powershell 启动命令为:java -jar ‘-Dfile.encoding=utf-8’ xxx.jar
原因:
1)Windows下默认为GBK编码windows系统javac编译utf-8编码的java文件时,会报错: 编码GBK的不可映射字符
如果启动.java文件,编译命令为:javac -encoding utf-8 xxx.java
2)Linux下默认为UTF-8编码,javac编译gbk编码的java文件时,会报错: 编码UTF8的不可映射字符
如果启动.java文件,编译命令为:javac -encoding gbk xxx.java
6.标识符的命名规范
1.接口名:首字母大写,后面每个单词首字母大写。
2.方法名:首字母小写,后面每个单词首字母大写。
3.常量名:全部大写
注:
1.一个合法的标识符只能由数字、字母、下划线_、美元符号$“组成;
2.不能数字开头;
3.严格区分大小写;
4.关键字不能做标识符;
5.理论上无长度限制,但是最好不要太长。
7.方法执行过程中JVM内存分配
1.方法代码片段属于.class字节码文件的一部分,字节码文件在类加载的时候,将其放到了方法区当中。所以JNM中的三块主要的内存空间中方法区内存最先有数据。存放了代码片段。代码片段虽然在方法区内存当中只有一份,但是可以被重复调用。
2.每一次调用这个方法的时候,需要给该方法分配独立的活动场所,在栈内存中分配。【栈内存中分配方法运行的所属内存空间】
3.方法在调用的瞬间,会给该方法分配内存空间,会在栈中发生压栈动作(给方法分配内存),方法执行结束之后,给该方法分配的内存空间全部释放,此时发生弹栈动作(释放该方法的内存空间)。
4.局部变量在“方法体”中声明。局部变量在运行阶段内存在栈中分配。
8.方法重载、方法递归、方法重写
方法重载(overload):方法名一致,参数数量不一致;方法名一致,参数顺序不一致;方法名一致,参数类型不一致。
方法重载和方法的返回值类型无关;和方法的修饰符列表无关。
方法递归:非常耗费内存;必须有结束条件,否则出现栈内存溢出错误。
方法重写(override/overwrite):子类将父类中继承过来的方法进行重新编写。
1.返回值类型相同,方法名相同,形参列表相同
2.子类访问权限不能更低,可以更高。
3.子类抛出异常不能更多,可以更少。
4.私有方法不能继承,所以不能覆盖;构造方法不能继承,所以不能覆盖;静态方法不存在覆盖;覆盖只针对方法,不谈属性。
8.面向对象、面向过程
面向对象:耦合度低,扩展力强,更容易解决现实世界当中更复杂的业务逻辑,组件复用性强;前期投入成本较高,需要进行独立体的抽取,大量的系统分析与设计。
面向过程:对于业务逻辑比较简单的程序,可以达到快速开发,前期投入成本较低;难以解决非常复杂的业务逻辑,另外面向过程的方式导致软件元素之间的“耦合度“非常高,只要其中一环出问题,整个系统受到影响,导致最终的软件“**扩展力”**差。另外,由于没有独立体的概念,所以无法达到组件复用。
注:
1.C语言是纯面向过程的、C++半面向对象、Java纯面向对象
2.面向对象的三大特征:封装、继承、多态。
3.面向对象的分析:OOA
面向对象的设计:OOD
面向对象的编程:OOP
8.对象创建过程中JVM内存分配
实例化对象的语法:new 类名()
new:创建对象
- 方法区内存(方法、静态变量):在类加载的时候,class字节码代码片段被加载到该内存空间当中,静态变量初始化,静态代码块执行。
- 栈内存(局部变量):方法代码片段执行的时候,会给该方法分配内存空间,在栈内存中压栈。
- 堆内存(成员变量):new的对象在堆内存中存储。
9.构造方法
1.当一个类中没有定义任何构造方法的话,系统默认给该类提供一个无参数的构造方法,这个构造方法被称为缺省构造器。
2.当一个类显示的将构造方法定义出来了,那么系统则不再默认为这个类提供缺省构造器。建议开发中手动的为当前类提供无参数构造方法。
3.作用:创建对象;实例变量赋值。
10.关键字
1.this
- this是一个引用;一个变量,this变量中保存了内存地址指向了自身,this存储在JVM堆内存java对象内部。
- 创建100个java对象,每一个对象都有this,也就说有100个不同的this。
- this可以出现在实例方法当中,this指向当前正在执行这个动作的对象。(this代表当前对象)。
- this可以使用在构造方法当中,通过当前的构造方法调用其它的构造方法【语法格式:this(实参);】
- this在多数情况下都是可以省略不写的。
- this不能使用在带有static的方法当中。
2.static
- static修饰的方法是静态方法,修饰的变量是静态变量。
- 所有static修饰的元素都称为静态的,都可以使用"类名.xx"的方式访问,也可以用"引用.xx"的方式访问【但不建议】
- static修饰的所有元素都是类级别的特征,和具体的对象无关。
- 静态方法中无法直接访问实例变量和实例方法。
- 静态代码块在类加载时执行,并且只执行一次。
语法格式:static{java语句;}
静态代码块在一个类中可以编写多个,并且遵循自上而下的顺序依次执行。
通常在静态代码块当中完成预备工作,先完成数据的准备工具,例如:初始化连接池,解析xml配置文件。
3.final
- final修饰的类无法被继承
- final修饰的方法无法被覆盖
- final修饰的变量一旦赋值之后,不可重新赋值
- final修饰的实例变量,必须手动赋值,不能采用系统默认值
- final修饰的引用,一旦指向某个对象之后,不能再指向其它对象,那么被指向的对象无法被垃圾回收器回收。(但是所指问的对象内部的内存是可以被修改的)
- 常量:public static final 类型 常量名 = 值;
4.backage
- 语法:package 包名;
- 一个包对应的是一个目录。
- 包名要求全部小写,包名也是标识符,必须遵守标识符的命名规则。
- 包名的命名规范:公司域名倒序+项目名+模块名+功能名
5.import
- 语法:import 类名;import 包名.*;
- import语句需要编写到package语句之下,class语句之上。
- import语句用来完成导入其它类,同一个包下的类不需要导入,不在同一个包下需要手动导入。
6.public
- 访问控制权限修饰符,访问范围:表示公开的,在任何位置都可以访问。
- 访问控制权限修饰符可以修饰类、变量、方法。
- 修饰符的范围:
private <缺省< protected<public
7.protected
- 访问控制权限修饰符,访问范围:同包,子类。
- 访问控制权限修饰符可以修饰类、变量、方法。
- 当某个数据只希望子类使用,使用protected进行修饰。
- 修饰符的范围:
private <缺省< protected<public
8.缺省、默认
- 访问控制权限修饰符,访问范围:同包。
- 访问控制权限修饰符可以修饰类、变量、方法。
- 修饰符的范围:
private <缺省< protected<public
9.private
- 访问控制权限修饰符,访问范围:表示私有的,只能在本类中访问。
- 访问控制权限修饰符可以修饰类、变量、方法。
- 修饰符的范围:
private <缺省< protected<public
11.运算符
1.instance of
语法格式: (引用 instance of 数据类型名)
执行结果类型:布尔类型,结果可能是true/false
12.实例代码块
1、实例代码块可以编写多个,也是遵循自上而下的顺序依次执行
2、实例代码块在构造方法执行之前执行,构造方法执行依次,实例代码块对应执行一次。
3、实例代码块也是java语言为程序员准备一个特殊的时机,这个特殊时机被称为:对象初始化时机。
13.面向对象的三大特征
1.封装
2.继承
1.继承基本的作用是:代码复用。但是继承最重要的作用是:有了继承才有了以后方法的覆盖和多态机制。
2.关键字:extends
3.java语言当中的继承只支持单继承,一个类不能同时继承很多类,只能继承一个类。在C++中支持多继承。
4.B类继承A类,其中:
A类称为:父类、基类、超类、superclass
B类称为:子类、派生类、subclass
5.在java语言当中子类继承父类:私有的不支持继承,构造方法不支持继承,其它数据都可以被继承。
6.虽然java语言当中只支持单继承,但是一个类也可以间接继承其它类,如:B直接继承A类,C直接继承B类,但是C类间接继承A类。
7.java语言中假设一个类没有显示的继承任何类,该类默认继承JavaSE库当中提供的java.lang.object类。
3.多态
向上转型(upcasting):子类型–>父类型;被称为:自动类型转换。
向下转型(downcasting):父类型 --> 子类型;被称为:强制类型转换【需要加强制类型转换符】。
作用:降低程序的耦合度,提高程序的扩展力。
注:
(1)无论是向上转型还是向下转型,两种类型之间必须要有继承关系。没有继承关系,程序是无法编译通过的。
(2)Java中允许这种语法:父类型引用指向子类型对象。
这种语法导致程序存在编译阶段绑定(父类型)和运行阶段绑定(子类型)两种不同的形态/状态,这种机制可以成为一种多态语法机制。
(3)当调用的方法是子类型中特有的,在父类型当中不存在,必须进行向下转型。
14.抽象类、接口
1.抽象类
- 抽象类:在class前添加abstract关键字。
- 抽象方法:public abstract void doSome();
- 抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的。
- final和abstract不能联合使用,这两个关键字是对立的。
- 抽象类的子类可以是抽象类。也可以是非抽象类。
- 抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。
- 抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。
- 一个非抽象的类,继承抽象类,必须将抽象类中的抽象方法进行覆盖/重写/实现。
2.接口
- 接口是一种“引用数据类型”。
- 接口是完全抽象的。
- 接口怎么定义:[修饰符列] interface 接口名{}
- 接口支持多继承。
- 接口中只有常量+抽象方法。
- 接口中所有的元素都是public修饰的。
- 接口中抽象方法的public abstract可以省略。
- 接口中常量的public static final可以省略。
- 接口中方法不能有方法体。
- 一个非抽象的类,实现接口的时候,必须将接口中所有方法加以实现。
- 一个类可以实现多个接口。
- extends和implements可以共存,extends在前,implements在后。
- 使用接口,写代码的时候,可以使用多态(父类型引用指向子类型对象)。
3.抽象类、接口的区别
- 接口是完全抽象的。抽象类是半抽象的。
- 接口中没有构造方法。抽象类中有构造方法。
- 接口和接口之间支持多继承。类和类之间只能单继承。
- 一个类可以同时实现多个接口,一个抽象类只能继承一个类(单继承)。
- 接口中只允许出现常量和抽象方法。
15.==、equals
- 判断两个基本数据类型的数据是否相等:==。
- 判断两个对象是否相等:equals方法。
注:判断两个java对象是否相等,不能使用==,因为==比较的是两个
对象的内存地址。