一、继承
继承:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
子类和父类:
可以访问的数据域和方法,还可以添加新的数据域和方法。
继承关键字
1.extend
在Java中类的继承是单一继承,一个子类只能拥有一个父类,使用extend只能继承一个类。
public class GeometricObject{
private String color = "white";
private java.util.Date dateCreated;
public GeometricObject() {
dateCreated = new java.util.Date();
}
public GeometricObject(String color, boolean filled) {
dateCreated = new java.util.Date();
this.color = color;
this.filled = filled;
}
public String getcolor(){
return color;
}
public void setColor(String color){
this.color = color;
}
public java.util.Date getDateCreated(){
return dateCreated;
}
public String toString() {
return "created on" + dateCreated + "\ncolor: " + color + "and filled: " +
filled;
}
}
public class Circle extend GeometricObject{
private double radius;
public Circle(){
}
public void printCircle(){
System.out.println("The circle's radius is" + radius);
}
}
2.super
要点:关键字super指代父类,可以用于调用父类中的普通方法和构造方法
调用父类构造方法的语法:
super() 或者 super(arguments)
public Circle(double radius,String color){
super(color);
this.radius = radius;
}
调用父类的普通方法:
关键字super不仅可以引用父类的构造方法,也可以引用父类的方法:
super.方法名(参数)
如重写Circle类中的printCircle()方法:
public void printCircle(){
System.out.println("The circle is created" + super.getDateCreated());
}
方法重写
要重写一个方法,需要在子类中使用父类和父类一样的签名来对该方法进行定义。
在上面GeometricObject类中的ToString方法,该方法可以被重写,为了重写它,要在子类Circle中加入下面的新方法:
public class Circle extend GeometricObject{
public String toString(){
return super.toString() + "\nrsdius is + + radius;
}
}
重写时需要注意:
重写的方法必须与被重写的方法具有一样的签名,以及一样或者兼容的返回类型。
只有当实例方法可访问时,它才能被重写。
与实例方法一样,静态方法也能被继承,但是,静态方法不能被重写。
二、多态
多态:多态是同一个行为具有多个不同表现形式或形态的能力。
举一个简单的例子:森林里面有很多的动物,他们都有一个共同的行为------吃,而有些动物吃肉,有一些动物吃的是草。所以多态就是对于吃这一行为来说,不同的动物对吃这一行为所表现的行为都不尽相同。
多态案例:
需要注意的是:当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后方法。如果子类没有重写该方法,就会调用父类的该方法。
定义父类:
public class Animal {
public void eat() {
System.out.println("动物都会吃东西!!!");
}
}
定义肉食动物类:
public class Tiger extends Animal{
public void eat() {
System.out.println("老虎喜欢吃肉!");
}
}
定义食草动物类:
public class Horse extends Animal{
public void eat() {
System.out.println("马喜欢吃草!");
}
}
测试:
public class Test {
public static void main(String[] args) {
Animal animal = new Cat(); // 多态形式,创建虎类对象
animal.eat(); // 调用的是Tiger的 eat
Animal animal2 = new Dog(); // 多态形式,创建马类对象
animal2.eat(); // 调用的是Horse的eat
}
}
输出:
老虎喜欢吃肉!
马喜欢吃草!
多态的好处 :
提高了代码的拓展性,使用父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用。