面向对象
# 1. 面向对象
# 面向对象和面向过程的区别
面向过程: 是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一一调用则可。性能较高,所有单片机,嵌入式开发等一般采用面向过程开发
面向对象: 是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为。
# 面向对象三大特性
封装:隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。
继承:是为了重用父类代码。两个类若存在IS-A的关系就可以使用继承。同时继承也为实现多态做了铺垫。
多态:就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性
多态总结:面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力。
根据 Java 多态机制,继承链中对象方法的调用存在一个优先级:
http://www.javashuo.com/article/p-cyinhxcc-em.html (opens new window)
this.method(O) ->super.method(O) -> this.method((super)O) -> super.method((super)O)
# 重载和重写的区别
# 一、重写(Override)
从字面上看,重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。
public class Father {
public static void main(String[] args) {
// TODO Auto-generated method stub
Son s = new Son();
s.sayHello();
}
public void sayHello() {
System.out.println("Hello");
}
}
class Son extends Father {
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hello by ");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
重写 总结:
发生在父类与子类之间
方法名,参数列表,返回类型(除子类中方法的返回类型是父类中返回类型的子类)必须相同
访问修饰符的限制一定要大于被重写方法的访问修饰符
(public>protected>default>private)
重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
# 二、重载(Overload)
在一个类中,同名的方法如果有不同的参数列表 (参数类型不同、参数个数不同甚至是参数顺序不同) 则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但 不能通过返回类型是否相同来判断重载。
public class Father {
public static void main(String[] args) { // TODO Auto-generated method stub
Father s = new Father();
s.sayHello();
s.sayHello("wintershii");
}
public void sayHello() {
System.out.println("Hello");
}
public void sayHello(String name) {
System.out.println("Hello" + " " + name);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
重载 总结:
重载Overload是一个类中多态性的一种表现
重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。