【Java基础】(01)类,继承,接口

来源:互联网 发布:2016中国网络视频报告 编辑:程序博客网 时间:2024/06/06 02:45

【Java基础】(01)类,继承,接口

Auther: Thomas Shen
E-mail: Thomas.shen3904@qq.com
Date: 2017/10/13
All Copyrights reserved !

      • Java基础01类继承接口
        • 简述
        • Java类的定义
        • Java类的封装继承多态
          • 一 封装
          • 二 继承
          • 三 super的使用
          • 四 多态
        • 非访问控制符
          • 一 static
          • 二 final
          • 三 abstract
        • 接口Interface
        • 枚举
        • References


简述:

本文总结类Jave基础的类,继承,接口等相关的知识点。


Java类的定义:

类是组成Java程序的基本要素,是一类对象的原型,它封装了一类对象的状态和方法,它将变量与函数封装到一个类中。

构造方法(constructor )是一种特殊的方法,用来初始化(new)该类的一个新的对象,构造方法和类名同名,而且不写返回数据类型。

一般情况下,类都有一个至多个构造方法,如果没有定义任何构造方法,系统会自动产生一个构造方法,称为默认构造方法(default constructor),默认构造方法不带参数,并且方法体为空。

方法重载(overloading):多个方法有相同的名字,编译时能识别出来。这些方法的签名(signature)不同,或者是参数个数不同,或者是参数类型不同。通过方法重载可以实现多态(polymorphism)。

this用法:

构造方法中,还可以用this来调用另一构造方法。如:

    Person( )    {        this( 0, "" );        ……    }

在构造方法中调用另一构造方法,则这条调用语句必须放在第一句。

完整的类定义:

[public] [abstact|final] classclassName[extendssuperclassName] [implementsInterfaceNameList]{ //类声明    [public | protected | private] [static] [final] [transient] [volatile]type variableName;    //成员变量声明,可为多个    [public | protected | private] [static] [final | abstract] [native] [synchronized] returnTypemethodName( [paramList] ) [throwsexceptionList]    {//方法定义及实现,可为多个        statements    }}

有三种方法要求固定的声明方式:

  • 构造方法,声明为:
className( [paramlist] ){    ……}
  • main( )方法,声明为:
public static void main ( String args[ ] ){    ……}
  • finalize( )方法,声明为:
protected void finalize( ) throws throwable{    ……}

Java类的封装、继承、多态:

一. 封装:

封装性(encapsulation)就是把类(对象)的属性和行为结合成一个独立的相同单位,并尽可能隐蔽类(对象)的内部细节,对外形成一个边界,只保留有限的对外接口使之与外部发生联系。封装的特性使得类(对象)以外的部分不能随意存取类(对象)的内部数据(属性),保证了程序和数据不受外部干扰且不被误用。

通过访问修饰符来限制对类的属性和方法的访问,各修饰符含义如下:

  • Private:成员变量和方法只能在类内被访问,具有类可见性;
  • 默认: 成员变量和方法只能被同一个包里的类访问,具有包可见性;
  • Protected:可以被同一个包中的类访问,被同一个项目中不同包中的子类访问;
  • Public:可以被同一个项目中所有的类访问,具有项目可见性,这是最大的访问权限。

成员的访问控制符(权限修饰符):

修饰符 同一个类中 同一个包中 不同包中的子类 不同包中的非子类 private Yes - - - 默认 Yes Yes - - protected Yes Yes Yes - public Yes Yes Yes Yes
二. 继承:

继承是面向对象的三大特征之一,也是实现代码复用的重要手段。Java的继承具有单继承的特点,即只能继承自一个父类,每个子类只有一个直接父类,但是其父类又可以继承于另一个类,从而实现了子类可以间接继承多个父类,但其本质上划分仍然是一个父类和子类的关系。

Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类(有的也称其为基类、超类),父类和子类的关系,是一种一般和特殊的关系。就像是水果和苹果的关系,苹果继承了水果,苹果是水果的子类,水果是苹果的父类,则苹果是一种特殊的水果。

Java使用extends作为继承的关键字:子类扩展父类,将可以获得父类的全部属性和方法,这与汉语中得继承(子辈从父辈那里获得一笔财富成为继承)具有很好的类似性。

值得指出的是:Java的子类不能获得父类的构造器。
创建子类一般形式如下:

class 类名 extends 父类名{    子类体}  

子类与父类的变量、方法关系:

子类可以继承父类的所有特性,但其可见性,由父类成员变量、方法的修饰符决定。对于被private修饰的类成员变量或方法,其子类是不可见的,也即不可访问;对于定义为默认访问(没有修饰符修饰)的类成员变量或方法,只有与父类同处于一个包中的子类可以访问;对于定义为public或protected 的类成员变量或方法,所有子类都可以访问。

子类中可以声明与父类同名的成员变量,这时父类的成员变量就被隐藏起来了,在子类中直接访问到的是子类中定义的成员变量。

子类中也可以声明与父类相同的成员方法,包括返回值类型、方法名、形式参数都应保持一致,称为方法的覆盖。

三. super的使用:

如果在子类中需要访问父类中定义的同名成员变量或方法,需要用的关键字super。Java中通过super来实现对被隐藏或被覆盖的父类成员的访问。

super 的使用有三种情况:

  • 访问父类被隐藏的成员变量和成员方法;
    super.成员变量名;

  • 调用父类中被覆盖的方法,如:
    super.成员方法名([参数列]);

  • 调用父类的构造函数,如:
    super([参数列表]);

super( )只能在子类的构造函数中出现,并且永远都是位于子类构造函数中的第一条语句。

  • 使用父类的构造方法;

  • 构造方法是不能继承的;

    比如,父类Person有一个构造方法Person(String, int),不能说子类Student也自动有一个构造方法Student(String, int)。

  • 但是,子类在构造方法中,可以用super来调用父类的构造方法;

  • 使用时,super()必须放在第一句。
四. 多态:

多态性(Polymorphism)是指在继承关系中的父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或方法在父类及其各子类类中具有不同的含义。

Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就会出现所谓的多态.

父类对象与子类对象的转换:

类似于基本数据类型数据之间的强制类型转换,存在继承关系的父类对象和子类对象之间也可以在一定条件下相互转换。

  • 子类对象可以被视为其父类的一个对象,如一个Student对象也是一个Person对象。
  • 父类对象不能被当做其某一个子类的对象。
  • 如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数。
  • 如果父类对象引用指向的实际是一个子类对象,那么这个父类对象的引用可以用强制类型转换(casting)成子类对象的引用。

非访问控制符 :

一. static:
  • 用static修饰符修饰的方法仅属于类的静态方法,又称为类方法。
  • 与此相对,不用static修饰的方法,则为实例方法。
  • 类方法的本质是该方法是属于整个类的,不是属于某个实例的。
  • 声明一个方法为static有以下几重含义:

    1. 非static的方法是属于某个对象的方法,在这个对象创建时,对象的方法在内存中拥有自己专用的代码段。而static的方法是属于整个类的,它在内存中的代码段将随着类的定义而进行分配和装载,不被任何一个对象专有。

    2. 由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,即static方法只能处理本类中的static域或调用static方法。

    3. static方法中,不能访问实例变量,不能使用this 或super。

    4. 调用这个方法时,应该使用类名直接调用,也可以用某一个具体的对象名。

二. final:
  1. final类:
    如果一个类被final修饰符所修饰和限定,说明这个类不能被继承,即不可能有子类。

  2. final方法:
    final修饰符所修饰的方法,是不能被子类所覆盖的方法。

  3. final字段及final局部变量

    • final字段、final局部变量(方法中的变量)
      –. 它们的值一旦给定,就不能更改。
      –. 是只读量,它们能且只能被赋值一次,而不能被赋值多次。

    • 一个字段被static final两个修饰符所限定时,它可以表示常量,如Integer. MAX_VALUE(表示最大整数)、Math.PI(表示圆周率)就是这种常量。

    • 关于赋值:

      –. 在定义static final域时,若不给定初始值,则按默认值进行初始化(数值为0,boolean型为 false,引用型为null)。

      –. 在定义final字段时,若不是static的域,则必须且只能赋值一次,不能缺省。

      这种域的赋值的方式有两种:

      1. 一是在定义变量时赋初始值,
      2. 二是在每一个构造函数中进行赋值。

      –. 在定义final局部变量时,也必须且只能赋值一次。它的值可能不是常量,但它的取值在变量存在期间不会改变。

三. abstract:
  1. abstract类:

    • 凡是用abstract修饰符修饰的类被称为抽象类;
    • 抽象类不能被实例化。
  2. abstract方法:

    • 被abstract所修饰的方法叫抽象方法,抽象方法的作用在为所有子类定义一个统一的接口。对抽象方法只需声明,而不需实现,即用分号(;)而不是用{},格式如下:

          abstract returnTypeabstractMethod( [paramlist] );
    • 抽象类中可以包含抽象方法,也可以不包含abstract方法。但是,一旦某个类中包含了abstract方法,则这个类必须声明为abstract类。

    • 抽象方法在子类中必须被实现,否则子类仍然是abstract的。
非访问控制符 基本含义 修饰类 修饰成员 修饰局部变量 static 静态,非实例的,类的 可以修饰内部类 Yes - final 最终的,不可改变的 Yes Yes Yes abstract 抽象的,不可实例化的 Yes Yes -

接口(Interface) :

定义:

  • 接口是某种特征的约定;

  • 定义接口用interface
    – 所有方法都自动是public abstract的。

  • 实现接口用implements
    – 可以实现多继承 extends;
    – 与类的继承关系无关;

完整的接口定义:

[public] interface InterfaceName[extendssuperInterfaceList]{ //接口声明    type constantName= Value; //常量声明,可为多个    retumTypemethodName( [paramList] ); //方法声明,可为多个}

接口的作用:

  1. 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。从而在一定意义上实现了多重继承。
  2. 通过接口可以指明多个类需要实现的方法。
  3. 通过接口可以了解对象的交互界面,而不需了解对象所对应的类。

方法定义的格式为:

     returnType methodName( [paramlist] ); 

接口中只进行方法的声明,而不提供方法的实现,所以,方法定义没有方法体,且用分号;结 尾。在接口中声明的方法具有publicabstract属性。所以定义的时候这两个关键词是可以省略的。

另外,如果在子接口中定义了和父接口同名的常量或相同的方法,则父接口中的常量被隐藏,方法被重载。

接口的实现:

在类的声明中用implements子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口。

在类中实现接口所定义的方法时,方法的声明必须与接口中所定义的完全一致。

接口类型:

  • 接口可以作为一种引用类型来使用。任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类所实现的接口中的方法。Java运行时系统动态地确定该使用哪个类中的方法。

  • 把接口作为一种数据类型可以不需要了解对象所对应的具体的类,以前面所定义的接口Collection和实现该接口的类FIFOQueue为例,下例中,我们以Collection作为引用类型来使用。

接口中的常量:

•接口体中可以包含常量定义;
•常量定义的格式为:

    type NAME = value;

•其中type可以是任意类型,NAME是常量名,通常用大写,value是常量值。
•在接口中定义的常量可以被实现该接口的多个类共享,它与C中用#define以及C++中用const定义的常量是相同的。
•在接口中定义的常量具有public, static, final的属性。

Java8以上,接口成员还可以是:
- static方法
- 具有实现体的方法(default方法)
默认方法的好处是:提供了一个默认实现,子类在implements可以不用再重新写了


枚举 :

枚举类型定义方式:

    enum  Light { Red, Yellow, Green }

使用方式:

    Ligth light = Light.Red;    switch( light ) { case Red: ….. Break; }

*. 注意:case后面不写为Light.Red
*. Java中的枚举是用class来实现的,可以复杂地使用


References. :

  • [ 1 ]. Coursera | Java程序设计 | PKU
原创粉丝点击