一、继承extends
1、基本术语:
在Java 术语中,如果类Cl 扩展自另一个类C2, 那么就将Cl 称为次类( subclass), 将C2 称为超类(superclass)。
超类也称为父类或基类。
次类又称为子类、扩展类或派生类。
public class parentclasstest{
...
public String toString(){
return "rrrrr";
}
...}
public class childclasstest extends parentclasstest{
...}
2、子类和父类的关系:
子类从它的父类中继承所有可访问的数据域和方法,且子类自身还可以拥有新数据域和新方法。
子类不继承父类的构造方法,只能用关键字super从子类的构造方法中调用。
super(); // 调用父类的无参构造方法
super(arguments); // 调用与参数匹配的父类的构造方法
// 必须出现在子类构造方法的第一行,这是显式调用父类构造方法的唯一方式!!
3、多重继承:
某些程序设计语言是允许从几个类派生出一个子类的,这种能力称为多重继承。
但是在java中是不允许多重继承的,一个Java类只能直接继承自一个父类,这种限制称为单一继承。
如果使用extends关键字来定义一个子类,它只允许有一个父亲;多重继承可以通过接口来实现。
4、构造方法链
当构造一个子类的对象时,子类构造方法会在完成自己的任务之前,首先调用它的父类的构造方法。
如果父类继承自其他类,那么父类构造方法又会在完成自己的任务之前,调用它自己的父类的构造方法。
这个过程持续到沿着这个继承体系结构的最后一个构造方法被调用为止。这就是构造方法链(constructor chaining)。
5、方法重写
- 子类从父类中继承方法。有时,子类需要修改父类中定义的方法的实现,这称作方法重写(method overriding)。
- 要重写(覆盖)一个方法,需要在子类中使用和父亲一样的签名以及一样的返回值类型来对该方法进行定义。
public class childclasstest extends parentclasstest{
...
public String toString(){ //在子类中使用和父亲一样的签名以及一样的返回值类型
return super.toString() +radius ;
}
}
- 私有方法在它的类本身以外是不能访问的,所以它不能被覆盖,如果子类中定义的方法在父类中是私有的,那么这两个方法完全没有关系。
- 与实例方法一样,静态方法也能被继承。但是,静态方法不能被覆盖。如果父类中定义的静态方法在子类中被重新定义,那么在父类中定义的静态方法将被隐藏。可以使用语法:父类名.静态方法名调用隐藏的静态方法。
6、方法重载
方法重写 |
方法重栽 |
子类中提供一个对方法的新的实现 |
使用同样的名字但是不同的签名来定义多个方法 |
具有同样的签名和返回值类型 |
载具有同样的名字,但是不同的参数列表 |
发生在通过继承而相关的不同类中 |
方法重载可以发生在同一个类中,也可以发生在由于继承而相关的不同类中。 |
- 为了避免错误,可以使用一个特殊的Java 语法,称为重写标注( override annotation),在子类的方法前面放一个©Override
public class childclasstest extends parentclasstest{
...
@Override
public String toString(){ //在子类中使用和父亲一样的签名以及一样的返回值类型
return super.toString() +radius ;
}
}
7、多态
- 如果在定义一个类时没有指定继承性,那么这个类的父亲就被默认为是Object,java中所有类都继承自java.lang.Object类。
- 如果一个方法的参数类型是父类(例如:Object), 可以向该方法的参数传递任何子类(例如:Circle 类或String 类)的对象。这称为多态。
- 多态意味着父类的变量可以引用子类的对象
8、protected
允许子类访问定义在父类中的数据域或方法,但不允许非子类访问这些数据域和方法。
子类可以重写父类中的protected方法,并把它的可见性改为public,但是子类不能削弱父类中定义的方法的可访问性。例如:如果一个方法在父类中被定义为public,在子类中也必须为public。子类方法的可访问性必须大于等于父类方法的可访问性。
private :只能用于类的成员,可以完全隐藏类的成员,不能从类外直接访问它们。
(default) :允许同一个包里的任何类直接访问类的成员。
Protected:只能用于类的成员,允许任何包中的子类或同一包中的类访问类的成员。
public :修饰符允许任意类访问类的成员。
final,防扩展和重写
一个被final 修饰的类和方法都不能被扩展,表明一个类是最终类,是不能作为父类的。被final 修饰的数据域是一个常数。