继承是面向对象的三大特征之一,每个之类只能有一个直接父类, 但是可以有多个间接父类
【修饰符】 class classA extends classB{ } 直接父类
【修饰符】 class classA extends classC{ } 间接父类
不能这样写【修饰符】 class classA extends classB,classC{ }
从子类角度,是子类扩展(extends)了父类,从父类角度,父类派生(derive)了子类。
也就是说,扩展和派生是同一动作,只是角度不同。
重写父类
public class Bird
{
// Bird类的fly()方法
public void fly()
{
System.out.println("我在天空里自由自在地飞翔...");
}
}
public class Ostrich extends Bird
{
// 重写Bird类的fly()方法
public void fly()
{
System.out.println("我只能在地上奔跑...");
}
}
如果父类的方法是private修饰的,在子类中无法重写的,即使看起来一样,其实只是子类一个新的方法
重载:overload 同一类多个同名方法之间
重写:子类和父类的同名方法
super.方法();
可以在子类调用父类被重写的方法。
在子类中定义私有实例变量来隐藏父类的同名变量。
class Parent
{
public String tag = "疯狂Java讲义"; //①
}
class Derived extends Parent
{
// 定义一个私有的tag实例变量来隐藏父类的tag实例变量
private String tag = "轻量级Java EE企业应用实战"; //②
}
public class HideTest
{
public static void main(String[] args)
{
Derived d = new Derived();
// 程序不可访问d的私有变量tag,所以下面语句将引起编译错误
// System.out.println(d.tag); //③
// 将d变量显式地向上转型为Parent后,即可访问tag实例变量
// 程序将输出:“疯狂Java讲义”
System.out.println(((Parent)d).tag); //④
}
}
调用父类构造器
子类不会获得父类的构造器,但子类构造器里可以调用父类构造器的初始化代码。
在子类构造器调用父类构造器用super
class 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.6 , "测试对象" , "红色");
// 输出Sub对象的三个实例变量
System.out.println(s.size + "--" + s.name
+ "--" + s.color);
}
}
在子类重载构造器调用另一个构造器用this
class Creature
{
public Creature()
{
System.out.println("Creature无参数的构造器");
}
}
class Animal extends Creature
{
public Animal(String name)
{
System.out.println("Animal带一个参数的构造器,"+ "该动物的name为" + name);
}
public Animal(String name , int age)
{
// 使用this调用同一个类中重载的构造器
this(name);
System.out.println("Animal带两个参数的构造器,"+ "其age为" + age);
}
}
public class Wolf extends Animal
{
public Wolf()
{
// 显式调用父类有两个参数的构造器
super("灰太狼", 3);
System.out.println("Wolf无参数的构造器");
}
public static void main(String[] args)
{
new Wolf();
}
}