修饰符 class SubClass extends SuperClass
{
//类定义部分
}
每个类最多只能有一个直接父类
class SubClass extends Base
可以有无限个间接类
重写父类的方法:
如 鸵鸟不会飞
public class Bird
{
//Bird 类的fly方法
public void fly()
{
System.out.println("我在天空自由地翱翔");
}
}
public Ostrich extends Bird
{
//重写Bird的fly方法
public void fly()
{
System.out.println("我只能在地上奔跑");
}
}
方法的重写要遵循“两同两小一大”规则,“两同”即方法名同、型参同,“两小“指的是子类方法返回值类型应该比父类返回类型更小或相等,子类方法声明抛出的异常类应比父类方法抛出的异常类更小或相等。“一大“指的子类方法的访问权限应该比父类方法更大或相等,尤其要指出的是覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个方法类方法,一个是实例方法。
当子类覆盖了父类方法后,子类的对象将无法访问父类中被覆盖的方法,但可以在子类方法中调用父类中覆盖的方法。如需要在子类方法中调用父类中被覆盖的方法,可以用super(被覆盖的是实例方法)或者父类类名(被覆盖方法是类方法)作为调用者来调用父类中被覆盖方法。
如果父类方法具有private访问权限,则该方法对其子类是隐藏的,子类无法访问和重写。如果子类中定义了一个与父类private方法通明,同参数,同返回类型的方法依然不是重写,只是在子类中重新定义一个新方法。
父类实例得super引用
如果需要在子类方法中调用父类被覆盖的方法,可以使用super作为调用者来调用父类被覆盖的实例方法。
public void callOverrideMethod()
{
//在子类方法中通过super显式调用父类被覆盖的方法
super.fly();
}
java创建某个类的对象时,系统会隐式创建该父类的对象。只要有一个子类的对象存在,则一定存在一个与之对应的父类对象。在子类方法中使用super饮用,super总是指向作为该方法调用者的子类对象所对应的父类对象。this总是指向到调用该方法的对象,而super则指向this指向对象的父对象。
this不能出现在static修饰的方法中,super不能出现在static的方法中。static 修饰的方法属于类,该方法的调用可能是类,而不能使对象。
方法重载overload,方法重写override,重载主要发生在同一个累得多个同名方法之间,而重写发生在子类和父类的同名方法之间
如果子类定义了和父类同名的属性,也会发生子类属性覆盖父类属性,可以通过super来访问父类被覆盖的属性。
调用父类构造器
子类不获得父类的构造器,当有的时候子类构造器需要调用父类构造器的初始化代码,在子类构造器中调用父类构造器使用super来调用。
public Base
{
public double size;
public String name;
public Base(double size,String name)
{
this.size=size;
this.name=name;
}
}
public class Sub extends Base
{
public String color;
public Sub(double size,String name,String color)
{
//通过super调用父类构造器的初始化过程
super(size,name);
this.color=color;
}
public static void main(String[] args)
{
Sub s =new Sub(5.8,"ddd","red");
System.out.println(s.size+"-----"+s.name+"------"+s.color);
}}
使用super调用父类的构造器必须出现在子类构造器执行体的第一行。
不管是否使用super调用雷执行父类的构造器得初始化,子类构造器总会调用父类构造器一次。子类调用父类的构造器分下几种情况:
1:子类构造器执行体第一行使用super显示调用父类构造器,系统根据super调用里传入的参数列表调用父类的构造器
2:子类构造器执行体第一行使用this显式调用本类中重载的构造器,系统将根据this调用里传入的实参列表调用本类另一个构造器。执行本类中另一个构造器时即会调用父类的构造器
3:子类构造器执行体重即没有super调用,也没有this调用,系统将会在执行子类构造器之前,隐式调用父类无参数的构造器。
当调用子类构造器来初始化子类对象时。父类构造器总会在子类构造器之前执行,不仅如此,执行父类构造器时,系统还会再次上溯执行其父类的构造器。。。。以次类推,创建任何对象。最先执行的总是java.lang.Object类的构造器