jvm与jdk,jre
jvm
jvm是java虚拟机,它是运行所有java程序的虚拟计算机
所有的java程序会首先被编译为.class类文件,这种类文件可以在虚拟机上运行
java预压能通过字节码的方式
在一定程度上解决了传统解释性语言执行效率的问题,同时又保留了解释型语言可移植的特点
所以java在运行时比较高效,而且字节码可以跨平台运行
jre
jre是java runtime environment(java运行环境)
光有jvm还不能让class文件执行,因为在解释class的时候jvm需要滴哦阿勇解释所需类的类库,而jvm和lib合起来就称为jre
jdk
jdk是java development kit(java开发工具包)
程序员偶java开发室所需要的一些工具 javac.exe java基础类库api
关系
jdk包含jre,jre包含jvm
标识符与关键字区别
标识符
在写代码时自己定义的很多名字,比如类名,方法名,变量名等
编程里面我们把为了增强阅读性而自定义的名称为标识符
关键字
在编程语言中有一些事先定义的,有特殊含义的单词
保留字:和关键字一样都是编程语言事先定义的好的,只是说暂时没有特殊性的用途,但以后某天可能会被突然赋予使用的意义,因此被保留下来的关键字,goto和const就是java保留的关键字
++和--写在前后有什么区别
++result表示对result加1之后的结果进行运算
result++表示对result变量加1之前的值进行运算
public class Main{
public static void main(String[] args) {
int a=1;
int b=2;
int c=(++a)+(b++)+b;
System.out.println(c);
System.out.println(b);
System.out.println(a);
}
}
结果
7 3 2
&和&&区别
&只要有一个为假,结果就为假无论我前面表达式是真是假 后面一个表达式都会执行
&&在执行时,只要发现为假,就不继续往前执行直接断定结果为false
| 只要有一个为真,结果就位真
||在执行时,只要发现为真,就不继续向后执行,直接就断定结果为真
左移右移
左移几位就是将数乘2的几次方
右移就是除以2的几次方
public class Main{
public static void main(String[] args) {
System.out.println(64<<1);
System.out.println(64>>2);
}
}
//结果128 64
break,contunue,return
break:退出当前的循环
contunue:跳过当前的循环,继续执行之后的循环
return:退出当前执行的方法,方法内的所有内容都不会去执行
输出100-1000之间的水仙花数
public class Main{
public static void main(String[] args) {
for (int i=100;i<1000;i++){
int bai = i/100;
int shi =(i/10)%10;
int ge =i%10;
if (bai*bai*bai+shi*shi*shi+ge*ge*ge==i){
System.out.println(i);
}
}
}
}
方法重载,重写
重载是让一个方法根据传入的参数的不同有多种实现,重写是用子类方法去覆盖父类的犯法
隐藏覆盖的区别和联系
java的引用变量有俩个类型,一个是编译时类型,一个是 运行时类型
编译时类型:由该变量时使用的类型决定
运行时类型:由该变量指向的对象类型决定
如果编译时类型和运行时类型不一致,会出现所谓的多态.因为子类型其实是一种特殊的父类型,因此java允许吧一个子类对象给直接赋值给一个父类引用变量,无需任何转换,或被称为向上转型,由系统自动完成
覆盖
子类重写父类方法要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同
覆盖是对于实例方法而言的
方法不能交叉覆盖:子类的实例方法不能覆盖父类的静态方法,子类的静态犯法也不能覆盖父类的实例方法
隐藏
父类和族类拥有相同妹子的属性或者方法(方法隐藏只有一种形式我,就是父类和子类存在相同静态方法的时候),父类的同名属性或者方法形式上的不见了,实际还是存在的.
隐藏是对于静态方法和成员变量而言的
- 当发生隐藏的时候,申明的是什么类型,就调用对于类的属性或者方法,而不会发生动态绑定
- 属性只能被隐藏,不能被覆盖
- 变量可以交叉隐藏:子类实例变量/静态变量可以隐藏父类的实例变量和 静态变量
区别
被隐藏的属性在子类被强制转换成父类之后,访问的是父类中的属性
在强制转换时子类要访问父类的属性使用super关键字
被覆盖的方法在子类被强制转换成父类之后调用的还是子类自身的方法,子类想要访问父类的方法可以使用super关键字
redis是单线程还是多线程
5.0之前是单线程,5.0之后是多线程的
数组静态初始化和动态初始化的区别
静态初始化
是在创建数组时,就已经确定了有多少个元素
并且把元素都放到了数组中
动态初始化
一开始不知道要存哪些数据,所以先定义一个指定大小的空间