面向对象和面向过程的区别
- 面向过程把解决问题的过程拆成一个个方法,通过执行一个个方法来解决问题。
- 面向对象则是先抽象出对象,然后用对象执行方法的方式解决问题;面向对象一般更易于维护、复用和扩展。
如果一个类没有声明构造方法,该程序能正确执行吗?
能正确执行。
构造方法是一种特殊的方法,主要作用是完成对象的初始化工作。
如果一个类没有声明构造方法,也可以执行!因为一个类在没有显式声明构造方法时,会有默认的不带参数的构造方法。但如果我们添加了类的构造方法时,无论是否有参,Java 就不会默认添加无参数的构造方法。
因此,在实际开发中,当我们重载了有参的构造方法,也要显式声明无参构造方法
构造方法有哪些特点?是否可被 override?
构造方法主要有三个特点:
- 方法名与类名相同。
- 没有返回值,但不能用 void 声明构造函数。
- 生成类的对象时自动执行,无需调用。
构造方法不能被 override(重写),但是可以 overload(重载)因此可以在类中声明多个构造函数。
面向对象三大特征
封装,继承和多态
封装:封装是指把一个对象的状态信息(也就是类的属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但类可以提供一些被外界访问的方法来操作属性。比如setting和getting函数
继承:使用已存在的类的定义作为基础建立新的类,即子类继承父类的特征和行为,子类的定义可以增加新的属性或方法,也可以用父类的属性和方法,但不能选择性地继承父类。通过继承可以提高代码的重用和程序的可维护性。
多态:对于同一个行为,不同的子类对象具有不同的表现形式。
多态存在的三个条件:继承,重写,父类引用指向子类对象
接口和抽象类的共同点和区别
共同点:
- 都不能被实例化。
- 都可以包含抽象方法。
- 都可以有默认实现的方法(Java 8 可以用
default
关键字在接口中定义默认方法)。
区别:
抽象类 | 接口 | |
---|---|---|
目的 | 主要用于代码复用,强调的是所属关系 | 对类的行为进行约束,实现了某个接口就具有了对应的行为,强调的是功能实现 |
继承 | 一个类只能继承一个抽象类 | 一个类可以实现多个接口 |
成员变量 | 成员变量默认 default,可在子类中被重新定义,也可被重新赋值 | 接口中的成员变量只能是 public static final 类型的,即常量型,不能被修改且必须有初始值 |
成员方法 | 抽象类可以声明方法,也可以实现方法 | 接口只能声明方法,不能实现方法(java 1.8中可以定义default方法体) |
深拷贝和浅拷贝
浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象的内部对象是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。
实现了 Cloneable
接口,并重写了 clone()
方法,在clone()方法中调用父类Object的clone()方法
深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。
实现了 Cloneable
接口,并重写了 clone()
方法,在clone()方法中调用父类Object的clone()方法的同时对内部对象进行各自克隆
引用拷贝:用拷贝就是两个不同的引用指向同一个对象