面向对象基础概念
本文是对《大话设计模式》中(附录A 培训实习生——面向对象基础)学习时的总结与笔记,以及学习后对面向对象的一些感悟。
一、类与实例
对象是一个自包含的实体,用一组可识别的特性和行为来标识。
类就是具有相同的属性和功能的对象的抽象的集合。
实例,就是一个真实的对象。实例化就是创建对象的过程,使用new关键字来创建。
例如:
Person person = new Person();
其中Person
是一个类,person
是一个对象,new
是一个实例化的过程,后面的Person()
是构造方法。
二、构造方法
构造方法,又叫构造函数,其作用就是对类进行初始化。
构造方法与类同名,无返回值,也不需要void,在new的时候调用。
所有类都有构造方法,如果你不编码则系统默认生成空的构造方法,若你有定义的构造方法,那么默认的构造方法就会失效了。
例如:
public class Person{
private String name;
Person(String name){
this.name = name;
}
}
Person person = new Person("张三");
在实例化类时,需要传递一个参数,此时实例化就调用自定义的构造方法,将Person
类中的name
字段进行赋值;
三、方法重载
方法重载提供了创建同名的多个方法的能力,但这些方法需使用不同的参数类型。
注意:方法重载时,两个方法必须要方法名相同,但参数类型或个数必须要有所不同。
方法重载的好处就是可在不改变原方法的基础上,新增功能。
例如:
public class Person{
private String name;
Person(String name){
this.name = name;
}
Person(){
this.name = "";
}
}
Person person = new Person("张三");
Person person = new Person();
两种构造实例化都可以使用,只是它们的内容不同。
注意:并不是只有构造方法可以重载,普通方法也是可以重载的。
四、属性与修饰符
属性是一个方法或一对方法,但在调用它的代码看来,它是一个字段,即属性适合于以字段的方式使用方法调用的场合。字段是存储类要满足其设计所需要的数据,字段是与类相关的变量。
对于字段和属性,例如:
public class Person{
private String name; //私有字段
public String getName(){ //name的可读属性
return name;
}
public void setName(String name){ //name的可写属性
this.name = name;
}
}
在调用getName()
方法时,我们是获得name
属性,调用setName(String name)
方法时要说设置name
属性,对我们来说name
字段是私有的 。
public
和private
都是修饰符,public
表示它所修饰的类成员可以允许其他任何类来访问,俗称公有的。而private
表示只允许同一个类中的成员访问,其他类包括它的子类无法访问,俗称私有的。如果在类中的成员没有加修饰符,则被认为是private 的。
通常字段都是private,即私有的变量,而属性都是public,即公有的变量。
属性有两个方法get
和set
。get
访问器返回与声明的属性相同的数据类型,表示的意思是调用时可以得到内部字段的值或引用;set
访问器有一个参数,它的作用是调用属性时可以给内部的字段或引用赋值。
五、封装
面向对象的三大特性之一‘封装’ 。
每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。这样方法和属性包装在类中,通过类的实例来实现。
例如:
public class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void speak(String text){
System.out.println(text);
}
}
将Person所包含的信息,包括name、age和speak包装在一个类中,可以通过实例来对这些信息进行操作。
封装有很多好处:第一、良好的封装能够减少耦合。第二、类内部的实现可以自由地修改。第三、类具有清晰的对外接口。
六、继承
面向对象的三大特性中另一个为继承。
对象的继承代表了一种’is-a’的关系,如果两个对象A和B,可以描述为 ‘B是A’,则表明B可以继承A。
‘猫是哺乳动物’,就说明了猫与哺乳动物之间继承与被继承的关系。实际上,继承者还可以理解为是对被继承者的特殊化,因为它除了具备被继承者的特性外,还具备自己独有的个性。例如,猫就可能拥有抓老鼠、爬树等‘哺乳动物’对象所不具备的属性。因而,在继承关系中,继承者可以完全替换被继承者,反之则不成立。所以,我们在描述继承的 ‘is-a’ 关系时,是不能相互颠倒的。
继承定义了类如何相互关联,共享特性。继承的工作方式是,定义父类和子类,其中子类继承父类的所有特性。子类不但继承了父类的所有特性,还可以定义新的特性。
如果子类继承于父类,第一、子类拥有父类非private
的属性和功能;第二、子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;第三、子类还可以以自己的方式实现父类的功能(方法重写)。
对于protected
修饰符。protected
表示继承时子类可以对基类有完全访问权,也就是说,用protected
修饰的类成员,对子类公开,但不对其他类公开。所以子类继承于父类,则子类就拥有了父类的除private
外的属性和功能。
例如:Student
类继承第五节的例子Person
类
public class Student extends Person{
public Student(String name, int age) {
super(name, age);
}
public void study(int time){
System.out.println("学习了" + time);
}
}
子类从它的父类中继承的成员有方法、域、属性、事件、索引指示器,但对于构造方法,有一些特殊,它不能被继承,只能被调用。
不用继承的话,如果要修改功能,就必须在所有重复的方法中修改,代码越多,出错的可能就越大,而继承的优点是,继承使得所有子类公共的部分都放在了父类,使得代码得到了共享,这就避免了重复,另外,继承可使得修改或扩展继承而来的实现都较为容易。
但是继承是有缺点的,那就是父类变,则子类不得不变。另外,继承会破坏包装,父类实现细节暴露给子类,这其实是增大了两个类之间的耦合性。两个类尽管分开,但关系密切,一方的变化都会影响到另一方,这就是耦合性高的表现,继承显然是一种类与类之间强耦合的关系。
当两个类之间具备 ‘is-a’ 的关系时,就可以考虑用继承了,因为这表示一个类是另一个类的特殊种类,而当两个类之间是 ‘has-a’ 的关系时,表示某个角色具有某一项责任, 此时不合适用继承。
七、多态
面向对象的三大特性中最后一个是多态。
多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。第一,子类以父类的身份出现,儿子代表老子表演,化妆后就是以父亲身份出现了,即类型已经转化为父类。第二、子类在工作时以自己的方式来实,儿子只能用自己理解的表现方式去模仿父亲的作品。第三、子类以父类的身份出现时,子类特有的属性和方法不可以使用。
例如:Student
类继承第五节的例子Person
类
public class Student extends Person{
public Student(String name, int age) {
super(name, age);
}
@Override
public void speak(String text) {
System.out.println("学生说:" + text);
}
}
Person student = new Student("张三",20);
student.speak("你好");
其中speak()
就是子类重写父类的方法,其输出为学生说:你好
。
不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。