本文已参与「新人创作礼」活动,一起开启掘金创作之路。
java介绍
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
java的使用
1.下载安装
java官网下载地址上找到对应的版本下载,本文以windows、liunx、jdk1.8.0_151为例。
下载完之后傻瓜式安装就好,默认目录C:\Program Files\Java\。
2.环境变量配置
windows: 此计算机->右键到属性->高级系统设置->环境变量
添加用户变量:
变量名:JAVA_HOME,变量值:C:\Program Files\Java\jdk1.8.0_151
变量名:CLASSPATH,变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
添加系统变量path:
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;,记得前后分号
liunx: 将下载好的压缩包解压到指定目录,我这里用的是/usr/local/java,解压完成后打开vi /usr/profile 添加如下内容
#set java environment
JAVA_HOME=/usr/local/java/jdk1.8.0_151
JRE_HOME=/usr/local/java/jdk1.8.0_151/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
最后在cmd窗口或者liunx上执行java -version能出现对应的版本表示安装成功。
java的特性与结构
特点: 一处编译,多处执行,跨平台,安全性(1.摒弃指针 2、GC垃圾回收机制:(自动释放回收长时间不使用对象的内存))
结构:JDK & JRE & JVM
- JDK(Java Development Kit Java开发工具包),JDK是提供给java开发人员使用的,其中包含了java的开发工具,也包括了jre,其中的开发工具:编译工具(javac.exe) 打包工具(java.exe)等等
- jre(Java Runtime Environment Java运行环境),包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需要的核心库类等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可.
- JVM(Java Virtual Machine) 是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,所以Java语言是跨平台语言
- 三者结构图:
关键字含义
| 关键字 | 含义 |
|---|---|
| abstract | 表明类或者成员方法具有抽象属性 |
| assert | 断言,用来进行程序调试 |
| boolean | 基本数据类型之一,声明布尔类型的关键字 |
| break | 提前跳出一个块 |
| byte | 基本数据类型之一,字节类型 |
| case | 用在switch语句之中,表示其中的一个分支 |
| catch | 用在异常处理中,用来捕捉异常 |
| char | 基本数据类型之一,字符类型 |
| class | 声明一个类 |
| continue | 回到一个块的开始处 |
| default | 默认,例如,用在switch语句中,表明一个默认的分支。Java8 中也作用于声明接口函数的默认实现 |
| do | 用在do-while循环结构中 |
| double | 基本数据类型之一,双精度浮点数类型 |
| else | 用在条件语句中,表明当条件不成立时的分支 |
| enum | 枚举 |
| extends | 表明一个类型是另一个类型的子类型。对于类,可以是另一个类或者抽象类;对于接口,可以是另一个接口 |
| final | 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量 |
| finally | 用于处理异常情况,用来声明一个基本肯定会被执行到的语句块 |
| float | 基本数据类型之一,单精度浮点数类型 |
| for | 一种循环结构的引导词 |
| if | 条件语句的引导词 |
| implements | 表明一个类实现了给定的接口 |
| import | 表明要访问指定的类或包 |
| instanceof | 用来测试一个对象是否是指定类型的实例对象 |
| int | 基本数据类型之一,整数类型 |
| interface | 接口 |
| long | 基本数据类型之一,长整数类型 |
| native | 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的 |
| new | 用来创建新实例对象 |
| package | 包路径 |
| private | 一种访问控制方式:私用模式 |
| protected | 一种访问控制方式:保护模式 |
| public | 一种访问控制方式:共用模式 |
| return | 从成员方法中返回数据 |
| short | 基本数据类型之一,短整数类型 |
| static | 表明具有静态属性 |
| strictfp | 用来声明FP_strict(单精度或双精度浮点数)表达式遵循[IEEE 754](baike.baidu.com/item/IEEE 754)算术规范 |
| super | 表明当前对象的父类型的引用或者父类型的构造方法 |
| switch | 分支语句结构的引导词 |
| synchronized | 表明一段代码需要同步执行 |
| this | 指向当前实例对象的引用 |
| throw | 抛出一个异常 |
| throws | 声明在当前定义的成员方法中所有需要抛出的异常 |
| transient | 声明不用序列化的成员域 |
| try | 尝试一个可能抛出异常的程序块 |
| void | 声明当前成员方法没有返回值 |
| volatile | 表明两个或者多个变量必须同步地发生变化 |
| while | 用在循环结构中 |
-
volatile是Java提供的一种轻量级的同步机制。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级。
-
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
-
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
-
2)禁止进行指令重排序。
-
Atomic原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
java中的数据类型
1.引用数据类型
数组、类型、接口。
2.基本数据类型
- short:java中的整型,一个short变量是int变量所占空间的1/2,长度为2字节的16bit
- 整型:byte、short、int、long(8位一个字节、16/2、32/4、64/8)
- 浮点数:folat、double(32/4、64/8)
- 布尔类型:boolean
- char:char(16/2)
级别从低到高为:byte、char、short(平级)->int->float->long->double
java中整型初始值默认0,浮点型默认0.0,布尔类型默认false,引用数据类型默认null
3.字符串
lang包下的String类,是不可以被继承的。 ==在基础数据类型比较时,比较的是他们的值。在复合数据类型时(类、对象),比较的是他们内存中的存放地址。 equals方法,默认是比较对象的内存地址,但是一些类中已被覆盖,比较两个对象的内容是否相同。
4.运算
- << 表示左移,不分正负数,低位补0,转成二进制,后面补两位0,不足位数的前面通通补0
//例如: 25左移两位
25 << 2 25二进制 0001 1001 左移两位低位补零 0110 0100 最终结果100
//小技巧 x << y x*2的y次方,此处^为数学符号
25*2^2 25*4=100
- 右移>> 如果该数为正,则高位补0,若为负数,则高位补1
//例如:25右移两位
25 >> 2 25二进制 0001 1001 右移两位高位正数补零 0000 0110 最终结果6
//小技巧 x << y x/2的y次方,此处^为数学符号
25/2^2 25/4=6
- &运算,转换成二进制比较的每一位,只有都是1的时候才是1,否则为0
//例如 25 & 98 = 0
25 二进制 0001 1001
98 二进制 0110 0010
结果得 0000 0000 = 0
//例如 27 & 98 = 2
27 二进制 0001 1011
结果得 0000 0010 = 2
5.数组
先定义、开辟空间、赋值在使用。java数组长度不可变
- 数组的定义:
- (1)
String[] str0=null;//定义 - (2)
String[] str1=new String[4];//定义并开辟空间 - (3)
String[] str2={"A","B","C","D"}; - (4)
String[] str3=new String[]{"A","B","C"};
- 数组的复制:
System.arraycopy(str1,0,str2,0,1);//从左到右参数意义:从哪个数组,从哪开始复制,复制到哪?开始位置,复制多长
System.out.println("copyOf:"+Arrays.toString(Arrays.copyOf(str1, 3)));
- 数组排序
Arrays.sort(strArr1);
//自己实现
ArrayList.sort 重写Comparator方法
面向对象
1.普通class类
- 类:对某一类事务的描述,java里面称class
- 属性:某一类事物具有的共同点或者特征,程序里面称为全局变量或者成员变量
- 方法,某一类事物具有的动作
- 类定义和使用
class 类名{
属性
方法
}
使用关键字new可以创建类对象,使用过类.属性或者类.方法完成调用
- 创建一个对象在内存中都做了什么事情 ?
1.先将指定位置的class文件加载进内存
2.执行启动main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配一个变量p
3.new关键字向堆内存中申请开辟一个了实体空间,分配一个内存首地址值
4.在该实体空间中进行属性的空间分配,并进行了默认初始化
5.对空间中的属性进行显示初始化
6.进行实体的构造代码块初始化
7.调用该实体的构造方法,进行构造方法初始化
8.将首地址赋值给p,p变量就引用了该实体,指向了该对象
- 从上可以看出类的加载顺序,先初始化变量属性,再是初始化静态代码块,再是构造方法,再是成员方法
2.抽象类 abstract
- 抽象类的特点
1.抽象方法只能定义在抽象类中, 抽象类和抽象方法必须有abstract关键字修饰(不可以修饰变量)
2.抽象方法只定义方法声明,并不实现,非抽象的方法也可以正常定义
3.抽象类不可以被实例化(new),因为存在不具体的方法,没法分配准确的内存
4.只有通过子类继承并实现抽象类中所有的抽象方法后,该子类才可被实例化,否则子类就也是一个抽象类
- 抽象类的问答
1.抽象类是否能被实例化? 上面第三点有讲
2.抽象类是否有构造方法? 有,供子类给对象初始化
3.抽象类是否一定要定义抽象方法? 不一定,抽象代表不具体不确定,有抽象方法是为了让子类更好的实现
4.抽象关键字abstract和哪些关键字不能共存? final, private, static
5.抽象类中可以有普通成员变量
6.抽象类中可以有普通静态方法
3.接口 interface
- 接口的特点
1.接口是特殊抽象类,所有方法都是抽象方法(1.8以后可以定义普通有方法体的方法),数据成员都是public static final
2.接口不能被实例化,方法虽然省略abstract关键字,单实际上还是抽象方法
3.接口里面的变量都是常量,且不可更改
4.接口只能通过implements来实现,一个实现类,可以实现多个接口,实现需要重新所有的抽象方法
5.接口可以继承接口
6.接口中没有构造方法
- 接口的优点
1.java由于单继承,接口可以弥补无法多继承的缺点
2.高内聚低耦合,接口可以实现解耦
3.一种规范
4.抽象类和接口的区别
1.抽象类只能被继承,而且只能被单继承
2.接口需要被实现,且可以多实现
3.抽象类中可以定义非抽象方法,子类继承后可以直接使用
4.接口中都有抽象方法,需要子类实现
其他的自行了解,以上就是全部内容了。
桃花潭水深千尺,不急不急学完再说