Java 基础
Java 基础2
标识符
在我阅读的资料里面说java标识符是由字母,数字,下划线( _ ) 和 美元符号($)组成的,但是数字不能开头 , 也不能是Java 关键字 .
但是我实测的时候发现中文以及¥是可行的
public class Test {
public static void main(String[] args) {
String 王者¥ = "荣耀";
System.out.println(王者¥);
}
}
结果输出
但是为了规范,建议(可以阅读阿里巴巴Java开发手册)
- 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
- 所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
关键字
稍微介绍一下其中的几个
-
assert 断言 (详情请见文章末尾的资料参考链接)
- 首先设置开启断言功能 (添加如图红框标记的东西,为什么在这里添加,到后面关于JVM的知识会谈及)
- 程序
public class Test{ public static void main(String[] args) { boolean isSafe = false; assert isSafe; System.out.println("断言通过"); } }
- 观察结果,分析异常,说是断言失败,就是你假设的条件不符合,程序不能继续运行
- 首先设置开启断言功能 (添加如图红框标记的东西,为什么在这里添加,到后面关于JVM的知识会谈及)
-
const : 保留,暂无实际意义
-
goto : 保留, 暂无实际意义
-
transient :序列化使用
public class Test{
public static void main(String[] args) {
Person person = new Person("张三", 14);
try {
serialize(person);
deserilize();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void serialize(Person person) throws Exception{
File file =new File("E:\\test.txt");
if(!file.exists()) {
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(person);
oos.writeObject("hello,world");
// 可以只关闭处理流, 不关闭节点流
if(oos != null) {
oos.close();
}
}
public static void deserilize() throws Exception {
File file = new File("E:\\test.txt");
if(!file.exists()) {
System.out.println("文件不存在,程序退出");
System.exit(0);
}
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Person person = (Person)ois.readObject();
System.out.println(person);
String str = (String)ois.readObject();
System.out.println(str);
if(ois != null) {
ois.close();
}
}
}
class Person implements Serializable {
private String name;
// 有时候,直接问一个女性的年龄是不礼貌的,所以我们不将这个字段序列化了^。
// 指定不序列化的字段以初始值显示
private transient int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
结果输出 : age属性没有被序列化
- enum 枚举类型 (详情请见文章末尾的参考资料链接)
- instanceof (详情请见文章末尾的参考资料链接)
- 语法 obj instance of
- 要注意的
- obj 必须是引用类型,不能是基本数据类型 (编译不通过)
- obj 为 null ,instanceof 任何类 返回false
- native 用在方法上面,标明这是一个本地方法,会调用底层C代码
- strictfp 用在方法或者类或者接口上面,保证平台移植过后,浮点数计算结果都是一样的。(详情请见文章末尾的参考资料链接)
- synchronized 同步 ,通常用于多线程中,充当锁的作用
- voliatile 同上,但是只有可见性,没有原子性。
数据类型
分为基本数据类型和引用数据类型
- 基本数据类型有8种。其中的自动类型转换为(低精度转换为高精度,整型转换为浮点型)
- 引用数据类型有数组,类,接口
变量
变量遵循“先定义, 后使用”的原则,在使用变量之前必须定义变量。
而且在定义变量后,在使用之前必须为它赋值。成员变量会在对象被创建的时候赋予默认初始值。局部变量,就必须赋值后才能使用。
测试代码
package com.company;
import java.io.*;
public class Test {
public static void main(String[] args) {
// 定义了一个局部变量
int i;
// 没有赋值就使用了
System.out.println(i);
}
}
class Person {
public int age;
public String name;
}
运行结果
变量测试代码2
package com.company;
import java.io.*;
public class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.age);
System.out.println(person.name);
}
}
class Person {
// 这里为了便于访问,设置成为了public类型,通常时候还是要设置为private
public int age;
public String name;
}
结果输出:
数据类型转换
通常基本数据类型像上面给出的那副图样转换。
也还有会自动类型转换的范例
代码演示
public class Test {
public static void main(String[] args) {
// 这里 1 也是int类型的, <= 127 可以照常赋值,> 127 会报错
byte a = 1, b = 2;
// 在进行表达式求值时, java会将byte类型, short类型, char类型操作数据提升为int型
// 会自动进行类型转换 等同于 a = (byte)(a + b) , 但是 a = a + b 不会进行自动类型转换
a += b;
System.out.println(a);
}
}
数据的标准输入、输出
数据的输入
- 标准输入流 System.in
- 对于从键盘输入数据,一般使用Scanner类来实现
- 由于Scanner的缓冲机制和截取字符的特性,在程序中要同时输入String类型和数值类型时,最好定义两个Scanner对象,一个接收String 型数据,一个接收数值型数据。否则得出来的值可能不正确。
数据的输出
- 标准输出流 System.out
System.out.println() 方法 :System 大写,一个类,out 小写,静态成员变量,是PrintStream类型的,里面有个方法叫做println()
运算符
这里记住优先级就好了。
单目运算符 > 多目运算符
算数运算符( + 、-、 *、 / ) > 关系运算符 (> 、 < 、== ) > 位运算符 ( &、 | 、 ^ 、 << 、 >> ) > 逻辑运算符 (&& 、|| 、!)> 赋值运算符(=) > 逗号
拓展:
& 和 && 的关系
- & 为 位运算符的时候,为按位与,同为1为1 。
- 为 关系运算符的时候,与&& 相同。
- 不过 & 是 非短路逻辑运算符,&& 为 短路逻辑运算符
- 非短路逻辑运算符 就是 两边的真假性 都会判断
- 短路逻辑运算符 就是 得出一个为错误的时候,另外一个无需判断正确性了(因为 任何值 && 一个 错误的条件 为 false),当然得到为true的条件还要判断另外一个条件的真值,因为还得不出整个条件表达式的真值性。
- 比如说(3 > 4 && 2 != 0) 这个条件
- 首先 3 > 4 这个条件是错误,与上任何值这个表达式都是错误的
- 短路逻辑运算符 就不会判断 2 != 0 这个条件了,因为是为错误的
- 非短路逻辑运算符 会判断 2 != 0 这个条件。
代码忘添注释了,多多海涵!
资料参考 :
assert 断言
enum 枚举
enum_枚举2
instanceof
strictfp