-
Java编译器和解释器以及虚拟机 编译器面向虚拟机(虚拟机理解的是字节码,可移植性)。解释器转化虚拟机到特定系统。
-
面向对象 与 面向过程
- 面向过程,以事件为中心(比如流程有什么):开销大,不好维护。
- 面向对象(以属性和行为为个体,进行交互):性能稍差,但已维护。zhuanlan.zhihu.com/p/28427324
- 封装、多态、继承、抽象 —— 面向对象
- 多态好处:允许多个类对同一消息做出响应,良好的扩容和可替换性。比如公共接口
- 虚拟机的多态(动态绑定技术(dynamic binding))判断所引用对象的实际类型,根据实际类型调用对应的方法。
- 封装与解耦:将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为
- 继承:很少问
- 抽象:忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。比如鱼类是鲨鱼的抽象类
- 抽象的意义:为其他子类提供一个公共的类型,封装子类中重复定义的内容。
- Override和Overload的含义和区别
- Override重写:将父类的方法覆盖。比如tosubstring,方法名、参数、返回值相同。方法被定义为final不能被重写。存在于父类和子类之间。子类方法不能缩小父类方法的访问权限。子类方法不能抛出比父类方法更多的异常。
- Overload重载:方法名相同,参数列表不同(个数、顺序、类型不同)。不能重载只有返回值不同的方法名。返回值可以不同。可以有不同的访问修饰符。可以抛出不同的异常。
- 构造器的重载与重写:不可以被重写但可以被重载
-
基本数据类型 八种基本数据类型:int、short、float、double、long、boolean、byte、char
-
静态方法和非静态方法(实例方法)
- 静态方法:使用static关键字,通过类名.方法名调用静态方法。
- 在一个静态方法内调用一个非静态成员是非法的。
- 在静态方法中,不能引用成员变量(即,没有static修饰的变量)。
- 在静态方法中,不能使用super和this关键字。
- 静态方法的生命周期跟相应的类一样长,静态方法和静态变量会随着类的定义而被分配和装载入内存中。一直到线程结束,静态属性和方法才会被销毁(也就是静态方法属于类)
- 父类的静态方法不能被子类重写
- 非静态方法:使用new实例化什么都可以调用
- 非静态方法的生命周期和类的实例化对象一样长,只有当类实例化了一个对象,非静态方法才会被创建,而当这个对象被销毁时,非静态方法也马上被销毁。(也就是非静态方法属于对象)
- 接口
- 接口的意义:规范,扩展,回调,一个类只能继承一个父类,但是可以继承N个接口。 接口的目的是指明相关或者不相关类的多个对象的共同行为
- 抽象类和接口的区别:如果往接口中添加新方法,则子类中需要实现该方法。而抽象类中添加新方法,可以提供默认的实现,因此可以不修改子类现有的代码
-
==和eqauls()的区别 ==对于基本类型对比,equals基于Object类
-
Map、Set、List、Queue、Stack的特点与用法
- Map:Map是键值对,键Key是唯一不能重复的,一个键对应一个值,值可以重复。TreeMap可以保证顺序。HashMap不保证顺序,即为无序的,可以存储 null 值,不是线程安全的。HashTable 是线程安全的,不能存储 null 值。
- Set:不包含重复元素的集合,set中最多包含一个null元素。只能用Lterator实现单项遍历,Set中没有同步方法。
- Queue:Queue遵从先进先出原则。
- Stack:Stack遵从后进先出原则。
-
final final 修饰的类叫最终类,该类不能被继承。final 修饰的方法不能被重写。final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
-
并行和并发
- 并行(parallel):多个处理器同时处理多个不同的任务,物理上的同时发生。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行。
- 并发(Concurrent):指一个处理器同时处理多个任务,逻辑上的同时发生。如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态。