@@ -376,6 +376,8 @@ Java面向对象的基本思想之一是封装细节并且公开接口。Java语
376376
377377
378378
379+ ##
380+
379381
380382
381383# 二、面向对象
@@ -384,7 +386,7 @@ Java面向对象的基本思想之一是封装细节并且公开接口。Java语
384386
385387- ** Java的四个基本特性**
386388 - ** 抽象** :抽象是将一类对象的共同特征总结出来构造类的过程,包括<u >数据抽象</u >和<u >行为抽象</u >两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
387- - ## ** 继承** :继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
389+ - ** 继承** :继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
388390 - ** 封装** :通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。
389391 - ** 多态** :多态性是指允许不同子类型的对象对同一消息作出不同的响应。
390392- ** 多态的理解(多态的实现方式)**
@@ -1154,7 +1156,7 @@ strictfp 关键字可应用于类、接口或方法。使用 strictfp 关键字
11541156 - ** 装箱** :从<u >基本数据类型</u >到<u >封装类型</u >叫做装箱
11551157 - ** 拆箱** :从<u >封装类型</u >到<u >基本数据类型</u >叫拆箱
11561158
1157- ```
1159+ ``` java
11581160jdk 1.5
11591161public class TestDemo {
11601162 public static void main (String [] args ) {
@@ -1166,7 +1168,7 @@ public class TestDemo {
11661168
11671169 上面的代码在jdk1.4以后的版本都不会报错,它实现了自动拆装箱的功能,如果是jdk1.4,就得这样写了
11681170
1169- ```
1171+ ``` java
11701172jdk 1.4
11711173public class TestDemo {
11721174 public static void main (String [] args ) {
@@ -1178,7 +1180,7 @@ public class TestDemo {
11781180
11791181
11801182
1181- ## 2. 缓存池
1183+ ## 2. ValueOf缓存池
11821184
11831185` new Integer(123) ` 与` Integer.valueOf(123) ` 的区别在于,new Integer(123) 每次都会新建一个对象,而 Integer.valueOf(123) 可能会使用缓存对象,因此多次使用 Integer.valueOf(123) 会取得同一个对象的引用。
11841186
@@ -1253,10 +1255,201 @@ Java 还将一些其它基本类型的值放在缓冲池中,包含以下这些
12531255
12541256因此在使用这些基本类型对应的包装类型时,就可以直接使用缓冲池中的对象。
12551257
1256- [ StackOverflow : Differences between new Integer(123), Integer.valueOf(123) and just 123
1257- ] ( https://stackoverflow.com/questions/9030817/differences-between-new-integer123-integer-valueof123-and-just-123 )
1258+ [ StackOverflow : Differences between new Integer(123), Integer.valueOf(123) and just 123] ( https://stackoverflow.com/questions/9030817/differences-between-new-integer123-integer-valueof123-and-just-123 )
1259+
1260+
1261+
1262+ ## 3. i++和++i有什么区别【B97】
1263+
1264+ i++是在程序执行完毕后进行自增,而++i是在程序开始执行前进行自增。
1265+
1266+ ** i++的操作分三步**
1267+
1268+ 1 . 栈中取出i
1269+ 2 . i自增1
1270+ 3 . 将i存到栈
1271+
1272+ 所以i++不是原子操作,上面的三个步骤中任何一个步骤同时操作,都可能导致i的值不正确自增
1273+
1274+ ** ++i**
1275+
1276+ 在多核的机器上,cpu在读取内存i时也会可能发生同时读取到同一值,这就导致两次自增,实际只增加了一次。
1277+
1278+ i++和++i都不是原子操作
1279+
1280+
1281+
1282+ ** 原子性,** 指的是一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程打断。
1283+
1284+
1285+
1286+ ## 4. 位运算符
1287+
1288+ Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
1289+
1290+ 下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13
1291+
1292+ A:0011 1100
1293+
1294+ B:0000 1101
1295+
1296+ | 操作符 | 描述 | 例子 |
1297+ | ------ | ------------------------------------------------------------ | ---------------------------- |
1298+ | & | 如果相对应位都是1,则结果为1,否则为0 | (A&B)得到12,即0000 1100 |
1299+ | \| | 如果相对应位都是0,则结果为0,否则为1 | (A\| B)得到61,即 0011 1101 |
1300+ | ^ | 如果相对应位值相同,则结果为0,否则为1 | (A^B)得到49,即 0011 0001 |
1301+ | 〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
1302+ | << | 按位左移运算符。左操作数按位左移右操作数指定的位数。左移n位表示原来的值乘2<sup >n<sup >,左移一位乘2 | A << 2得到240,即 1111 0000 |
1303+ | >> | 有符号右移,按位右移运算符。左操作数按位右移右操作数指定的位数。右移一位除2 | A >> 2得到15即 1111 |
1304+ | >>> | 无符号右移,按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
1305+
12581306
1259- ## 3. ++i和i++有什么区别
1307+
1308+ ## 5. 原码、补码、反码是什么
1309+
1310+ ### 机器数
1311+
1312+ 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
1313+
1314+ 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011 就是机器数。
1315+
1316+ ### 真值
1317+
1318+ 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
1319+
1320+ 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
1321+
1322+ ### 原码
1323+
1324+ 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
1325+
1326+ [ +1] 原 = 0000 0001
1327+
1328+ [ -1] 原 = 1000 0001
1329+
1330+ 第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
1331+
1332+ [ 1111 1111 , 0111 1111] ,即:
1333+
1334+ [ -127 , 127]
1335+
1336+ 原码是人脑最容易理解和计算的表示方式.
1337+
1338+ ### 反码
1339+
1340+ 反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上, ** 符号位不变,其余各个位取反** 。
1341+
1342+ [ +1] = [ 00000001] 原 = [ 00000001] 反
1343+
1344+ [ -1] = [ 10000001] 原 = [ 11111110] 反
1345+
1346+ 可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算。
1347+
1348+ ### 补码
1349+
1350+ 补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
1351+
1352+ [ +1] = [ 00000001] 原 = [ 00000001] 反 = [ 00000001] 补
1353+
1354+ [ -1] = [ 10000001] 原 = [ 11111110] 反 = [ 11111111] 补
1355+
1356+ 对于负数, 补码表示方式也是人脑无法直观看出其数值的。 通常也需要转换成原码在计算其数值。
1357+
1358+
1359+
1360+ 参考资料:
1361+
1362+ - [ 原码, 反码, 补码 详解 - ziqiu.zhang - 博客园] ( http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html )
1363+
1364+
1365+
1366+ ## 6. 不用额外变量交换两个整数的值
1367+
1368+ 如果给定整数a和b,用以下三行代码即可交换a和b的值
1369+
1370+ ```
1371+ a = a ^ b;
1372+ b = a ^ b;
1373+ a = a ^ b;
1374+ ```
1375+
1376+ - 假设a异或b的结果记为c,** c就是a整数位信息和b整数位信息的所有不同信息** 。比如:a=4=100,b=3=011,ab=c=111
1377+ - a异或c的结果就是b,比如:a=4=100,c=111,a^c=011=3=b
1378+ - b异或c的结果就是a,比如:b=3=011,c=111,b^c=100=4=a
1379+
1380+ 说明:位运算的题目基本上都带有靠经验积累才会做的特征,也就是准备阶段需要做足够多的题,面试时才会有良好的感觉。
1381+
1382+
1383+
1384+ ## 7. 不使用运算符进行a+b操作
1385+
1386+ - a^b; 得到不含进位之和
1387+ - (a&b)<<1; 进位
1388+ - 只要进位不为零,则迭代;否则返回
1389+
1390+ ``` java
1391+ public class Solution {
1392+ /*
1393+ * @param : An integer
1394+ * @param : An integer
1395+ * @return: The sum of a and b
1396+ */
1397+ public int aplusb (int a , int b ) {
1398+
1399+ int sum_without_carry, carry;
1400+ sum_without_carry = a^ b; // 没有进位的和
1401+ carry = (a& b)<< 1 ; // 进位
1402+ if (carry== 0 )
1403+ return sum_without_carry;
1404+ else
1405+ return aplusb(sum_without_carry, carry);
1406+ }
1407+ };
1408+ ```
1409+
1410+
1411+
1412+ ## 8. &和&& 、|和||的区别?【阿里实习生面试】
1413+
1414+
1415+ (1)&&和&都是表示与,区别是&&只要第一个条件不满足,后面条件就不再判断。而&要对所有的条件都进行判断。
1416+
1417+ ``` java
1418+ // 例如:
1419+ public static void main(String [] args) {
1420+ if ((23 != 23 )&& (100 / 0 == 0 )){
1421+ System . out. println(" 运算没有问题。" );
1422+ }else {
1423+ System . out. println(" 没有报错" );
1424+ }
1425+ }
1426+ // 输出的是“没有报错”。而将&&改为&就会如下错误:
1427+ // Exception in thread "main" java.lang.ArithmeticException: / by zero
1428+ ```
1429+
1430+ - 原因:
1431+ - &&时判断第一个条件为false,后面的100/0==0这个条件就没有进行判断。
1432+
1433+ - &时要对所有的条件进行判断,所以会对后面的条件进行判断,所以会报错。
1434+
1435+
1436+
1437+ (2)||和|都是表示“或”,区别是||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断。 看下面的程序:
1438+
1439+ ``` java
1440+ public static void main(String [] args) {
1441+ if ((23 == 23 )|| (100 / 0 == 0 )){
1442+ System . out. println(" 运算没有问题。" );
1443+ }else {
1444+ System . out. println(" 没有报错" );
1445+ }
1446+ }
1447+ // 此时输出“运算没有问题”。若将||改为|则会报错。
1448+ ```
1449+
1450+ - 原因
1451+ - ||判断第一个条件为true,后面的条件就没有进行判断就执行了括号中的代码
1452+ - 而|要对所有的条件进行判断, 所以会报错
12601453
12611454
12621455
@@ -1304,11 +1497,40 @@ Java 还将一些其它基本类型的值放在缓冲池中,包含以下这些
13041497
13051498
13061499
1307- ## 4. 字符串字面量
1500+ ## 4. 字面量
1501+
1502+ 在编程语言中,字面量(literal)指的是在源代码中直接表示的一个固定的值。
13081503
1504+ 八进制是用在整数字面量之前添加“0”来表示的。
13091505
1506+ 十六进制用在整数字面量之前添加“0x”或者“0X”来表示的
13101507
1508+ Java 7中新增了二进制:用在整数字面量之前添加“0b”或者“0B”来表示的。
13111509
1510+ ** 在数值字面量中使用下划线**
1511+ 在Java7中,数值字面量,不管是证书还是浮点数都允许在数字之间插入任意多个下划线。并且不会对数值产生影响,目的是方便阅读,规则只能在数字之间使用。
1512+
1513+ ``` java
1514+ public class BinaryIntegralLiteral {
1515+ public static void main (String [] args ) {
1516+ System . out. println(0b010101 );
1517+ System . out. println(0B010101 );
1518+ System . out. println(0x15A );
1519+ System . out. println(0X15A );
1520+ System . out. println(077 );
1521+ System . out. println(5_000 );
1522+ /**
1523+ * 输出结果
1524+ * 21
1525+ * 21
1526+ * 346
1527+ * 346
1528+ * 63
1529+ * 5000
1530+ */
1531+ }
1532+ }
1533+ ```
13121534
13131535
13141536
@@ -1336,9 +1558,11 @@ Java 还将一些其它基本类型的值放在缓冲池中,包含以下这些
13361558
13371559
13381560
1561+
1562+
13391563# 七、Object 通用方法
13401564
1341- ## 1. 概述
1565+ ## 概述
13421566
13431567``` java
13441568public final native Class<?> getClass()
@@ -1589,10 +1813,6 @@ public class CloneExample implements Cloneable {
15891813
15901814
15911815
1592- ## &和&& 、|和||的区别?【阿里实习生面试】
1593-
1594-
1595-
15961816
15971817
15981818
0 commit comments