1. ==与equals的区别
对于引用数据类型来说,==是比较它们的内存空间是不是相同的,而equals是比较它们的值
2. abstract class和interface的区别?
- Interface需要实现,要用implements,而abstract class需要继承,要用extends。
- 一个类可以实现多个Interface,但一个类只能继承一个abstract class。
- Interface强调特定功能的实现,而abstract class强调所属关系。
- 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。Interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),Interface 的实现类必须要实现,而abstract class的子类可以有选择地实现。
3. final, finally, finalize的区别
-
Final
修饰符(关键字) 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
-
Finally
在异常处理时提供 finally 块来执行任何清除操作。
finally是在try-catch-finally块中配套使用,作用是不管代码执行了try还是catch,无论是否异常,最后总是会执行finally里面的代码
//例子:
try{
//这里写一些可能出现异常的代码
}catch(Exception e){
//出现了异常就执行这里的代码。否则不执行
}finally{
//无论有没有异常,都执行这里的代码
}
-
Finalize
方法名。Java允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。finalize是召唤垃圾收集器的命令,使用后,系统就安排一次垃圾回收。但是否立即执行,执行的时间点是无法确定的。
4. error和exception有什么区别?
-
error
属于编译时错误,根本不会编译通过,也就是不会生成.class文件,比如,内存资源不足等,对于这种错误,程序基本无能为力,除了退出运行外别无选择。Error表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题,Error类对象由Java虚拟机生成并抛出。
-
exception
属于运行时错误,只有在调用的时候才会报错,比如空指针或数组下标越界等等,Exception(违例)表示需要捕捉或者需要程序进行处理的异常,Exception类对象由应用程序处理或抛出。
5.Java多态的实现(继承 重载 覆盖)
-
继承(inheritance)
一旦你已经创建了一个定义了对象一般属性的父类,该父类可以被继承以生成特殊用途的类。每一个子类只增添它自己独特的属性。这是继承的本质。Java 不支持多父类的继承。
-
重载(overload)
- 方法重载是指多个方法享有相同的名字,但是这些方法的参数必须不同,或者是参数的个数不同,或者是参数类型不同。。
- 对返回类型无限制,返回类型不能用来区分重载的方法。
- 对于继承来说,如果某一方法在父类中是访问权限是private,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
-
覆盖(override)(方法的重写)
是指子类对自父类继承的方法进行重新的定义。
要求:相同的方法名称、参数列表、返回值。
从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。
6. 工厂模式的定义、原理与作用
- 定义
提供创建对象的接口
- 原理
创建一个抽象工厂,它决定返回哪一个类的实例并将该实例返回。接下来可以调用那个类实例的方法,但不需要知道具体使用的是哪一个子类,这种方法把和数据相关的问题与类的其他方法分隔开来
- 作用
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
编码设计法则:
(1)OCP法则(开闭原则:一个软件的实体应该对扩展开放,对修改关闭)
(2)DIP法则(依赖倒转:抽象不应当依赖于细节,细节应当依赖于抽象)
7. 多线程的实现方法
创建线程有两种方法:继承Thread类和实现Runnable接口。
-
继承Thread类:
一个Thread类的对象代表一个线程
启动线程——start( ) 启动线程时,由java直接调用public void run()
运行线程的主体——run ( )
暂停线程的执行——sleep(),让出CPU给其他线程使用,在指定的时间后,CPU回到刚才暂停的线程上执行。
-
实现Runnable接口:
该类中只有一个run()方法,我们声明自己的类实现 Runnable 接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。但是 Runnable 接口并没有任何对线程的支持,我们还必须创建 Thread 类的实例,这一点通过 Thread 类的构造函数public Thread(Runnable target);来实现
8. 类、抽象类、接口之间的联系与区别
- 答案一
abstract class是interface与Class的中介。interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也不能声明实例变量。然而,interface却可以声明常量变量。abstract class在interface及Class中起到了承上启下的作用。'
一方面,abstract class是抽象的,可以声明抽象方法,以规范子类必须实现的功能;
另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。
- 答案二
具有关键字abstract ,在实现内容上没有完全定义的类就叫抽象类。
抽象类和接口的区别如下:
- 在类来继承抽象类时,只需实现部分具体方法和全部抽象方法,而实现接口则要实现里面的全部方法。
- 在接口中无成员变量,而抽象类中可有成员变量。
在Java中引进接口主要是为了解决多继承的问题。- 接口中不能有非抽象方法,但抽象类中可以有。
- 一个类能实现多个接口,但只能有一个父类。
- 接口并不属于继承结构,它实际与继承无关,因此无关的类也可以实现同一个接口。
9. 位运算符和逻辑运算符的区别
java的位运算符包括:
- “按位与”运算符 &(双目运算符)
- “按位或”运算符 | (双目运算符)
- “按位非”运算符 ~ (单目运算符)
- “按位异或”运算符 ^(双目运算符)
Java 的逻辑运算符包括$$、||、!
两者不同的是:位运算符要计算完a和b之后再给出运算的结果。
比如,X的初值是1,经过((y=1)==0)&&((x=8)==8);逻辑运算比较后,X的值仍然是1,因为前面的判断结果为false,不再执行后面的语句。
但是如果经过((y=1)==0)&((x=8)==8);位运算之后,X的值是8
10. 上溯造型与下溯造型
-
上溯造型
把子类类型转换为父类类型-自动完成。
-
下溯造型:把父类类型转换为子类需要进行强制转换。
规定:
并不是任意一个对象都能够进行下溯造型。只有曾经上溯造型过的对象才能进行下溯造型。对象不允许不经过上溯造型而直接下溯造型。否则运行时会抛出java.lang.ClassCastException.
11. 访问控制修饰符的作用,可见范围的区分
- 作用
防止程序员接触到他们不该接触的东西
- 区分
可见度 | Public | Protected | Private | 缺省 |
---|---|---|---|---|
同一类中可见 | 是 | 是 | 是 | 是 |
同一包中对子类可见 | 是 | 是 | 否 | 是 |
同一包中对非子类可见 | 是 | 是 | 否 | 是 |
不同包中对子类可见 | 是 | 是 | 否 | 否 |
不同包中对非子类可见 | 是 | 否 | 否 | 否 |
12. Java垃圾收集方法
java垃圾回收由java虚拟机自己调用,程序员不用管
两种方法是
- System.gc()
- Runtime.gc()
13. Java中的参数传递
JAVA中的参数传递全是以值传递的。是基本类型,就拷贝一个基本类型传进方法;是引用,就拷贝一个引用变量传进去方法。你可以通过方法来改变被引用的对象中的属性值,却无法改变这个对象引用(Object reference)本身.也就是当一个对象的实例被创建的时候.
//like this:
Apple a = new Apple(); //a 存的就是这个对象Apple实例的地址
//而这个地址,也就是a的值作为参数传到某个函数中的时候,a本身是不会改变的。
14. Java中堆与栈的理解及其作用
-
答案一
-
堆
Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放,堆是由垃圾回收来负责的。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。
-
栈
在方法中定义的一些基本类型的变量和引用变量都是在方法的栈内存中分配。当在一段代码块(也就是一对{}之间)定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后, Java会自动释放为该变量分配的内存空间。
-
答案二:
堆是先进先出,而栈是先进后出
- 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
- 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。
- 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
15。 类图的表示
自己看资料
16. 简述this、super、static关键字的作用
-
super
- 引用父类的成员:super.变量 或 super.方法([参数列])
当然,这需要相应的访问权限 - 在子类构造方法中调用父类的构造方法:
super([…]);//与this用法类似,应放在子类构造方法的第一行位置上
请注意:父类变量的初始化只能通过调用super([…])方法,由父类来完成,子类不可能“代劳”。只有父类变量的初始化完成之后,子类才开始其新增变量的初始化工作。
-
static:
可以在类的字段、方法前加上static关键字,表明该变量、该方法是属于类的,故称为类属性或类方法。(而无static修饰的,则称为实例属性量或实例方法)
说明:
静态成员属于类所有,不属于某一具体对象私有;
静态成员随类加载时被静态地分配内存空间或入口地址,通常通过 类名.静态成员 方式来访问;
同一个类的实例方法可以访问该类的类属性、类方法;
而类方法只能访问该类的类属性、类方法,不能直接访问实例的变量和方法,也不能使用this关键字。
-
this:
this关键字表示的是“当前对象”,当出现在类的实例方法中,代表的是调用该方法的对象;当出现在类的构造方法中时,代表的是调用该构造方法创建的对象。
在下列两种情况下,必须使用this
- 方法的形式参数与类的成员变量同名:
- 在内部类中使用外部类的同名成员变量的时候
17. 集合基本概念与用法
集合的类型一共有三种,分别是:set list map
-
set
无重复元素,无序的。不维护元素的次序。
-
list
对象以线性方式存储。在数据结构中表现为数组、响亮、链表、堆栈和队列。
-
map
每个元素由key-value构成。key是唯一的。
18. 编码原则与关系的种类
-
七大原则
-
SRP法则(单一职责原则)
就一个类而言,应该仅有一个引起他变化的原因.
-
OCP法则(开闭原则,Open-Closed Principle)
一个软件的实体应该对扩展开放,对修改关闭。
-
LSP法则(里氏转换原则, Liskov Substitution Principle)
使用指向基类(超类)的引用的函数,必须能够在不知道具体派生类(子类)对象类型的情况下使用它们。
-
DIP法则(依赖倒转, Dependence Inversion Principle)
抽象不应当依赖于细节,细节应当依赖于抽象。•理解:要依赖于抽象,不要依赖于具体,要针对接口编程,不针对实现编程。
-
ISP原则(接口隔离原则,Interface Segregation Principle)
使用多个专门的接口比使用单一的总接口要好。
-
CARP原则(合成/聚合复用原则, Composite/Aggregate Reuse Principle)
要尽量使用合成/聚合,尽量不要使用继承。
-
LoD法则(迪米特法则, Law of Demeter)
一个对象应当对其它对象有尽可能少的了解。“不要和陌生人说话”
-
五大关系:
-
一般化关系
-
关联关系
-
聚合关系
-
组合关系
-
依赖关系
19. 代码重构的作用与方法
-
作用
系统发展到一定阶段后,使用重构的方式,不改变系统的外部功能,只对内部的结构进行重新的整理。通过重构,不断的调整系统的结构,使系统对于需求的变更始终具有较强的适应能力。
-
方法
过大的类和过长的方法 需要想办法将其划分为多个小方法,以便于分而治之。
过度耦合的信息链 需要查看就否有可移除的中间层,或是否可以提供更直接的调用方法。