JVM、JRE、JDK
Jvm就是一个虚拟的用于执行bytecode字节码的“虚拟计算机”。它也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。Jvm负责将java字节码解释运行。
JRE:Java的运行环境。包含java虚拟机、库函数、运行Java应用程序所必须的文件。
JDK:Java的软件开发工具包。包含jre,以及增加编译器和调试器等用于程序开发的文件。
环境变量Path的配置
注:classpath配置问题:如果使用jdk1.5以上就不需要配置这个环境变量,jre会自动搜索当前路径下的类文件及相关的jar文件
常用的DOS命令
标识符的使用规范
- 标识符必须以字母、下划线、$开头。其它部分可以有数字的任意组合
- 标识符不可以是java的关键字
- 表示类名的标识符每个单词的首字母大写 如:GodMan
- 表示方法和变量的标识符,第一个单词小写,第二个单词起每个单词的首字母大写(驼峰原则)。如:addOrder( );
- 常量用大写字母和下划线。用final来定义一个常量 初始定义后不能再改变其值 。如:MAX_VALUE 、final double PI = 3.14.
变量
局部变量
方法或语句块内部定义的变量。生命周期是从声明位置开始到方法或语句快执行结束。局部变量使用前必须先声明、初始化再使用。
成员变量
方法外部、类的内部定义的变量。从属对象,生命周期便随对象始终。它会自动初始化成该类型的默认初始值。
静态变量
使用static定义,从属类,生命周期伴随类始终,从类加载到卸载。
数据类型分类:
Java中基本数据类型都是值传递,传递的是值得副本,形参的改变不会影响实际参数的值;引用传递传递的是引用类型数据,包括String,数组,列表, map,类对象等类型,形参与实参指向的是同一内存地址,因此形参改变会影响实参的值
八进制数:要求以0开头,如:015
十六进制数:要求以0x或0X开头,如:0x15
二进制数:要求以0b或0B开头,如:0b0101110
浮点数是不精确的,一定不要用于比较!如果要使用精确浮点运算,使用math包下的BigDecimal
字符型变量/常量
字符型在内存中占2个字节,在java中使用单引号来表示字符型常量。
Boolean类型
Boolean类型有两个常量,true、false,在内存中占一个位
逻辑运算符
异或运算(^)
以二进制数据为基础进行运算。先转换成二进制数据后,再进行运算。异域中同位如果值相同则为0,不同为1
字符串连接符
+ 运算符两侧只要有一个是字符串型,系统就会自动把另一个操作数转换为字符串后连接。
强制类型转换
运算符“()”中的type表示将值var想要转换成的目标数据类型。
double x = 3.14;
int nx = (int)x; //值为3
char c = 'a';
int d = c+1;
System.out.println(nx);
System.out.println(d);
System.out.println((char)d);
方法
用来完成特定功能的代码段,方法是类和对象行为特征的抽象,**方法从属于类和对象**。
public class Test20 {
/** main方法:程序的入口 */
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
//调用求和的方法:将num1与num2的值传给add方法中的n1与n2
// 求完和后将结果返回,用sum接收结果
int sum = add(num1, num2);
System.out.println("sum = " + sum);//输出:sum = 30
//调用打印的方法:该方法没有返回值
print();
}
/** 求和的方法 */
public static int add(int n1, int n2) {
int sum = n1 + n2;
return sum;//使用return返回计算的结果
}
/** 打印的方法 */
public static void print() {
System.out.println("北京尚学堂...");
}
}
静态方法调用非静态方法
静态方法不能直接调用非静态方法。但传递一个对象的引用到静态方法里,通过这个引用,可以调用非静态方法和访问非静态数据成员了
public class test {
int i=1;
static void add(test t) {
System.out.println("静态方法");
t.add();
}
void add(){
System.out.println("非静态方法add"+i);
}
public static void main(String[] args) {
test t = new test();
add(t);
}
}
重写
发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为private则子类就不能重写该方法
重载
方法的重载是指一个类中可以定义多个方法名相同,但参数不同(类型、顺序、个数)的方法。方法返回值和访问修饰符可以不同。 调用时,会根据不同的参数自动匹配对应的方法。
//编译错误,返回值不同不是重载
public int add(int a,String b)
public String add(int a,String b)
public class Test21 {
public static void main(String[] args) {
System.out.println(add(3, 5));// 8
System.out.println(add(3, 5, 10));// 18
System.out.println(add(3.0, 5));// 8.0
System.out.println(add(3, 5.0));// 8.0
System.out.println();// 0个参数
System.out.println(1);// 参数是1个int
System.out.println(3.0);// 参数是1个double
}
/** 求和的方法 */
public static int add(int n1, int n2) {
int sum = n1 + n2;
return sum;
}
// 方法名相同,参数个数不同,构成重载
public static int add(int n1, int n2, int n3) {
int sum = n1 + n2 + n3;
return sum;
}
// 方法名相同,参数类型不同,构成重载
public static double add(double n1, int n2) {
double sum = n1 + n2;
return sum;
}
// 方法名相同,参数顺序不同,构成重载
public static double add(int n1, double n2) {
double sum = n1 + n2;
return sum;
}
//编译错误:只有返回值不同,不构成方法的重载
public static double add(int n1, int n2) {
double sum = n1 + n2;
return sum;
}
//编译错误:只有参数名称不同,不构成方法的重载
public static int add(int n2, int n1) {
double sum = n1 + n2;
return sum;
}
}
toString()方法
重写toString方法后会使哈希码能够打印出来
是因为调用了out.print()方法
仔细看源代码,在PringStream类中,print方法是这样写的
此时调用了String的静态方法valueof
这个方法是这样的
这里调用了toString方法
而所有的java对象都派生自Object,如果没有对该方法做重写
则会调用super.toString()
Object中这个方法是这样定义的
所以打印结果为classname+@hashcode 是对象的存储地址
当重写了toString方法后,根据java的动态绑定原理,调用的为当前对象的toString()方法,所以当你重写了student的toString方法后,打印结果是自己重写的方法
快捷键
CTRL + D 删除当前行
CTRL + Alt+ 上下方向键向上/下 复制当前行
ALT + 上下方向键向上/下 替换行
ALT + SHIFT + 上下方向键向上/下快速选择
CTRL + T 显示当前类继承关系列表
Ctrl + Shift + [ 代码区分屏
Ctrl + pageup/pagedn 代码区切换
Ctrl + M 窗口最大化
Shift +table 代码向左缩进
ALT + SHIFT +R 重构变量
IDEA
shift+alt 多行编辑
Ctrl + Shift +y 大小写转换
Ctrl + Shift +f 代码格式化
alt+enter 生成变量返回值
alt+insert 生成构造器/get set等
CTRL+ALT+T try-catch
CTRL+ALT+O 去除无效包