黑马程序员——Java基础---深入理解面向对象(封装继承和多态)

来源:互联网 发布:大学生it就业培训中心 编辑:程序博客网 时间:2024/05/18 01:56

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

面向对象三个特征: 封装,继承,多态。

封装性:

       封装性将尽可能对外界公布一个有限的界面,而将其细节隐藏起来,与其他对象的交往通过这个界面进行,这就是封装性。

      因此,可以用private将属性封装起来,也可以用private封装函数,其语法如下:

              封装属性:private  属性类型  属性名

              封装函数:private  函数返回类型  函数名称(参数)

     注意:用private声明的属性或函数只能在其类的内部被调用,而不能在类的外部被调用。

继承性:

Java继承的特征

     (1)继承关系是传递的。若类C继承类B,类B继承类A,则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。
 
     (2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。
 
     (3)继承提供了功能。若软件复用类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。
 
     (4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
 
     (5)提供多重继承机制。从理论上说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这便是多重继承。Java出于安全性和可靠性的考虑,仅支持单重继承,而通过使用接口机制来实现多重继承。
 
      JAVA不支持多重继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时一个类可以实现多个接口,从而克服单继承的缺点。
     
实现继承的格式如下:
         class 子类名 extends 父类
Java类的继承可用下面的语法来表示:
class 父类     //定义父类          {}class 子类 extends 父类    //用extends 关键字实现类的继承          {}
多层继承的语法如下          
<pre class="java" name="code">          class A          {}          class B extends A          {}          class C extends B          {}

从代码可以看出,类B继承了类A,而类C又继承了类B,也就是说类B是类A的子类,而类C则是类A的孙类。
 
子类对象的实例化过程:
 子类对象在实例化会默认先去调用父类中的无参构造方法,之后在调用本类中的相应的构造方法。看一下代码可知:
class Person{   String name ;   int age ;   // 父类的构造函数   public Person()   {      System.out.println("1.public Person(){}") ;   }}class Student extends Person{   String school ;   // 子类的构造函数   public Student()   {      System.out.println("2.public Student(){}");   }}public class TestPersonStudentDemo1{   public static void main(String[] args)   {      Student s = new Student() ;   }}打印结果为:1.public Person(){}            1.public Person(){}

super关键字的使用
       super的主要功能是完成子类调用父类中的内容,也就是调用父类中的属性或方法。
        super关键字不仅可以用来调用父类中的构造方法,也可以用于调用父类中的属性或方法,其格式如下:super.父类中的属性;
    super.父类中的方法();
    注意:用super语句调用父类中的构造方法,只能放在程序的第一行。
    覆写
        “覆盖(重写)”的概念和“重载”相似,均是Java“多态”的技术之一。
         “重载”就是方法名称相同。
          当一个子类继承一个父类,而子类中的方法与父类中方法的名称、参数个数、类型等都完全一致时,就称子类中的这个方法覆盖了父类中的方法。同理,如果子类中重复定义了父类中已有的属性,则称此子类中的属性覆盖了父类中的属性。
例如看以下代码:
class Person{   String name ;   int age ;   public String talk()   {      return "我是:"+this.name+",今年:"+this.age+"岁";   }}class Student extends Person{   String school ;   public Student(String name,int age,String school)   {      // 分别为属性赋值      this.name = name ;      this.age = age ;      this.school = school ;   }   // 此处覆写Person中的talk()方法   public String talk()   {      return "我在"+this.school+"上学" ;   }}class TestOverDemo1{   public static void main(String[] args)   {      Student s = new Student("张三",25,"北京") ;      // 此时调用的是子类中的talk()方法      System.out.println(s.talk()) ;   }}

类的多态
    概念::一个对象变量可以指向多种实际类型的现象。
     1.多态的体现
          父类的引用指向了自己子类的对象
          父类的引用也可以接收子类的对象
     2.多态的好处
          多态的好处大大提高了程序的扩展性
     3.多态的前提
          必须是类与类之间的关系,要么继承,要么实现,通常还有一个前提,那就是存在覆盖
     4.多态的弊端
          提高了扩展性,但是只能使用父类的引用访问父类中的成员
     多态的转型:
          父类对象通过子类对象去实例化,这就是向上转型,但是向上转型会丢失精度。
          父类的对象可以转换为子类的对象,这时必须要进行强制的类型转换,这就是向下转型。
     在多态中成员函数的特点:
          在编译时期,参数引用类型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败
          在运行时期,参数对象所属的类中是否有调用的方法
     简单的结论就是:成员函数在多态是,编译看左边,运行看右边。
     在多态中成员变量的特点
          无论编译和运行,都参考左边(引用型变量所属的类)
     在多态中静态成员函数的特点
          无论编译和运行都参考左边
     方法的覆盖
          当子类从父类继承一个无参方法,而又定义了一个同样的无参方法,则子类新写的方法覆盖父类的方法,称为覆盖。(注意返回值类型也必须相同,否则编译出错。)如果方法参数表不同,则成重载。
    特点:
        1.对于方法的访问限制修饰词,子类方法要比父类的访问权限更高。
           父类为public,那么子类为private则出现错误。
        2.子类抛出的异常应该是父类抛出的异常或其子类。

0 1
原创粉丝点击