Java 基础(一)
目录
下面我们来了解Java的基础。
Java"白皮书"摘要
- 简单性
- 面向对象
- 分布式
- 健壮性
- 安全性
- 体系结构中立
- 可移植性
- 解释型
- 高性能
- 多线程
- 动态性
back
简单的Java程序
public class FirstSample{
public static void main(String[]args){
System.out.println("we will not use \'Hello, World!!!\'");
}
}
这个程序虽然简单,但是所有的Java应用程序,都是这种格式,我们还是花一些时间来了解它
- 关键字
public
称为访问修饰符,这些修饰符用于控制程序的其他部分对这段代码的访问级别
其中还有:
- private
- protected
- 关键字
class
后面紧跟着的是类名,在上述的程序中FirstSample
称为类名。
Java中,对于类名的命名,必须是以字母为开头,后面可以跟字母和数字的任意组合,长度基本上没有限制,但是不可以使用Java的保留字
- 源代码的文件名必须与公共类的名字相同,并用
.java
作为扩展名
back
源代码文件和字节码文件
在Java中,有两种常见的文件,分别是以.java
和.class
为扩展名的文件。其中.java
是Java源文件,.class
是字节码文件(也就是经过编译后的文件)
我们都常说,Java是跨平台的,为什么能够跨平台?因为有jvm,因为jvm只能识别.class
文件,所以编写的.java
文件必须经过编译,称为.class
文件,才能够被jvm运行
back
Java的数据类型
Java中的基本数据类型是四类八种
哪四类?
- 整型
- 浮点类型
- char类型
- boolean类型
八种是:
类型 | 占字节数 |
---|---|
byte | 1字节 |
short | 2字节 |
int | 4字节 |
long | 8字节 |
float | 4字节 |
double | 8字节 |
char | --- |
boolean | --- |
boolean
只能有两个值,false
,true
,不可以有其他的值,用于判定逻辑条件。整型值和布尔值之间不能进行相互转换
请注意!!!!
Integer
和int
不是同一个东西,Integer
是int
的包装类,int
是java
的一种基本数据类型。因为Integer
是一个类,所以必须经过实例化之后,才能使用。而int
则不需要。其中,Integer
的默认值是null
,int
的默认值是 0
。
其中还有:
- Byte
- Short
- Long
- Float
- Double
- Boolean
- Character
- Integer ( 刚刚提及的 )
以上的都是包装类
而其中,包装类常用的方法则有,以 Integer 为例
返回值类型 | 方法名 | 解释 |
---|---|---|
byte | byteValue() | 把Integer对象转换为byte类型 |
double | doubleValue() | 转为double类型 |
float | floatValue() | 转为float类型 |
int | intValue() | 转为int类型 |
long | longValue() | 转为long类型 |
static int | parseInt(String str) | 把str从字符串类型转成int类型 |
String | toString() | 把转成字符串类型 |
static Integer | valueOf(String s) | 将字符串转成Integer类型 |
包装类主要是两种方法,
- 一种是本类型和其它类型之间进行转换
- 另一种是字符串和本类型以及基本类型之间的转换
back
final关键字
在Java中,final关键字可以用来修饰类、方法和变量,变量包括成员变量和局部变量
- 修饰类:
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
- 修饰方法:
final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写换句话说,也就是这种方法提供的功能已经满足当前要求,不需要进行扩展,并且也不允许任何从此类继承的类来重写这种方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。
- 修饰变量
final修饰的变量表示此变量是“最后的、最终的”含义。一旦定义了final变量并在首次为其显示初始化后,final修饰的变量值不可被改变。
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
back
数学函数与常量
在Java中,有一个类叫Math
,这里包含着各种各样的数学函数,在编写不同类别的程序的时候,可能需要的函数也有不同
方法 | 作用 |
---|---|
Math.sqrt(int a) | 对一个数进行开平方 |
Math.abs(int a) | 对一个数进行绝对值运算 |
Math.pow(doube a,doule b) | 对a进行b次幂的运算 |
Math.PI | 数学中pi的值,也就是3.1415926525..... |
还有很多,不一一列举
back
位运算符
Java中也有类似于c++的位运算
其中
- & 进行 "and" 运算,也就是与运算
- | 进行 "or" 运算,也就是或运算
- ^ 进行 "xor" 运算,也就是异或运算
- ~ 进行 "not" 运算,也就是非运算
- >> 进行右移运算
- << 进行左移运算
back
String API
Java中的String类包含了50多个的方法,下面列出一些常用的方法
方法 | 作用 |
---|---|
char charAt(int index) | 返回index位置的代码单元 |
int compareTo(String other) | 按照字典序,如果字符串位于other之前,返回一个负数,如果位于other之后,返回一个正数,如果两个相等,那么返回 0 |
boolean empty() | 判断是否为空,如果为空,那么返回true,否则返回false |
int indexOf(String str) | |
int indexOf(String str, index formIndex) | |
int indexOf(int cp) | |
int indexOf(int cp,int formIndex) | 返回与字符串str或码点cp匹配的第一个字符串的开始位置,从索引0或fromIndex开始匹配。如果在原字符串中国不存在str,则返回 -1 |
int length() | 返回字符串代码单元的个数 |
String substring(int beginIndex) | |
String substring(int beginIndex, int endIndex) | 返回一个新字符串。这个字符串包含原始字符串中从beginIndex到字符串末尾或endIndex-1的所有代码单元 |
String toLowerCase() | 返回一个字符串,将原始字符串中的大写字母改成小写字母 |
String toUpperCase() | 返回一个字符串,将原始字符串中的小写字母改成大写字母 |
了解String
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,
Constable, ConstantDesc {
/**
* The value is used for character storage.
*
* @implNote This field is trusted by the VM, and is a subject to
* constant folding if String instance is constant. Overwriting this
* field after construction will cause problems.
*
* Additionally, it is marked with {@link Stable} to trust the contents
* of the array. No other facility in JDK provides this functionality (yet).
* {@link Stable} is safe here, because value is never null.
*/
@Stable
private final byte[] value;
/**
* The identifier of the encoding used to encode the bytes in
* {@code value}. The supported values in this implementation are
*
* LATIN1
* UTF16
*
* @implNote This field is trusted by the VM, and is a subject to
* constant folding if String instance is constant. Overwriting this
* field after construction will cause problems.
*/
private final byte coder;
/** Cache the hash code for the string */
private int hash; // Default to 0
/**
* Cache if the hash has been calculated as actually being zero, enabling
* us to avoid recalculating this.
*/
private boolean hashIsZero; // Default to false;
/** use serialVersionUID from JDK 1.0.2 for interoperability */
@java.io.Serial
private static final long serialVersionUID = -6849794470754667710L;
.......
|
以上是String中的一些代码,由上面可见,String是一个final类,也就意味着不能够对其进行继承,并且它的成员方法都默认为final方法。
重要:String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
由于String字符串的不可变性我们可以十分肯定常量池
中一定不存在两个相同的字符串
引入常量池:
Java中的常量池有两种
-
静态常量池
-
运行时常量池
-
静态常量池
即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。这种常量池主要用于存放两大类常量:字面量(Literal)和符号引用量(Symbolic References),字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原理方面的概念,包含:1、类和接口的全限定名,2、字段名称和描述符,3、方法名称和描述符
- 运行时常量池
是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。类加载后,常量池中的数据会在运行时常量池中存放!
back
读入和输出
读入
java.util.Scanner
Scanner在java.util包中
Scanner in=new Scanner(System.in)
输出
System.out.print(something)
System.out.print("What is your name?")
使用Scanner类中的各种方法,可以从控制台中进行输入,例如
Scaner in=new Scanner(System.in);
String name=in.nextLine();//读取下一行,也就是你应该输入的那一行,然后赋值给name
int pos=in.nextInt();//读取下一个数字,转化为int赋值给pos
double pos=int nextDouble();//读取下个一个数字,转化为double赋值给pos
System.in
是什么?是一个输入流。流不展开
back
包
Java中允许使用包将类组织在一个集合中。借助包可以更方便组织自己的代码,并将自己的代码与别人提供的代码库分开管理
使用包的主要原因是确保类名的唯一性。如果两个程序员不约而同地建立了两个类名一样的类,只要将这些类放置在不同的保重,就不会产生冲突。
事实上,为了保证报名的绝对唯一性,只要用一个因特网域名的逆序的形式作为报名,然后对与不同的工程使用不同的子包。
类的导入,以导入Scanner
类为例的两种形式
import java.util.Scanner;
import java.util.*;
一种是单独导入一个类,另一种是导入该包下的所有的类(如果该包中还有其他的包,不到人这个包中的类,只导入当前包的所有类)
包的作用:
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
- 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
- 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
如果在当前包下的Java文件,最开始的时候必须使用package语句定义当前包。
back
for循环
java中,for循环有两种形式
一种是,如下
for(int i=0;i<n;i++){
...
}
这样的形式,是知道循环的次数或者说知道一个极限值
另一种,如下:
举例:
int[]ans=new int[10];
for(int i:ans){
...
}
这种可以用来依次处理数组(或者其它元素集合)中的每一个元素,而不用考虑指定下标值
for(variable:collection)
statement
上面定义了一个变量用于暂存集合中的每一个元素,并执行相应的语句(当然,也可以是语句块)。collection这一集合表达式必须是一个数组或者是一个实现了iterable接口的类对象。
back
转义字符
所有的ASCII码都可以用 \\
加数字(一般是8进制数字)来表示. Java语言中定义了一些字母前加""来表示特殊含义的字符, 如\\0,\\t,\\n等, 称为转义字符
如果在程序中,遇到\\
的时候,需要特别注意。
转义序列 | 名称 | Unicode值 |
---|---|---|
\\b | 退格 | \\u0008 |
\\t | 制表 | \\u0009 |
\\n | 换行 | \\u000a |
\\r | 回车 | \\u000d |
\\" | 双引号 | \\u0022 |
\\\' | 单引号 | \\u0027 |
\\\\ | 反斜杠 | \\u005c |
备注:
- 码点(Code Point):码点是指一个编码表中的某个字符对应的代码值。
- 代码单元(Code Unit):在具体编码形式中的最小单位。
back
参考《Java核心技术卷一》
如果转载,请转明出处,谢谢