继承

来源:互联网 发布:linux找文件夹命令 编辑:程序博客网 时间:2024/04/29 20:27
1.Java允许在一个类的声明中加入另一个类来实现继承,需要使用关键字extends;在java中,被继承的类叫做超类,继承类叫子类。
  a.超类是一个完全独立的类,超类也能使用自己;只能为自己创建的子类指定一个超类,java不支持一个子类继承多个超类,但可以创建类的层次结构,其中一个子类可以成为另一个子类的超类,当然一个类不能是自己的超类。
  b.被声明为private的成员会保持对它的类的私有属性,而类以外的任何代码,包括子类在内都无权访问这些私有成员,java程序员通常使用访问器方法来访问类的私有成员;private实例变量的声明没有严格的限制,如果只被自己类中的方法使用或者如果一个实例变量必须要在某一范围之内,就应该将其声明为私有,而且只能通过访问器方法来访问它。
  c.超类和子类都有自己的构造函数,其原则是:超类的构造函数构造对象的超类部分,而子类的构造函数则构造子类部分;当子类只定义一个构造函数时,只需简单的构造子类对象即可,对象的超类部分使用默认的构造函数来自动创建;当超类和子类都定义有构造函数时,必须使用一个java关键词super,其有两种基本形式:第一种工作方式是调用超类构造函数,第二种工作方式是用于访问被子类成员隐藏的超类成员。
  d.当使用super调用超类构造函数时,子类可以用下面形式的super来调用一个由超类定义的构造函数:super(parameter-list);其中parameter-list指定了超类中构造函数所需的任何参数,super必须是子类中第一个执行的语句,当一个子类调用时,super()即调用其直接超类的构造函数,故super()总是引用调用类的直接超类,在多级层次也是如此。
  e.当用super访问超类成员时,其工作方式与this相似,只不过它引用的是子类的超类,基本形式为:super.member,这里member是方法或实例变量,该形式多用于子类的成员名隐藏了超类中同名成员的情况   f.可以建立由任意多层继承组成的层次结构,一个子类可以是另外一个子类的超类,这时每一个子类都继承它所有超类的所有属性,而且总是引用最近的超类的构造函数;在类层次结构中,如果一个超类构造函数需要参数,那么无论子类是否需要自己的参数,所有的子类都必须把这些参数传递上去。
  g.在类层次结构中,构造函数的调用是按照继承的顺序,从超类到子类来进行的,而且由于super必须是子类构造函数中执行的第一条语句,因此无论是否使用super,构造函数的调用顺序都是相同的,若没有super就会执行每个超类的默认构造函数。
  h.Java是一种类型严格的语言,类型兼容与应用于原语类型的标准转换和自动转换一样都是被严格执行的,故一个类类型的引用变量通常不能引用一个其他类类型的对象,而只能引用自己类型的对象;但在Java的严格类型强制类型转换却有一个例外,即可以把对超类派生的子类的引用赋给一个超类的引用变量,但要注意的是成员的访问规则,当一个子类对象的引用被赋给一个超类引用变量时,只有权利访问对象的哪些超类定义的部分。
2.方法重写:在类层次中,当子类中的方法与其超类中的方法同名,且类型一致时,就称子类中的方法重写了超类种的方法;
  a.当在子类中调用一个被重写的方法时,它总是引用子类中定义的方法,而超类中的方法将被隐藏;如果要访问一个超类的被重写的方法,需要使用super;
  b.方法重写只在两个方法的名称于类型签名一致时才发生,如果有不一致的地方,就只是方法重名而已
  c.重写的方法支持多态性:方法重写组成了java最为强大的概念之一,即动态方法分配,动态方法分配是一种机制,通过该机制对一个被重写方法的调用会在运行时解决,而不是在编译时解决,这就是java运行时多态性的原理;java在解决运行时对被重写方法的调用时,其方法是,在调用发生时,引用的对象的类型来确定所要执行的方法,当调用不同类型的对象时,将调用被重写方法的不同版本,即被引用对象的类型(而非引用变量的类型)确定了所要执行的被重写方法,因此,如果超类包含了被子类重写的方法,那么当通过超类引用变量引用不同的对象类型时,就要执行不同版本方法。
  d.java中的被重写方法在目的上与C++中的虚函数一样,在操作上与其相似;重写方法使得java支持运行时的多态性,多态性是面向对象程序设计特性之一的原因在于:它使得一般类可以指定其所有派生类都可以共享的方法,同时允许子类定义这些方法,或这些方法中的一部分的具体实现,重写方法是java实现多态性的“单接口,多方法”的又一途径。
  e.成功应用多态性的关键在于理解超类和子类形成的可以从抽象过渡到具体的层次结构。正确使用层次结构,超类可以提供让子类使用的全部元素,而且它还定义了派生类自己实现的方法,这就使得子类可以灵活的定义自己的方法,尽管这还需要一个一致的接口,因此,通过将层次结构与被重写方法结合,超类可以定义出由子类使用的方法的基本形式。
3.使用抽象类:
  a.抽象方法是通过指定abstract类型修饰符来创建的,抽象方法没有内容,无需被超类执行,因此子类就必须重写它,否则会出现编译错误;
  b.声明抽象方法的基本形式为abstract type name(parameter-list);
  c.abstract只能用于修饰普通方法,不能用于static方法或者构造函数;
  d.包含一个或多个抽象方法的类必须通过在其class声明前添加abstract修饰符将其声明为抽象类;
  e.抽象类不定义完整的实现方式,所以抽象类没有自己的对象,任何使用new创建抽象类对象的尝试都会导致编译时的错误,但可以创建抽象类的对象的引用;
  f.当子类继承一个抽象类时,它必须实现超类中所有的抽象方法,否则也要定义子类为抽象类,若不则会收到一个编译错误,故abstract属性被继承直到达到一个完整实现方式为止。
4.在java中,如果要防止方法重写或类的继承,只需使用关键词final即可。
  a.为防止方法被重写,需要在方法声明的开始处把final指定为修饰符,如果重写它,就会导致编译错误;
  b.通过在类的声明前添加final可以防止类被继承,把类声明为fanal也就把所有的方法都隐式声明为fanal;把一个类既声明为abstract又声明为fanal是非法的。
  c.final还可以应用于变量来创建已命名常量,如果在类变量名前使用fanal,它的值在程序的生命期就不能改变,但为变量赋初值是允许的;
  d.final变量可以是static的,这样做允许通过类名而不是对象来引用常量。
5.Object类:java定义了一个Object特殊类,它是所有类的一个隐含的超类,这就意味着Object类型的引用变量可以引用任何类的对象,包括任何数组。Object类定义的方法如下:
  -Object clone()用于创建一个新的对象,它于被克隆的对象一模一样;
  -boolean equals(Object object)用于确定两个对象是否相等;
  -void finalize()用于在未使用的对象被回收之前调用;
  -Class<?extends Object> getClass()用在运行时获取对象的类,返回类型是java新增的泛化类型;
  -int hashCode()用于返回与调用对象相关的哈希代码;
  -void nitify()用于继续执行等待调用对象的线程;
  -void notifyAll()用于继续执行等待调用对象的所有线程;
  -String toString()用于返回描述对象的字符串,当使用println()输出对象时将自动调用该方法;
  -void wait()用于等待另一个线程的执行;
  -void wait(long milliseconds)
  -void wait(long milliseconds,int nanoseconds) 
原创粉丝点击