JAVA-封装、继承、多态

  • 面向对象的三大基本特征

特征一:封装性

Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()setXxx()实现对该属性的操作,以实现下述目的

隐藏一个类中不需要对外提供的实现细节;

使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;

便于修改,增强代码的可维护性;

以上只是封装性的一种体现,其实从类及类的多种成员都可以根据需要,设置不同的权限修饰符,对调用进行控制。

对于程序设计,用户只需要知道类中某个方法实现了什么样的功能,需要该功能的时候直接去调用就行了,不用去关心方法内部的实现细节。

特征二:继承性

当多个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它类继承这个父类。继承后子类自动拥有了父类的属性和方法,比如猫,狗,他们共同的特征都是动物,有颜色,会跑,会叫等特征。我们可以把这些特征抽象成我一个Animal类(也就是父类)。然而他们也有自己独特的特性,比如猫会爬树,喵喵叫,狗会游泳,汪汪叫。于是我们就根据这些独特的特征分别抽象出来Cat,Dog类等。他们拥有Animal类的一般属性和方法,也拥有自己特有的某些属性和方法。

例如:

public class Person {

      public String name;

      public int age;

      public Date birthDate;

      public String getInfo() {...}

}

//Student类继承了父类Person的所有属性和方法,并增加了一个属性school。Person中的属性和方法,Student都可以利用。

public class Student extends Person{

      public String school;

}

作用:

继承的出现提高了代码的复用性。

继承的出现让类与类之间产生了关系,提供了多态的前提。

不要仅为了获取其他类中某个功能而去继承

在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。

关于继承的规则:

子类不能直接访问父类中私有的(private)的成员变量和方法。但是可以通过其他操作访问父类的成员变量和方法

一个子类只能有一个父类,但是一个父类可以有多个子类。可以结合现实的亲父子关系理解。 

子类的子类也是子类。即孙子也是爷爷的子类,N代都可以。

特征三:多态性

多态性(1)

多态性,是面向对象中最重要的概念,在java中有两种体现:

1.方法的重载(overload)和重写(overwrite)。

2.对象的多态性   ——可以直接应用在抽象类和接口上。

Java引用变量有两个类型:编译时类型运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。

若编译时类型和运行时类型不一致,就出现多态(Polymorphism

多态性(2)

对象的多态 :在Java中,子类的对象可以替代父类的对象使用

一个变量只能有一种确定的数据类型

一个引用类型变量可能指向(引用)多种不同类型的对象

例:

Person p = new Student();

Object o = new Person();//Object类型的变量o,指向Person类型的对象

o = new Student(); //Object类型的变量o,指向Student类型的对象

类可看做是特殊的父类,所以父类类型的引用可以指向子类的对象:向上转型(upcasting)

多态性(3)

一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法

  Student m = new Student();

  m.school = “pku”;   //合法,Student类有school成员变量

  Person e = new Student();

  e.school = “pku”;  //非法,Person类没有school成员变量

属性是在编译时确定的,编译时ePerson类型,没有school成员变量,因而编译错误。

虚拟方法调用(Virtual Method Invocation)

正常的方法调用

     Person e = new Person();

     e.getInfo();

    Student e = new Student();

    e.getInfo();

虚拟方法调用(多态情况下)

    Person e = new Student();

     e.getInfo();  //调用Student类的getInfo()方法

编译时类型和运行时类型

编译时ePerson类型,而方法的调用是在运行时确定的,所以调用的是Student类的getInfo()方法。——动态绑定

 

猜你喜欢

转载自blog.csdn.net/weixin_42236404/article/details/88594117