JAVA基础

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.基本数据类型默认值

基本数据类型默认值说明
booleanfalsefalse为0,true为1
char‘/uoooo’(null)
byte0
short0
int0
long0L
float0.0f
double0.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对象是否相等,不能使用==,因为==比较的是两个
    对象的内存地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值