知识点:
1. 当程序在JVM(java虚拟机中运行时),JVM会在内存中划分一块区域,各区域中内容的执行方式与类型都不同。内存区域划分如下:
寄存器:
- 寄存器给cpu用。
本地方法区:
- 调用系统底层内容。
方法区:
- 方法区也称为数据区、共享区、BSS。
- 存放静态变量,存放静态方法与数据的代码。
- 存放非静态方法与非静态数据的代码。
栈内存:
- 存储的都是局部变量。
- 栈中变量的所属的作用域一旦结束,该变量自动释放。
- 函数调用时会自动加载进入栈内存区。
堆内存:
- 存储的是数组和对象。
- 凡是new建立的全都存在堆里面。
- 堆里面存储实体,实体为是存多个数据的地方,堆会对里面的数据进行默认初始化。
- 每一个实体都有首地址。
- 堆内存中的每一个变量都有默认初始化值,根据类型的不同而进行不同的初始化。
- 将堆内存中存储实体的首地址给栈中函数的局部变量。
- Java中有自动内存回收机制,对比于java与c++,在c++中是程序员自己手动回收内存,避免内存泄露。在java中有自动内存回收机制,java内存管理优于c++。
2. 函数中只能调用函数不能定义函数。
3. 函数只有在被调用时才会加载进入内存,调用结束后会从内存中释放直到下一次调用才会被加载进入内存,函数被调用时会加载进入栈中。
4. 当程序中访问到数组中不存在的角标时,编译时编译器不会报错,只有当运行访问时才会报错。
5. 当引用变量没有任何实体指向时,还在用其操作实体就会发生异常。
6. 对一个引用进行进行打印操作时,打印出来的字符中含有@,在@左边是实体的类型,右边是实体的嘻哈置也就是内存中存放的地址。
7. 面向对象的优点:
- 符合现在人们思考的习惯。
- 让复杂的事情变得简单化。
- 让曾经的执行者变为现在的指挥者。
- exp1:项目主管一般可以自己单独解决项目中的所有问题,但是为了节省时间,就会去找一些专业编程的人也就是找具备这个能力的对象去完成这件事情,对于完成时间的过程不必管。
- exp2:在餐馆用餐,我们需要寻找一个具备点单,上菜,倒水的对象。我们不必管这些过程是怎么实现的,我们只需要找到一个具备这些能力的对象即可。这个对象也就是餐馆的服务员。
8. 类就是用来描述事物两个特点的:属性,行为。
9. 对象就是该类事物实实在在存在的个体。
10. 构造函数首字母一般大写,一般函数首字母小写,便于区分。
11. 用java语言对现实生活中的事物进行描述。通过类的形式来体现。怎么描述事物呢?对于事物描述通常只关注两方面。一个是属性,一个是行为。
12. 只要明确该事物的属性和行为并定义在类中即可。对象:其实就是该类事物实实在在存在的个体。
13. 类与对象之间的关系?类:事物的描述。对象:该事物的实例。在java中通过new来创建的。
14. 构造函数:构建创造对象时调用的函数。作用:可以给对象初始化。建对象必须要通过构造函数初始化。
15. 一个类中如果没有指定的构造函数,那么该类中会有一个默认的空参数的构造函数。如果类中定义了指定的构造函数,那么该类中的默认构造函数就没有了。
16. 一般函数跟构造函数有什么区别呢?
- 构造函数:对象创建时,就会调用与之对应的构造函数,对对象初始化。
- 一般函数:对象创建后,需要函数功能时才调用。
- 构造函数:对象创建时,会调用只调用一次。
- 一般函数:对象创建后,可以调用多次。
17. 什么时候定义构造函数呢?在描述事物时,该事物已存在就具备一些内容,这些内容都定义在构造函数当中。
18. 当局部变量和成员变量重名时,可以用this来区分。
- this代表对象,代表哪个对象呢?当前对象。
- this就是所在函数所属对象的引用。
- 简单说:哪个对象调用了this所在的函数,this就指这个对象。
18. static的特点:
- static是一个修饰符,用于修饰成员。
- static修饰的成员被所有的对象所共享。
- static优先于对象存在,因为static的成员随着类的加载就已经存在了。
- static修饰的成员多了一种调用方式,就可以直接被类名所调用。
- static修饰的数据是共享数据,对象中存储的数据是特殊数据。
- static变量是先于对象创建之前被加载的,所以静态方法中不能够有非静态变量,因为非静态变量只有等对象创建之后才能创建分配内存。
19. 成员变量和静态变量的区别:
两个变量的生命周期不一样。
- 成员变量随着对象的创建而存在,随着对象的回收而释放。
- 静态变量随着类的加载而存在,随着类的消失而消失。
调用方式不同。
- 成员变量只能被对象所调用。
- 静态变量可以被对象所调用,还可以被类名所调用。
别名不同。
- 成员变量也称为实例变量。
- 静态变量称为类变量。
数据存储位置不同。
- 成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。
- 静态变量数据存储在方法区的静态区,所以也叫对象的共享数据区。
20. 静态使用时的注意事项:
- 静态方法只能访问静态成员。(非静态既可以访问静态又可以访问非静态)。
- 静态方法中不可以使用this或者super关键字。
- 主函数是静态的。
21. 静态什么时候用:
静态变量
- 当分析对象中所具备成员变量的值都是相同的。
- 这时这个成员就可以被静态修饰。
- 只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。
- 如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的。
静态函数
- 函数是否用静态修饰,就考虑一点,就是该函数功能是否有访问到对象中的特有数据。
- 简单点说,从源代码看,该功能是否需要访问非静态成员变量,如果有需要,该功能就是非静态的。
- 如果不需要,就可以将该功能定义成静态的。
22. Java数据类型:
- 整型数据:byte 1字节、short 2字节、int 4字节、long 8字节。
- 浮点型数据:float 4字节、double 8字节。
- 字符型数据:char 2字节。
- 布尔型数据:boolean 1字节。
23. unicode为国际标准码表包含ASCII码表。
24. 关于数据类型面试易错题:
class Demo
{
public static void main(String[] args)
{
byte b=4;
byte b1=3;
byte b2=7;
b=b1+b2;
}
}
为什么以上代码编译时编译器会报错?
编译器报错为:
D:\Java_Code>javac Demo.java
Demo.java:31: 错误: 不兼容的类型: 从int转换到byte可能会有损失
b=b1+b2;
答:编译器会报错,由于b,b1,b2都是byte类型,在做加法时是byte=byte+byte。如果变量b1,b2的值较大的话产生的和在byte的变量中不一定能够装的下。因为编译器在执行加法时不知道变量b1,b2中的具体数值,为了避免产生的和超出byte类型的范围从而丢失精度所以编译器会报错。如果直接做b=3+7的话编译器不会报错,因为在做加法时编译器知道常量具体数值不会超出范围所以编译器不会报错。如果换成b=127+4呢?编译器会报错做加法时编译器知道这两个常量的和超出范围了所以报错了。总结一句:当右边是变量时编译器不确定其值会报错;当右边是常量是编译器根据其具体值执行。
如果将byte类型全部换成int类型数据呢?
class Demo
{
public static void main(String[] args)
{
int b=4;
int b1=3;
int b2=7;
b=b1+b2;
}
}
答:编译器是不会报错的因为int类型为计算机整数计算的默认类型,就算两个较大的int类型整数进行加法产生了溢出,溢出之后底层有强制转换保存其原有位数舍弃高位仍然以整型int类型数据表示,所以无论计算结果是什么int类型都能装的下编译器不会报错。
25. 当使用%进行取摸、取余运算时,运算结果的符号只参考被模数。并且浮点型数据也可以取模运算。
26. ~取反运算符将原数按位取反。数据在计算机中按补码存储,负数的补码为符号位不变其余各位取反加1。正数的补码是正数本身。在计算机中存储格式为11111111 11111111 11111111 11111011 这是-5,00000000 00000000 00000000 00000101 这是5。
27. 移位运算符:
- <<左移运算符,低位补0.
- >>右移运算符,高位按符号位补。
- >>>无符号右移无论最高位是什么都是高位补0。
28. 小端模式为数据的低位存放在内存的低地址当中。
29. 大端模式为数据的高位存放在内存的低地址当中。
30. 算数运算时数据的转换:
自动转换(隐式转换):自动转换发生在不同数据类型的变量混合运算时,由编译系统自动完成。
自动转换遵循以下规则:
1)若参与运算量的类型不同,则先转换成同一类型,然后进行运算
如输出2.3+1,会转换成浮点型进行计算
2)转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int型转换成long型,再做运算。
3)所有的浮点运算都是以双精度进行的,即使两个float单精度量运算的表达式,也要先转换成double型,再做运算。
4)char型和short型参与运算时,必须先转换成int型。
如输出'a'+1
5)在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换成左边量的类型。如果右边量的数据类型长度比左边长
时,将丢失一小部分数据,这样会降低精度。
如int a=2.3+1; int b=2.6+1;会直接省略小数点后面的数据。
强制类型转换(显式转换)由程序员自己编写。
为什么要进行强制类型转换?
如在团队中对接口的时候这边要求是int型,但是那边给的是double型,这样类型不一致,团队协调代价大,可采用强制类型转过来,也是为了编译通过。
其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
如:(float)a把a转换成浮点型;(int)(x+y)把x+y的结果转换成整型。
31. 写法规范:常量所有字母都大写,多个单词,中间用_连接。