三、OO三大特性

  • A+
所属分类:Java基础回顾

三、OO三大特性

封装、继承、多态

  • 封装:类的概念,把属性和方法包装到一个程序单元中,进行了一定信息隐藏(setter/getter)
  • 继承:类的父子关系,子类可以继承父类的属性和方法,也可以重写扩展(父类私有无法继承)
    • 数量:只能单继承
    • 好处:复用性、节省代码
    • 注意:继承于抽象类的子类中,必须重写(实现)抽象方法
  • 多态:不同类对象对同一消息做出的反应
    • 对外一种表现形式 对内多种具体实现
    • 重写和重载也算多态(重写:运行期;重载:编译期)
    • 通常通过抽象类、接口实现多态

1、封装(类)

1、访问修饰符

  1. public
    1. 都可访问
  2. private
    1. 只有该类内部可访问
  3. protected
    1. 该类及其子类可访问,同一个包下的类也可访问
  4. 默认
    1. 同一个包内的类可访问
位置 public protected 默认 private
同一个类 Y Y Y Y
同一个包下的类 Y Y Y N
不同包子类 Y Y N N
不同包无关类 Y N N N

2、this

这里只提一个小点:构造方法调 其他构造必须放第一行

class A {
   
   public A(){
   }
   public A(Object o){
   
       this(); // 必须放第一行!!!
       // ...
   }
}

2、抽象类 abstract

  • 抽象:把多个事务的共性抽取出来

    • 比如十二生肖的共性就是它们都是动物,宏观概念上动物有的特性十二生肖都有
  • 抽象类:Java可以定义没有方法体的方法,该方法由其子类继承并具体实现,该方法我们称之为抽象方法,含有抽象方法的类被称为抽象类

    • 属性:没要求

    • 方法:静态、非静态都可以,可以有也可以没有抽象方法(修饰符:abstract,没有方法体)

    • 构造方法:有(但是不能实例化,为子类实例化)

    • 继承:单继承(必须重写抽象方法)

    • 注意:有抽象方法的类必须是抽象类,抽象类不一定有抽象方法

    • 栗子

      • // 抽象类必须由abstract修饰
        abstract class 抽象类{
                 
            public int num;
        
            public 抽象类() {
                 
                // 虽然我有构造器,但是依然不能实例化
            }
        
            // 抽象方法必须由abstract修饰
            public abstract int getNumAddOne();
        }
        

3、接口 interface

  • 概念:定义了一种规范

  • 好处:

    • 多实现(implements,一个类虽然只能继承一个父类,但是可以实现多个父接口)

      • interface A{
                 }
        interface B{
                 }
        interface C{
                 }
        class E{
                 }
        class F extends E implements A,B,C{
                 }
        
    • 多继承(extends,一个接口可以继承多个接口,没错,多继承!)

      • interface A{
                 }
        interface B{
                 }
        interface C extends A,B{
                  }
        
  • 注意:实现接口,必须重写抽象方法( jdk1.8接口可定义静态方法 )

  • 作用:解耦(降低程序间的依赖关系)高内聚低耦合

  • 特点

    • 属性:只能定义公开静态常量(public static final;不写的话默认也是这个)
    • 方法:公开抽象方法(public abstract;不写的话默认也是这个)、静态方法(jdk1.8+)
  • 栗子

    • public interface 接口 {
             
          // 接口属性只能用 public static final 修饰
          public static final double LENGTH = 2;
          // 默认也是 public static final
          double WIDTH = 0.1;
          // 接口方法全是抽象方法
          public abstract void charge();
          // 默认也是 public abstract
          void read();
      }
      

4、抽象类和接口

接口 抽象类
继承 多继承,多实现 单继承
属性 常量(public static final) 都可以
方法 抽象(public abstract)/静态(jdk1.8) 都可以(有抽象方法的类一定是抽象类)
构造 有(不能实例化,为子类实例化)
关系 like-a is-a
思想 不考虑事物的相关性
只是一种规范
用于一组相关的事物
总不能让狗继承抽象花吧
二者完全没有相关性
w3cjava

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: