Java中的面向对象

Published: 02 Sep 2015 Category: java

1. 什么是面向对象?

* 对象是算法与数据结构的整体,程序就成了对象的集合
* 类是面向对象编程的基本单元;是具有相同性质和功能的事物所构成的集合体。

面向对象的三大特性:封装、继承、多态。

封装是面向对象的特征之一,是对象和类概念的主要特性。把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力.

多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。

2. 类和对象的关系

* 类是抽象的概念,用于创建对象
* 对象是类的实例,对应客观世界的实体。

3. 接口和抽象类的异同

* 接口是规范,类是实现;接口中所有方法是抽象的,并且不能指定方法的访问修饰符,抽象类中能包含方法的实现。
* 都不能被实例化
* 继承类或实现类必须实现所有方法才能被实例化

4. 接口是?

* 要实现多重继承,需要借助java中的接口(接口是为继承而存在的)
* 接口描述可属于任何类或结构的一组相关行为。
* 接口是把多个继承类中的公共对象抽象出来,并封装这些公共对象的行为。

5. 接口的特性

* 不能被实例化,其内部函数必须是public
* 只能定义方法,不能包含方法的实现
* 可由常量或方法这两种成员的任何组合构成
* 可以使用extends关键字继承一个或多个接口。但是类不能继承多个类(不支持多重继承,仅支持单继承)。
* 接口类似于抽象类,实现接口的类必须要实现接口中的所有方法。

6. 重写和重载

重写是指重新实现基类中的方法(final和private修饰的方法不能被重写)。重载是一个类内部的行为,如test(Byte ele)和test(int ele)在被test(12)调用的时候就表现出多态。

7. final、finally和finalize的区别

* final是修饰符。修饰类,该类不能被继承;修饰变量,变量赋值后不能修改;修饰方法,方法不能被重写。
* finally用于异常处理,始终执行所修饰的代码片段,通常用于释放资源。
* finalize表示Object类中定义的一个方法,它可以重写,用于回收资源。

8. 构造方法有何作用?

* 可以创建类的对象
* 可以在创建对象的同时初始化类的数据成员。

9. equals方法有什么要求?

* 自反性
* 对称性
* 传递性
* 一致性:多次调用x.equals(y)始终返回一个值。
* 在重写equals方法时,通常也需要重写hashCode()方法。

10. 克隆

* 浅克隆可以直接重写Object类中的clone()方法。如果需要克隆的对象包含引用类型,则需要使用深克隆。
* 实现深克隆的两种方式:
	1. 序列化(Serializable):需要借助流ByteArrayIn/OutputStream,效率没有第二种好,很低。
	2. 依次克隆

11. 内部类

* 对于非静态内部类,不能有静态成员。错误代码:

		class InnerOne{
			public static double method(){}
		}
* 静态内部类,可以访问外部类的静态变量,但不能访问非静态变量。错误代码:

		static class InnerOne{
			public double method(){
				return b; //外部类的非静态变量
		}
* 正确的两种:

		private class InnerOne{
			public double method(){
				return b; //外部类的非静态变量
			}

		abstract class InnerOne{
			public abstract double method();
		}

12. 内部类可以使用private进行修饰:

	public class Test{
		public class Inner1{}
		class Inner2{}
		protected class Inner3{}
		private class Inner4{}
	} 外部类只能用默认和public进行修饰,但是**内部类可以使用任意的修饰符**。

13.继承的利弊

利:

  • 代码复用,每个子类拥有父类的方法和属性。
  • 子类可以不同于父类
  • 提高代码的可扩展性
  • 提高产品或项目的开放性

弊:

  • 继承是侵入型的,子类必须拥有父类的方法和属性
  • 降低代码的灵活性,子类对父类中的方法和属性没办法不继承
  • 增强了耦合性,父类的修改需要同时考虑修改对子类的影响。

弊端可以用里氏替换原则得到缓解。