java冷知识:jvm有很多种,其实jvm是一个标准,sun做的那个叫hotspot,作者就是后来v8的作者lars bak,其他公司也做过jvm,其中做得比较好的有bea的jrockit,其他的包括ibm的r9,apple的jvm等在内,都做得不行,所以jvm主要是整合淘汰掉这些做得不好的jvm(s),整合成一个统一的openjdk。
一、运算符
1.连接符
"+"符号:如果能计算就计算,不能计算就连接。
int i = 1;
"a" + i //结果返回"ai"字符串
'a' + i //结果返回98,因为这里的a是字符,字符在运算时是转换成ASCII值进行计算的
1 + i //结果返回2
1 + "" + i //结果返回"11",1+""后会转换成字符串类型,字符串+i还是字符串类型
1 + i + "" //结果返回"2",1+i=2,2与字符串连接转换成字符串型
2.自增自减运算符
int a = 5;
a++ 操作之后
a == 6 这是最基础的用法这里就不多赘述了
面试题
int a = 5;
int b = 5;
int c = ++a + b-- + ++b + a-- + --b - ++a - a--;
a、b、c的结果分别是多少?(手算 )
a == 5, b == 4, c == 14。
3.赋值运算符
最简单常用的赋值运算符就是 =,就像int a = 5,将5赋值给a。
扩展赋值运算符 +=、 -=、 *=、 /=。
扩展赋值运算符也是我们比较常用的,但是需要注意一点,扩展赋值运算符包含了强制类型的转换。
在之前我们讲过,在表达式中,表达式结果会返回表达式中出现范围最大的类型。
因此:
byte a = 1;
byte b = 2;
a =a + b; //这里是会报错的,byte类型会自动转换成int类型
a +=b; //这里不会报错,a += b等价于a = (byte)(a + b),会自动进行类型转换
4.逻辑运算符
& 与运算符 条件中有一个为假,返回结果为假
| 或运算符 条件中有一个为真,返回结果为真
! 非运算符 真变假,假变真
^ 异或运算符 条件相同为假,否则为真
&& 短路与 结果与&相同,左边为false则右边不执行
|| 短路或 结果与|相同,左边为true则右边不执行
二、面向对象——对象来喽
1.设计对象
首先想一下,类是什么?以及类和对象的关系是什么?
类:是对象共同特征的描述
对象:是真实存在的具体事事例
所以:在java中,必须先设计类,才能创建对象并使用
2.对象规范
1.类名首字母大学,满足驼峰规则,不能使用关键字,必须是合法标识符,而且有意义。
2.一个java文件中可以有多个class类,但是只有一个可以用public修饰,而且被修饰的类必须是代码文件名。
3.成员变量一般会有默认值
byte、short、int、long | 0 |
double | 0.0 |
boolean | false |
String | null |
3.对象的内存机制
学过jvm的同学应该知道,在jvm中有方法区,栈,堆。
那对象是如何执行的呢?
当我们想要执行一个类的时候,首先会将该类加载方法区中。里面包含了类的方法和变量等信息。
需要执行方法时,会将该方法生成栈帧压入栈中。当我们声明对象时,会在栈中开辟一部分区域,才存放对象地址。
当我们需要调用new方法去创建类的时候,会在堆内存中分配一定空间去存储该对象,对象中存有成员变量和方法。成员变量是默认值,但是为了节省空间,方法采用的引用地址,去指向方法区中的方法。
栈中声明的对象,存的便是堆中开辟的地址。
4.数据的封装
1.封装是什么?
告诉我们,如何正确设计对象属性和方法
封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为。
2.封装思想的好处?
让编程变得简单,降低学习成本。
3.如何体现封装性?
举例:
现在有两个类,一个是人,另一个是门。开门这个方法应该设计在人还是门的类里呢?
应该设计在门的类里,有些人可能会想,不是人主动开的门吗?为什么开门的方法会设计在门的类里?
我们可以这么理解,门有两个属性,一个是开,另一个是关。人开门走后,对人并没有影响,但是却改变了门的状态。
4.如何更好的封装?
一般会把成员变量用private隐藏起来,提供public修饰的get、set方法暴露其取值赋值。
5.标准的javaBean
1)成员变量private修饰
2)set、get方法public修饰
3)提供无参构造器
6.成员变量和局部变量的区别
区别 | 成员变量 | 局部变量 |
类中的位置不同 | 类中,方法外 | 常见于方法中 |
初始化值不同 | 有默认值,无序初始化 | 需要初始化,使用前需要赋值 |
内存的位置不同 | 堆内存 | 栈内存 |
声明周期不同 | 与对象的声明周期相同 | 与方法的声明周期相同 |
作用域 | 方法内 |