如何理解面向对象
一、什么是类
我的理解是:类是对一类对象的描述。类通过定义一些行为和属性向我们描述了这类对象是什么样子的,既然知道了对象的样子,我们就可以来创建出对象了。所以,类之所以可以用来创建对象,原因就在于类清晰的描述了对象的样子。
二、什么是对象
对象是堆上的一块内存空间,包含了类里面定义的一些属性。对象在被创建出来后为了方便别的对象使用,一般会把地址交由一个引用保管,引用的值就是这个对象的地址。
三、如何去理解类里的访问控制符、属性和方法?
提供一个角度:站在当前对象的角度去看类里面定义的访问控制符、属性和方法。
下面是一个例子:
public class Person {
private String wallet; //钱包
private static String garden; //花园
public int height; //身高
public void help()
{
Person p1 = new Person();
p1.wallet; //允许;当前对象是Person类对象,p1也是Person类对象,p1对象向当前对象开放私有属性, 当前对象可以访问p1对象的私有属性
p1.work(); //允许;当前对象是Person类对象,p1也是Person类对象,p1对象向当前对象开放私有方法, 当前对象可以访问p1对象的私有方法
p1.gadern; //允许;当前对象是Person类对象,可以访问到Person类的私有属性
Person.garden; //允许,理由同上
}
private void work()
{
}
}
public class Dog{
public void method() {
Person p1 = new Person();
p1.wallet; //不允许,当前对象是Dog类型对象,p1是Person类型对象,当前对象想访问p1对象的私有属性,由于p1对象不对其他类型对象开放私有属性,所有访问不到
p1.work(); //不允许,当前对象是Dog类型对象,p1是Person类型对象,当前对象想访问p1对象的私有属性,由于p1对象不对其他类型对象开放私有方法,所有访问不到
p1.garden; //不允许,当前对象是Dog类对象,Person类的私有属性不对Dog类型对象开发
Person.garden; //不允许,理由同上
}
}
- wallet属性是当前对象私有的,不允许被其他类型对象访问。比如其他类型对象有这样的行为:
Person p1 = new Person(); p1.wallet
,其他对象创建了一个p1对象,并且想获得p1对象的wallet,但是对于p1对象来说,wallet是自己私有,所以不允许被访问。在Person类中确实允许的,因为当前对象和p1都是Person类的。 - height属性是当前对象向外公开的,可以被任何对象访问。比如其他对象有这样的行为:
Person p1 = new Person(); p1.height
,其他对象创建了一个p1对象,并且想获得p1对象的height,对于p1对象来说,wallet是向任何对象公开的,所以允许被访问。在Person类中确实允许的,因为当前对象和p1都是Person类的。 - work方法是当前对象私有的行为,不向其他对象提供服务。其他对象想通过
Person p1 = new Person(); p1.work();
让p1对象提供服务,但对p1来说work()是自己私有的行为,因此访问失败。 - help方法是当前对象公开的行为,向所有对象提供服务。
- garden属性是Person类私有的属性,表示只对所有Person类的对象公开,不对其他类型的对象公开。其他类型对象想通过
Person.garden
或者Person p1 = new Person(); p1.garden
去访问都会失败。但是在Person类中使用Person.garden
或者Person p1 = new Person(); p1.garden
是可以访问的,这是因为当前对象就是Person类对象。
总结下:
- private声明的属性表示是当前对象私有的,不允许其他类型对象访问;
- public声明的属性表示是当前对象向外公开的,可以被任何对象访问;
- protected声明的属性向本类对象和其子类对象公开,子类对象可以访问;
- priavate static声明的属性是类私有的属性,只向本类型对象公开;
- 以此类推。。。
四、类、抽象类和接口
类描述了一类对象的共同的行为和属性;抽象类描述了多个类共同的行为和属性;接口描述了多个类共同的行为。一组对象抽离出共同的行为和属性后就形成了类,多个类继续抽离出共同的行为和属性就成了抽象类,接口就是多个类(包含抽象类)抽离出共同的行为。
四、封装、继承和多态
- 封装:当前对象向外隐藏属性和实现细节,仅公开一个足够安全的访问接口供其他对象访问。
- 继承:现在有多个类具有很多公共的行为和属性,我们可以在每个类中都写一份这些共同的行为和属性,但是为了节省代码量,把多个类再次向上抽象,抽离出公共的行为和属性形成父类,通过继承父类完成了原先要达到的效果。
- 多态:A对象的行为依赖于一个通用的父类型的对象,通过传入不同的子类型对象可以改变A对象的行为。