Java是一种面向对象的编程语言。
首先我们要区别面向过程和面向对象的区别?
面向过程:自顶向下的编程模式,将问题分解成一个个步骤,然后以函数调用的方式逐步实现。
面向对象:将问题抽象出一个类,将属性和行为封装成类,我们只需要一次实现就可以多次调用,不需要重复造轮子。
两者区别:面向过程注重实现的细节,速度快,占用资源少;面向对象注重无需重复造轮子,属性行为的封装,占用资源多,速度相对慢。
Java语言有哪些特点?
面向对象(封装,继承,多态)
平台无关性(虚拟机)
编译与解释并存
JVM,JDK,JRE三者区别?
JVM:运行Java字节码的虚拟机,目的就是在不同的环境上得出相同的结果,实现Java的跨平台。
字节码是jvm可以识别使用的。过程转化是:.java->.class->二进制机器码。
其中在.java到.class转化是通过javac命令实现的,.class->机器码是通过jvm实现的。
值得一提的是在JVM阶段,JVM类加载器首先加载字节码文件,然后逐行解释执行,这样效率会很慢,因为我们程序中执行代码也会满足二八定律,即只有少部分代码会经常执行占用大多数的资源,因此JVM采用JIT编译,也叫运行时编译,当JIT编译成功一次字节码就会将这段代码保存起来,下次直接使用机器码,这样带来的问题就是需要预热,也就是一开始的时候效率还是那么低,所以JDK9又引入一种AOT编译,类似于静态编译,把所有要执行的一次性转成机器码。有点类似于单例模式中的懒汉模式和饿汉模式。
JDK:Java开发工具包,包含了JRK的一切以及javac等
JRE:Java运行时环境,可以运行Java程序。
Java和C++的区别?
Java和C++都是支持面向对象的语言,都支持封装,继承,多态
Java不支持多继承,C++支持。但是Java支持实现多个接口。
Java有自动的内存回收机制,C++需要自己释放内存。
C++支持指针。Java不支持。
面向对象的三大特征?
封装:将数据抽象出属性和方法封装在类里面,我们可以使用访问修饰符控制能否被外界访问,开放出指定的接口,可以保护数据,封装的意义就在于用户无需关注类的内部细节如何,只需要调用需要接口即可。
优点:减少了耦合,提高了性能。
继承:子类继承父类,子类可以继承父类的所有方法,公开和私有都可以,但是无法调用私有的方法,只是拥有。
子类可以另外实现自己的方法,事实上创建自己子类就是为了继承父类方法之后实现自己的方法,必须满足里氏替换原则,即子类对象必须能够完全替代父类,同时抛出异常比父类抛出异常低。
多态:多态分为编译时多态和运行时多态。
编译时多态指的是重载的过程,一般在一个方法中,出现多种同名方法,通过控制参数类型,个数,返回值的不同实现多态性。
运行时多态性:一般通过继承实现,需要满足:

  1. 子类继承父类
  2. 子类重写父类的方法(覆盖)
  3. 父类引用子类,向上转型。

面向对象五大基本原则
单一职责原则:一个类应该最好做一件事,实现高内聚和低耦合。
开发封闭原则:对扩展开放,对修改关闭,多实现抽象编程。
里氏替换原则:子类必须能够完全代替父类。
依赖倒置原则:面向接口编程,依赖于抽象。
接口隔离原则:接口要小而专,不要大而全。专注于自己的事情。避免接口污染。
重写和重载的区别
重写是运行时多态性,必须满足子类继承父类,并重写父类的方法,方法的参数类型,返回类型不能改变,唯一可以改变的是内部的逻辑。同时重写的限制类型不能比父类的更强,抛出的异常不能比父类抛出异常范围窄。
重载是编译时多态性,是在一个方法内,重载的方法可以是参数类型不同,可以是返回类型不同,值得注意的是当只有返回类型不同时候,我们不认为这是重载。
继承和接口的区别?
继承是一种is-a的关系,接口是一种like-a的关系。
如果多个类的某个部分功能一样,那么我们可以抽象出这个功能作为一个类,其他类继承。
如果多个类处理的目标一致,但是处理的方法不同,那就定义一个接口。
继承主要是为了复用。
接口是为了定义规范。
继承是extends,接口是implements
Java的继承不支持多继承,但是可以实现多个接口。
接口中的变量默认static final,方法是public,java8之后可以实现default方法。继承的话,可以实现方法,可以有多种访问修饰符。
继承和组合的区别?
我们一般说能不用继承就不用,因为继承虽然带了有效的代码复用,但是如果滥用继承,会导致耦合性提高,代码逻辑混乱,难以维护。
组合的就是has-a的关系。通俗的说是将很多我们需要的东西组合在一个接口里面,这样保证了耦合性的降低,各个组件的独立性提高。
继承是白盒代码复用,因为我们在编译阶段就知道,子类和父类的关系,而组合是黑盒代码复用,多为接口组合,只有在运行时才知道具体调用了那些方法。
成员变量和方法作用域
对于成员变量和方法的作用域,public,protected,private以及不写之间的区别:

public : 表明该成员变量或者方法是对所有类或者对象都是可见的,所有类或者对象都可以直接访问

private : 表明该成员变量或者方法是私有的,只有当前类对其具有访问权限,除此之外其他类或者对象都没有访问权限.子类也没有访问权限.

protected : 表明成员变量或者方法对类自身,与同在一个包中的其他类可见,其他包下的类不可访问,除非是他的子类

default : 表明该成员变量或者方法只有自己和其位于同一个包的内可见,其他包内的类不能访问,即便是它的子类
实际参数和形式参数的区别?
实际参数指的是调用有参方法时,真正传递的内容,而形式参数是接收shican实参内容的参数。