1.1 面向对象特性

129 阅读1分钟

面向对象特性?

封装:

利用抽象数据类型将数据和基于数据的操作封装在一起,使其成为一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。

优点

1.减少耦合: 可以独立地开发、测试、优化、使用、理解和修改
2.减轻维护的负担: 可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
3.有效地调节性能: 可以通过剖析确定哪些模块影响了系统的性能
4.提高程序的复用性
5.降低了构建大型系统的风险: 即使整个系统不可用,但是这些独立的模块却有可能是可用的

以下 Person 类封装 name、sex、age 等属性,外界只能通过 get() 方法获取一个 Person 对象的 name 属性和 sex 属性,而无法获取 age 属性,但是 age 属性可以供 work()方法使用。

public  class  Person{
        private String name;
        private int  sex;
        private  int age;

        public String getName(){

        return this.name;
        }

        public String getSex(){

        return this.sex==1?"男":"女";
        }
        public  void   work(){
                if(age>55){
                System.out.println(name+"退休了");

                }else if(age<18){
                System.out.println(name+"未成年");

                }else{
                System.out.println(name+"正常上班");

        }

        }


}


继承

继承实现了 IS-A 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。

继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。

Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 向上转型

Car car=  new BMW();


多态

多态分为编译时多态和运行时多态:

  • 编译时多态主要指方法的重载
  • 运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定

运行时多态有三个条件:

  • 继承
  • 覆盖(重写)
  • 向上转型

下面的代码中,乐器类(Instrument)有两个子类: Wind 和 Percussion,它们都覆盖了父类的 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是父类的方法。

public class Instrument {
    public void play() {
        System.out.println("乐器正在演奏..."); 
    } 
} 
public class Wind extends Instrument { 
    public void play() {
        System.out.println("Wind正在演奏..."); 
    } 
}
public class Percussion extends Instrument {
    public void play() { 
        System.out.println("Percussion正在演奏..."); 
    } 
}
public class Music { 
        public static void main(String[] args) { 
            List<Instrument> instruments = new ArrayList<>(); 
            instruments.add(new Wind()); 
            instruments.add(new Percussion());
            for(Instrument instrument : instruments) {
            instrument.play(); 
            }
        }
}

结果
 Wind正在演奏...
 Percussion正在演奏...