
java-面向对象三大特性:封装、继承、多态
封装
属性的修饰符
首先有4个访问修饰符:private;protected;public以及默认也就是前面什么都不加。
在企业中,建议一般将属性修饰符定义为private,为什么呢,因为是私有的,只有当前类可以访问。 这样就可以保证私密性,如果用public修饰那么谁都可以进入当前类,那不就可以随便看你的属性,这样多么不安全。以及在使用构造函数new对象时,如果随意给属性赋值那么会产生很严重的问题。
private 修饰属性后,通过getter以及setter来让创建的对象进行属性的取值和赋值
举一个栗子
封装的作用
- 对属性的访问进行控制
- 一个类对外隐藏实现的细节
最上面的栗子是对属性进行讲解,也就是第一个作用
第二个作用主要是作用于方法。
再举个栗子
我们启动汽车,无论是一键启动,还是用钥匙拧开,汽车都会启动,其实汽车启动的过程可以分解为喷油–活塞花点火–启动引擎。那么我们实际上都没有进行这些操作流程,那么就是系统自己将启动的过程封装成了一个方法叫启动,一旦用户点了启动,那么系统自己偷偷后台运行这些流程,我们用户无法调用喷油这个方法,点火这个方法以及启动这个方法。就是将这些方法隐藏起来了。
上代码
再写一个.java文件进行创建对象调用启动方法
继承
java只有单继承,也就是一个子类只能继承一个父类,换言之,只有一个爸爸。但是可以你继承你爸爸的,你爸爸继承你爷爷的,你爷爷继承你太爷爷的,一直这样继承下去,那么你就暗地里继承了你太爷爷的,你爷爷的。这样说人话,好理解,好记忆。
子类自动有了父类的属性和方法。这样就减少代码的冗余,便于维护和扩展。子类可以写自己的属性和方法。
继承使用extends关键字
举个栗子:如何继承减少代码冗余度。
上代码
有啥不能继承的
- 父类的构造函数能继承吗,(答案是不能,因为构造方法和类名同名,父类名和子类名怎么相同呢)
- 父类的私有的属性和方法,他们能继承吗,(答案是不能,因为构造方法和类名同名,父类名和子类名怎么相同呢)
访问修饰符
方法的重写
重写(overload)是子类继承父类时,父类写了某个方法,但是子类想用时,发现部分不是自己想要的或者是完全都不是自己想要的,那么就写一个和父类这个方法相同的方法名。那么在子类中调用该方法自动调用子类重写的方法。
举个栗子
看结果
可以使用@Override注解定义在方法上,用来检查该方法是否构成方法的重写。
栗子就在上面的代码那里
super关键字的用法
- super就是代指父类的对象
- super()就是调用父类的无参构造方法,和this()很像。
- super.属性和super.方法名()调用父类的属性和方法。这个一般使用在子类重写了父类方法,因为重写了父类方法,那么父类的该方法就不能被调用了
- super()必须写在方法中第一行,父类嘛,答谢当然要先写它。
看个栗子,子类重写了父类的方法,采用super.方法名()调用父类的方法,
举个栗子,super调用父类的构造方法
多态
使用父类的引用去指向子类的对象。
此时只能调用父类里面有的属性和方法。如果子类中有重写父类的方法,那么会调用子类的重写后的方法。
Father father = new Son();
//等号左边,用父类的变量
//等号右边,new 子类的对象
然后father这个对象名只能调用父类里面的方法。
如果子类里面有重写父类里面的方法,那么father.那个方法名(),实际上调用的是子类里面重写的方法。调用其他没有重写的方法,就调用父类里面的方法。
使用场景:
方法参数的多态
方法返回值的多态
现在父类是动物类,有方法:吃和睡。
一个子类:狗,有方法:吃,睡,狗叫,摇尾巴。
另一个子类:猫,有方法:吃,喝,猫叫。
有个主人类:有方法喂食物。
上代码。
