java -- 面向对象的三大特性(封装,继承,多态)

一.封装

1.什么是封装?

  把抽象的数据和对数据的操作封装在一起,隐藏变量的实现细节。数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行访问。

2.封装的步骤? 

   1.使用private 修饰需要封装的成员变量。

   2.提供一个公开的方法设置或者访问私有的属性。通过(get/set)方法获取

3.封装的好处与作用?

  封装的作用:1. 框架  2. 工具类

  封装的好处:  1. 提高了数据的安全性   2. 操作简单   3. 隐藏了方法的实现。

二.继承

1.继承的格式?

  A extends B
  A: SubClass 子类
  B:SuperClass,超类,父类,基类

扫描二维码关注公众号,回复: 7379922 查看本文章

2.封装的好处?

  1.减少代码的冗余,提高代码的复用性  2.提高了代码的扩展性  3.为多态提供了前提

3.说明?

  1.子类继承父类以后就拥有了父类中的属性和方法(我们不认为可以继承父类中的构造器)
  2.子类继承父类一定要存在"is a"的关系
  3.父类中属性被私有化后,子类不能直接进行访问,但是我们可以通过间接的方式进行访问(set/get),虽然父类中的属性不能被直接访问,但是我们还是认为该属性被继承到了。
  4.子类除了可以继承属性和方法外,还可以在定义自己独有的属性和方法
  5.父类的概念是相对的,父类分为:直接父类和间接父类
  6.子类除了可以获取直接父类的属性和方法外,还可以获取间接父类的属性和方法
  7.所有类都会继承Object类。如果一个类没有显示的继承某个类,那么这个类将默认继承Object类
  8.一个父类可以有多个子类,但是一个子类只能有一个父类(Java的单继承特性)

4.方法的重写?

  子类继承父类后,如果对父类中的方法不满意那么可以考虑使用方法的重写(覆盖,重写)

  说明:

    1.子类继承父类后,如果对父类中的方法进行了重写,那么在通过子类对象调用父类中被重写的方法,实际调用子类重写的方法。

  细节: 

    权限修饰符 返回值类型 方法名(形参列表){
      方法体
    }

    

    1.父类被重写的方法和子类重写的方法的方法名和形参列表必须相同
    2.父类重写的方法的权限修饰符不小于子类重写方法的权限修饰符
      父类被重写的方法的返回值    子类被重写方法的返回值     结果
        Number            Number及Number的子类         可以
        void              void               可以
        int              double            不可以
    3.子类方法抛出的异常不能大于父类被重写方法的异常

    注意:

      1.如果父类的方法被private修饰那么该方法不可以被子类重写
      2. 如果和子类相同的方法,那么同时加static(不是方法的重写)要么不加static(是方法的重写)

    4.@Override //注解:用来说明当前的方法是一个重写的方法

总结:super 和 this 的区别:

     1.代表的事物不一样:

          this:代表所属方法的调用者对象。

          super:代表父类对象的引用空间。

      2.使用前提不一致:

          this:在非继承的条件下也可以使用。

          super:只能在继承的条件下才能使用。

      3.调用构造方法:

           this:调用本类的构造方法。

           super:调用的父类的构造方法

三.多态

1.多态性:一类事物的多种形态  

2. 多态性的理解:
  1.广义上:方法的重写,重载,子类对象的多态性
  2.狭义上:子类对象的多态性
3.子类对象的多态性:父类的引用指向子类的对象

public class Test {
    
    public static void main(String[] args) {
        
        // 父类的引用指向子类的对象
        Person p = new Woman();    
        // 虚拟方法应用(动态绑定):编译看左边,运行看右边
        p.eat();
        p.show();
        
        // 多态的缺点:不能调用子类中独有的方法和属性
        
        /*
         * 需求: 在多态的情况下如何调用子类中自己独有的方法和属性
         * 向下转型
         */
        
        Woman woman = (Woman)p;
        woman.buy();
        
        // ClassCastException    -      类型转换异常
        // 因为P对象的本身就是一个Woman所以转成Man就会抛异常
//        Man m = (Man)p;
//        m.run();
        
        /*
         * 需求:如何防止类型转换异常
         * a instanceof A:    a 对象是否是A类型的一个实例。如果是返回true,否则返回false
         */
        
        if(p instanceof Woman) {
            System.out.println("true");
        }else {
            System.out.println("false");
        }
        

    }
}

猜你喜欢

转载自www.cnblogs.com/jiujiang/p/11601076.html