笔试知识点

记录一些知识点

常用的排序算法

mN3vFO.png

经常用到的类

img

try中return和finally谁先执行

先来看一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class Test {
public static void main(String[] args) {
System.out.println(beforeFinally());
}

public static int beforeFinally(){
int a = 0;
try{
a = 1;
return a;
}finally{
a = 2;
}
}
}
/**output:
1
*/

从结果上看,貌似finally 里的语句是在return 之后执行的,其实不然,实际上finally 里的语句是在在return 之前执行的。那么问题来了,既然是在之前执行,那为什么a 的值没有被覆盖了?
实际过程是这样的:当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序, 在执行a = 2时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。

再来看一个例子,稍微改下上面的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public abstract class Test {
public static void main(String[] args) {
System.out.println(beforeFinally());
}
public static int beforeFinally(){
int a = 0 ;
try{
a = 1;
return a;
}finally{
a = 2;
return a;
}
}
}
/**output:2*/

在这里,finally{}里也有一个return,那么在执行这个return时,就会更新临时栈中的值。同样,在执行完finally之后,就会通知主程序请求返回了,即将临时栈中的值取出来返回。故返回值是2.

类访问权限

protected 在同一个包下是可以访问的

mBsGnA.png

作用域 当前类 同一package 子孙类 其他package
public
friendly ×

没有时默认为friendly,如构造函数等~

调用构造方法

1.new语句创建对象

2.Java反射机制

运算符优先级

一趟结束后能够确定一个元素的最终位置的排序方法有: 简单选择排序、快速排序、冒泡排序、堆排序

物理层:中继器、集线器

数据链路层:网桥、交换器

网络层:路由器

网络层以上:网关

接口和抽象类区别

mROiGj.png

这是初学者经常会遇到的问题,看到这个问题,自己想起来以前痛苦的学习过程。简单的回答一下。接口和抽象类之间有没有区别?可以肯定的回答:有区别。那既然有区别,我们不妨带着疑问去探索一下,语言设计者们在设计接口和抽象类时为什么要设计出区别,他们的目的何在。编程语言的设计其实也是一门哲学。

首先接口和抽象类的设计目的就是不一样的。接口是对动作的抽象,而抽象类是对根源的抽象。对于抽象类,比如男人,女人这两个类,那我们可以为这两个类设计一个更高级别的抽象类–人。对于接口,我们可以坐着吃饭,可以站着吃饭,可以用筷子吃饭,可以用叉子吃饭,甚至可以学三哥一样用手抓着吃饭,那么可以把这些吃饭的动作抽象成一个接口–吃饭。所以在高级语言中(如Java,C#),一个类只能继承一个抽象类(因为你不可能同时是生物又是非生物)。但是一个类可以同时实现多个接口,比如开车接口,滑冰接口,啪啪啪接口,踢足球接口,游泳接口。

总结几句话来说:

1、抽象类和接口都不能被直接实例化,如果二者要实例化,就涉及到多态,不懂多态的参见我的回答JAVA的多态用几句话能直观的解释一下吗?。如果抽象类要实例化,那么抽象类定义的变量必须指向一个子类对象,这个子类继承了这个抽象类并实现了这个抽象类的所有抽象方法。如果接口要实例化,那么这个接口定义的变量要指向一个子类对象,这个子类必须实现了这个接口所有的方法。
2、抽象类要被子类继承,接口要被子类实现。
3、接口里面只能对方法进行声明,抽象类既可以对方法进行声明也可以对方法进行实现。
4、抽象类里面的抽象方法必须全部被子类实现,如果子类不能全部实现,那么子类必须也是抽象类。接口里面的方法也必须全部被子类实现,如果子类不能实现那么子类必须是抽象类。
5、接口里面的方法只能声明,不能有具体的实现。这说明接口是设计的结果,抽象类是重构的结果。

6、抽象类里面可以没有抽象方法。

7、如果一个类里面有抽象方法,那么这个类一定是抽象类。

8、抽象类中的方法都要被实现,所以抽象方法不能是静态的static,也不能是私有的private。

9、接口(类)可以继承接口,甚至可以继承多个接口。但是类只能继承一个类。

10、抽象级别(从高到低):接口>抽象类>实现类。

11、抽象类主要是用来抽象类别,接口主要是用来抽象方法功能。当你关注事物的本质的时候,请用抽象类;当你关注一种操作的时候,用接口。

12、抽象类的功能应该要远多于接口,但是定义抽象类的代价较高。因为高级语言一个类只能继承一个父类,即你在设计这个类的时候必须要抽象出所有这个类的子类所具有的共同属性和方法;但是类(接口)却可以继承多个接口,因此每个接口你只需要将特定的动作方法抽象到这个接口即可。也就是说,接口的设计具有更大的可扩展性,而抽象类的设计必须十分谨慎