2023.2.1 星期三
第一章 Idea基本使用技巧
Java文件快捷注释
特殊注释
TODO注释://TODO指待办事项或未完成的事项。
FIXME注释://FIXME指需要修改的地方。
快捷键
有关ctrl的快捷键操作
* ctrl + c 赋值
* ctrl + v 粘贴
* ctrl + x 剪切 (大剪切术 ctrl + ...a , x , s , v , s)
* ctrl + a 全选
* ctrl + f 搜索 在本类中搜索替换
* ctrl + z 撤销
* ctrl + y 前进
* ctrl + o 展示类结构信息,查找方式非常给力
* ctrl + alt + ⬇ (快捷复制某一行代码)
* ctrl + alt + t 判断异常的快捷处理
其余快捷键操作
* 双击shift 全局搜索
* alt + 回车 快捷补全(光标一定在补全代码的结尾)
* alt + ⬆/⬇ (快捷移动某一行代码)
* shift + alt + m 快捷拆分方法
第二章 常量 变量 标识符 数据类型
标识符
* 标识符 - 起名字 : 类、接口、方法、变量、常量
* 类、接口 : 大驼峰规则 (首字母大写、之后的单词首字母都大写)
* 变量、方法: 小驼峰规则 (第一个单词的首字母小写)
* 常量 - 静态常量 : 所有字母都大写,多个单词使用下划线拼接
* 包:全部小写(不允许关键字,多个层级使用“.”连接)
常量
* 符号常量 + 字面量常量
* //符号常量
public static final int MONEY = 100;
final double max = 9.9;
* //字面量常量
System.out.println(100);
int i = 50 * 40; //50 和 40 都属于字面量常量 ,i 是变量
* 基本数据类型 + 引用数据类型
* //基本数据类型
System.out.println(100);
System.out.println(100.1);
System.out.println();
System.out.println(true);
*//引用数据类型
System.out.println("今天天气真的太冷了");
变量
* 变量 - 和常量相比,变量的值是在运行期间也是能够改变的,没有final修饰。
* 全局变量: 定义在方法外的变量,整个类中都可以使用到这个变量。
* int x = 60; //全局变量
static int y = 80; //全局变量
* x 和 y都是全局变量,因为定义在类中且声明在方法外 , 区别在于x是非静态的 y 是静态的。
* 加载时机和引用方式:
* x 是一个非静态的全局变量,初始化的时机是当前S02这个类被创建成对象的时候才会实例化并且数据存储在堆内存中。
* S02 xx = new S02();所以:这个x只有非静态的方法可以使用,因为静态的方法是在类加载到方法区之后就可以直接调用,而非静态的全局变量
* 此时还没有被初始化,可以理解为不在一个线上。
*
* y 是一个静态的全局变量,和静态方法一样,在类加载到方法区的时候就被初始化了,初始化的地点同样也在方法区中,
* 因为时机一样,静态方法是可以直接引用静态全局变量的。
* 局部变量:定义在方法内的变量 ,只在当前定义的方法中才能使用。
* int m = 10; //局部变量
//static int n = 20; //静态的局部变量(出错)
*m 因为定义在方法中,所以m是一个局部变量,因为在方法中定义,方法执行变量有效,方法执行完成这个变量没意义,所以JDK设计的
*时候就将局部变量存储在栈内存中跟着方法的生命周期。
*
*n这行报错误了, 因为JDK在设计的时候就是将局部变量存储在栈内存中,这里一旦添加了static 表示又想将n存储在方法区,两者是冲突的
*并且静态局部变量和非静态的方法本身加载时机就不一致,所以这样定义是不合发的。
Exercise
static int sum = 33;
public static void mainrr(String[] args) {
int sum = 65;
// 为什么输出的是65?
System.out.println(sum);
// 在全局变量和局部变量重名的时候,之所以可以定义是因为全局的sum存在方法区中,局部的sum存在占内存中,位置不一样不影响。
// 就近原则
}
数据类型
数据类型分为 基本数据类型 和 引用数据类型 。
*
* 基本数据类型:8种
* byte 1 short 2 int 4(字面量默认)
* long 8 float 4 double 8(字面量默认)
* char 2 boolean*
*
* 转化:
* 如果同类型之间转化(整数类型或浮点类型)
* 如果是小类型向大类转化,直接使用大类型接收就可以,自动向上转型。
* 如果是大类型向小类型转化,需要(小类型)转化,强制向下转型(注意:有可能损失数据)
public static void mainx1(String[] args) {
long l = 40000; //此时这里就是典型的自动向上转型
long l2 = 40000L;
short s = 5000; //理论上讲这里应该会发生一次强制向下转型,但是因为Java在设计的时候考虑到了每次定义都需要
//强制转化比较麻烦,所以Java直接控制了值得范围,只要不超过short范围就可以直接定义,超出了在按照默认int处理发生强制转型。
}
* 不同类之间的转化:
* 整数转浮点:所以的整数类型无论是哪个一个,只要是转浮点类型都会默认直接转化。
* 浮点转整数:不管是小类型,一概都需要强制转化(损失精度)。
*
*
*
* 引用数据类型:
* String Scanner Random 数组 集合
* 区别:基本数据类型是直接书写就可以使用,而引用数据类型是需要实例化的。
* Scanner sc = new Scanner();
* Random r = new Random();
* public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str2 = new String("哈哈");
String str2 = "嘿嘿";
}
*
Exercise
**
* String类型比其他的引用类型更特殊,String这个类是使用final修饰的。这就意味着这个类不能被继承,同时类中的方法
* 也不能被重写,并且String定义的值虽然没有看见final 但是依然是常量。
*
* String s1 = "哈哈";
* String s2 = s1 + "嘿嘿";
*
* 3个 哈哈 、 嘿嘿 、 哈哈嘿嘿 , 之所是3个是因为字符串的定义是不可变的字符序列,一旦定义值不能改变(final)
*
* 为什么要将String定义成final ?
* 如果String类不是final 那么就可以被继承,也就意味着子类中可以重写父类的方法, 而String又是Java最基本的一个引用数据类型,
* 一旦方法被重写,运行的时候就意味着我们可以人为的控制JVM的核心代码,那么JDK的安全性无法保障,项目安全性更无法保障,这就相当于
* 在Java随时可以植入一个病毒,太可怕了。
*
* 典型的牺牲了性能解决了安全性问题,JDK1.0之后,为了能够将String进一步优化,退出了一个新的类,StringBuffer 1.0 和 StringBuilder1.5
*
第三章 Java运算 算数 比较 赋值 逻辑 三元
算数
/**
* 算数运算符 + - * / % ++ --
* ++ 自增运算 + 1
* -- =自减运算 - 1
*/
public static void main1(String[] args) {
int i = 10;
i = i++ + i++ - --i;
--i;
System.out.println(i); //9
}
比较
/**
* 比较运算符 >= <= > < = != == 结果:boolean
*/
public static void main2(String[] args) {
int m = 10;
int n = 5;
System.out.println(m > n);
System.out.println(m < n);
System.out.println(m >= n);
System.out.println(m <= n);
System.out.println(m == n);
System.out.println(m != n);
}
赋值
/**
* 赋值运算符 = += -= *= /= %=
*/
public static void main3(String[] args) {
int m = 6;
System.out.println(m += 5); // m = m + 5;
System.out.println(m %= 3); // m = m % 3;
}
逻辑
/**
* 逻辑运算符 & | ! ^ && ||
* & 全真为真 一假则假
* | 一真为真 全假则假
* ! 结果取反
* ^ 同假异真
*/
public static void main4(String[] args) {
int w = 14;
int s = 7;
System.out.println(w > 2 & s >3);
System.out.println(!(w > 2));
//System.out.println(w ^ s);
System.out.println(w > 2 ^ s >3);
//将w 和 s 的值互换
w = w ^ s;
s = w ^ s;
w = w ^ s;
System.out.println("w = "+ w + "s = " + s );
/**
* 短路&& 短路|| 结果和& | 相同。
* 不同:&& 运算中,运算符左边如果为假,右边不执行。 一假则假
* || 运算中,运算符左边如果为真,右边不执行。 一真则真。
*/
}
三元
/**
* 三元运算: 布尔表达式 ? 结果1 : 结果2
*/
public static void main(String[] args) {
double score = 59.999;
System.out.println(score >= 60 ? "通关":"不及格");
System.out.println(score < 60 ? "不及格":"通关");
}
}