当前位置:   article > 正文

Java面向对象的三大特征_java面向对象的三大特性

java面向对象的三大特性

目录

1. 封装

1.1 封装的概念

1.2 封装的好处

1.3 封装的步骤

1.4 代码实现

2. 继承

2.1 继承的概念

2.2 代码实现

2.3 继承的优点

2.4 继承的特点

2.5 子类成员的访问

2.6 构造器的访问

2.7 访问权限修饰符

2.8 方法重写

3. 多态

3.1 多态的概念

3.2 多态的前提条件        

3.3 代码实现

3.4 行为多态

3.5 多态的弊端


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

1. 封装

1.1 封装的概念

        封装就是对外部隐藏细节,提供简单易用的方法,便于外界调用,从而提高系统的可扩展性、可维护性。使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑限制对属性的不合理操作。

1.2 封装的好处

        1. 隐藏实现细节。比如现在有一个方法对数组转换成想要的字符串形式,只需要传入一个数组参数即可,调用者并不关心是怎么实现的。

        2. 可以对数据进行验证,保证数据的安全性和合理性(在set方法里面可以加入控制逻辑限制对属性的不合理操作)。

        3. 将属性设置为private修饰,外部就无法直接赋值,必须通过set方法才能设置属性值。

1.3 封装的步骤

        1. 将成员变量(属性)私有化

        2.提供成套公开的的getXxx()方法和setXxx()方法供外部访问

1.4 代码实现

  1. public class Student {
  2. //将成员变量私有化
  3. private int age;
  4. //提供成套的getXxx()和setXxx()方法供外部访问
  5. public int getAge() {
  6. return age;
  7. }
  8. public void setAge(int age) {
  9. //在设置属性值时,可以加入控制逻辑限制对属性的不合理操作
  10. if (age < 0 || age > 150) {
  11. System.out.println("您的年龄有误,赋值失败");
  12. return;
  13. }
  14. this.age = age;
  15. }
  16. }

2. 继承

2.1 继承的概念

        当多个类之间拥有同名的成员(成员变量/成员方法),可以把这些成员抽取出来放到父类中,然后子类只需要通过extends关键字继承父类,便可以拥有这些成员,而不需要重新定义这些成员。 

2.2 代码实现

  1. public class Test {
  2. public static void main(String[] args) {
  3. Dog dog = new Dog();
  4. dog.eat(); //输出 "动物吃饭"
  5. }
  6. }
  7. class Animal{
  8. public void eat(){
  9. System.out.println("动物吃饭");
  10. }
  11. }
  12. class Dog extends Animal{
  13. //Dog类继承了Animal类,所以拥有了Animal类的非私有成员
  14. }

2.3 继承的优点

        1. 提高了代码复用性,不用编写重复的代码。

        2. 提高了代码的可扩展性和可维护性。

2.4 继承的特点

        1. 通过继承,子类继承了父类非私有的成员变量和成员方法。

        2. 在Java中,不支持多继承,也就是一个类不能同时继承多个类。但支持多层继承,也就是说类A继承类B,类B继承类C。

        3. 在Java中,所有类的祖宗类是Object,要么直接继承Object,要么间接继承Object。(一个类没有显示的用extends关键继承另一个类,那么这个类默认继承Object)

2.5 子类成员的访问

        1. 根据就近原则访问(先子类局部范围找,然后子类成员范围找,然后父类成员范围找,如果父类范围还没有找到则报错)。

        2. 访问子类的同名变量:this.name

        3. 访问父类的同名变量:super.name

2.6 构造器的访问

        1. 子类构造器的特点:子类的全部构造器,都会先调用父类的构造器,再执行自己。

        2.子类构造器调用父类构造器方式:默认情况下,子类全部构造器的第一行代码都是 super() (写不写都有) ,它会调用父类的无参数构造器。如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写super(…),指定去调用父类的有参数构造器。

        3. this(…)和super(…) :可以通过this(…) 去调用该类的其他构造器,通过super(...)去调用父类的构造器。this(…)和super(…) 都只能放在构造器的第一行,因此,两者不能同时使用。

2.7 访问权限修饰符

本类同一个包下的类其他包下的子孙类其他包下的任意类
private
缺省
protected
public

权限修饰符大小比较:private < 缺省 < protected < public

2.8 方法重写

          如果父类中的方法不足以满足子类的需求,子类中可以重写父类的方法,覆盖掉父类中的方法,这样在调用该方法时就会执行子类重写后的方法。

  1. public class Test {
  2. public static void main(String[] args) {
  3. Dog dog = new Dog();
  4. dog.eat(); //输出 "狗啃骨头"
  5. }
  6. }
  7. class Animal{
  8. public void eat(){
  9. System.out.println("动物吃饭");
  10. }
  11. }
  12. class Dog extends Animal{
  13. //重写父类的eat方法
  14. @Override
  15. public void eat() {
  16. System.out.println("狗啃骨头");
  17. }
  18. }

方法重写注意事项: 

        1.  建议对重写方法加上@Override注解,代码可读性会更好
        2. 访问权限必须大于等于父类的访问权限
        3. 返回值类型必须小于等于父类的返回值
        4. 私有方法以及静态方法不能被重写,否则报错

3. 多态

3.1 多态的概念

        多态指的是同一个方法调用,由于对象不同可能会有不同的行为。比如吃饭,中国人吃饭用筷子,印度人吃饭用手,英国人吃饭用刀叉。

3.2 多态的前提条件        

        1. 存在继承关系

        2. 存在父类引用指向子类对象(父类 变量名 = new 子类();)

        3. 存在方法重写

3.3 代码实现

  1. public class Test {
  2. public static void main(String[] args) {
  3. People chinese = new Chinese(); //多态的前提条件之二:父类引用指向子类对象
  4. chinese.eat(); //输出"中国人吃饭用筷子"
  5. People british = new British(); //多态的前提条件之二:父类引用指向子类对象
  6. british.eat(); //输出"英国人吃饭用刀叉"
  7. }
  8. }
  9. class People{
  10. //吃饭方法
  11. public void eat(){
  12. System.out.println("吃饭");
  13. }
  14. }
  15. class Chinese extends People{ //多态的前提条件之一:存在继承关系
  16. //多态的前提条件之三:重写父类的方法
  17. @Override
  18. public void eat() {
  19. System.out.println("中国人吃饭用筷子");
  20. }
  21. }
  22. class British extends People{ //多态的前提条件之一:存在继承关系
  23. //多态的前提条件之三:重写父类的方法
  24. @Override
  25. public void eat() {
  26. System.out.println("英国人吃饭用刀叉");
  27. }
  28. }

3.4 行为多态

  1. 多态是行为(方法)的多态,不是属性的多态(多态与属性无关)。

  1. public class Test {
  2. public static void main(String[] args) {
  3. People chinese = new Chinese();
  4. System.out.println(chinese.name); //输出"人",因为属性没有多态性
  5. chinese.eat(); //输出"中国人吃饭用筷子",因为多态是行为(方法)的多态
  6. }
  7. }
  8. class People{
  9. String name = "人";
  10. public void eat(){
  11. System.out.println("吃饭");
  12. }
  13. }
  14. class Chinese extends People{
  15. String name = "中国人";
  16. @Override
  17. public void eat() {
  18. System.out.println("中国人吃饭用筷子");
  19. }
  20. }

3.5 多态的弊端

        在使用多态时,有个弊端就是无法使用子类独有的功能。解决方法是:使用强制类型转换后再调用子类独有的功能。强制类型转换之前建议先用instanceof关键字判断当前对象所属类,否则可能出现类型转换异常。

  1. public class Test {
  2. public static void main(String[] args) {
  3. People chinese = new Chinese();
  4. //chinese.fun(); //报错,多态下无法使用子类独有的功能
  5. if (chinese instanceof Chinese) { //强转前,建议使用instanceof关键字判断
  6. Chinese c = (Chinese) chinese;
  7. c.fun(); //强转后,可以使用子类独有的功能
  8. }
  9. }
  10. }
  11. class People{
  12. public void eat(){
  13. System.out.println("吃饭");
  14. }
  15. //父类中并没有fun()方法
  16. }
  17. class Chinese extends People{
  18. @Override
  19. public void eat() {
  20. System.out.println("中国人吃饭用筷子");
  21. }
  22. public void fun() {
  23. System.out.println("子类独有的功能");
  24. }
  25. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/237725
推荐阅读
相关标签
  

闽ICP备14008679号