java高级特性

来源:互联网 发布:金山手机数据恢复大师 编辑:程序博客网 时间:2024/05/18 03:34

1、继承

     继承是一种由已有的类创建新类的机制。利用继承,我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类,新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行为。由继承而得到的类称为子类,被继承的类称为父类(超类)。

     父类可以是自己编写的类也可以是java类库中的类。利用继承有利于实现代码的重复使用,子类只需要添加新的功能代码即可。Java不支持多重继承,即子类只能有一个父类。                      
      使用关键字extends来声明一个类是另外一个类的子类,格式如下:
          class 子类名 extends  父类名
                 {… ..
                  }
    通过继承可以简化类的定义 。
Java只支持单继承,不允许多重继承。
可以有多层继承,即一个类可以继承某一个类的子类,如类B继承了类A,类C又可以继承类B,那么类C也间接继承了类A。
子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法。在子类的构造方法中可使用语句super(参数列表) 调用父类的构造方法。
如果子类的构造方法中没有显式地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方法。 

2、方法的重写:

   子类通过extends关键字声明继承了父类的属性和方法,但子类可能觉得从父类继承过来的方法不能满足自己的要求。解决方法是子类可以通过重写(或覆盖)父类的方法。

  使用方法重写时,注意一下几点:

  1>子类重写的方法必须与父类被重写的方法具有相同的方法名称、参数列表和相同或相容的返回值类型,否则构不成重写。

  2>子类重写的方法不能比父类被重写的方法拥有更严格的访问权限。

  3>子类的静态方法不能被子类重写为非静态的方法。同样,父类中的实例方法也不能被子类重写为静态方法。

  4>方法重写只针对实例方法,父类中的静态方法,子类只能隐藏、重载和继承。

  5>父类中能被子类继承的实例方法,才会在子类中被重写。

  6>子类重写的方法不能比父类中被重写的方法声明抛出更多的异常。

3、 一、方法重写和方法重载具有以下相同点:

  1>都要求方法同名;

   2>都可以用于抽象方法和飞抽象方法之间;

    二、具有以下不同点:

   1>方法重写要求参数签名必须一致,而方法重载要求参数签名必须不一致;

   2>方法重写要求返回类型必须一致,而方法重载对此不做限制;

   3>方法重写只能用于子类从父类继承的实例方法,方法重载用于同一个类的所有方法(包括从父类继承而来的方法);

   4>方法重写对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没任何限制;

   5>父类的一个方法只能被子类重写一次,而一个方法在所在的类中可以被重载多次;

   6>构造方法能重载,但不能被重写。

4、super关键字

   若子类重写了父类中的方法或子类隐藏了父类中的数据成员,但又想访问父类的成员变量和方法,使用super关键字。

5、final

  final 具有“不可改变”的含义,他可以修饰非抽象类、非抽象成员方法和变量。

  (1)用final修饰的类不能被继承,没有子类。

  (2)用final修饰的方法不能被子类的方法重写或隐藏。

  (3)用final修饰的变量表示常量,只能被赋值一次。

  (4)父类中用private修饰的方法不能被子类的方法重写,因此private类型的方法默认是final类型的。

 6、抽象类

    在java中,只声明而没有实现的方法称为抽象方法,其语法规则如下:

      abstract<返回值类型><抽象方法>(<形式参数列表>);

    用abstract修饰的类称为抽象类。

    抽象类具有以下特性:

    1>含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被实现。

    2>抽象类中不是所有的方法都是抽象方法,可以在抽象类中声明并实现方法、

    3>抽象类的子类必须实现父类的所有抽象方法后才能实例化,否则这个子类也成为一个抽象类。

    4>抽象类不能实例化。

7、接口

   如果一个抽象类中的所有方法都是抽象的,而且这个抽象类中的数据成员都是final的常量,那么这个抽象类实际上就是一个接口,即一种特殊的抽象类。对于实现该接口的子类来说,接口不提供任何实现。接口是抽象方法和常量值定义的集合,而没有属性和方法的实现。

     接口具有以下特性:

    (1)接口中的常量默认为public static final,并且也只能是public  static final;

    (2)接口中只能定义抽象方法,而且这些方法默认为public abstract,并且也只能是public abstract类型;

    (3)接口可以继承其他接口,并添加新的属性和抽象方法;   

    (4)在接口中声明方法时,不能使用native、static、final、synchronized、private、protected等修饰符;

    (5)java中不允许类的多继承,但允许接口的多继承;

    (6)不允许创建接口的实例,但允许定义接口类型的引用变量,该变量引用实现了该接口的类的实例;

    (7)一个类只能继承另外一个类,但能同时实现多个接口,并且重写的方法必须显式声明为public。

8、权限修饰符:

   java中的public、protected、private和默认,这几个访问修饰符都置于类的每个成员前,用来控制不同的访问权限。

  (1)private访问权限:

     如果一个成员方法或者成员变量使用了private访问控制符,那么这个成员只能在这个类的内部使用,其他类不能访问。

  (2)默认访问权限:

    对于默认的访问控制成员,可以被这个包中的其他类访问。

    位于同一个包中的子类可以访问父类中的默认访问控制成员。

    但如果子类与父类位于不同的包中,则子类不能访问父类中的默认访问控制成员。

  (3)protected访问权限:

   如果一个成员变量或成员方法前使用了protected访问权限,那么这个成员既可以被同一包中的其他类访问,也可以被位于同包继承此父类的子类访问,但不能被不同包的类访问。

  (4)public访问权限:

    这个成员可以被所有的类访问,不管访问类与被访问类是否位于同一包中,以及是否有继承关系。

  一、类内部

   在一个类的内部,气定义的四种不同的成员变量和成员方法,在整个类中都是可见的。

  二、同一包中的类

   除了private类型的所有成员变量和成员方法,一个类可以访问位于同一个包中的另一个类中的成员变量和成员方法。

  三、不同包的子类

   如果类B继承位于不同包中的类A,那么类B只能访问类A中protected与public类型的成员变量和成员方法,不能访问类A中private与default类型的成员变量和成员方法。

  四、通用性

   如果类A和类B位于不同包,并且两者之间并没有继承关系,那么类B只能访问类A中public类型的成员变量和成员方法,其他类型的都不能访问。

   五、访问权限与继承

  父类中那些成员能够子类继承?其规则

  (1)构造方法是不能被继承的;

  (2)private修饰的成员是不能被继承的;

  (3)默认访问权限成员,可能被继承,也可能不能继承。当子类与父类处于同一包中时,这些成员会被继承,当子类与父类处于不同包时,这些成员不能被继承的;

  (4)protected与public修饰的成员总是能被继承的;

  (5)能被子类访问的成员,才会被子类继承;

  (6)能被子类继承的实例方法,才会子类重写或重载;

  (7)能被子类继承的static方法,才会被子类隐藏或重载;

  (8)能被子类继承的数据成员,才会被子类隐藏。

 

原创粉丝点击