Java范例中的继承
Java中的继承是面向对象编程的核心概念之一。
当对象之间存在is-关系时,将使用Java继承。
Java中的继承是使用extends
关键字实现的。
Java中的继承
Java中的继承是通过从其他类继承来在类之间创建层次结构的方法。
Java继承是可传递的-因此,如果"轿车扩展Car"和"汽车扩展Vehicle",那么Sedan也将从Vehicle类继承。
车辆成为轿车和轿车的超类。
继承在Java应用程序中被广泛使用,例如,扩展Exception类以创建特定于应用程序的Exception类,该类包含更多信息,例如错误代码。
例如NullPointerException。
Java继承示例
java中的每个类都隐式扩展了java.lang.Object类。
因此,Object类是Java中继承层次结构的最高级别。
让我们通过一个简单的示例来了解如何在Java中实现继承。
超类:动物
package com.theitroad.comheritance; public class Animal { private boolean vegetarian; private String eats; private int noOfLegs; public Animal(){} public Animal(boolean veg, String food, int legs){ this.vegetarian = veg; this.eats = food; this.noOfLegs = legs; } public boolean isVegetarian() { return vegetarian; } public void setVegetarian(boolean vegetarian) { this.vegetarian = vegetarian; } public String getEats() { return eats; } public void setEats(String eats) { this.eats = eats; } public int getNoOfLegs() { return noOfLegs; } public void setNoOfLegs(int noOfLegs) { this.noOfLegs = noOfLegs; } }
动物是这里的基类。
让我们创建一个从Animal类继承的Cat类。
子类别:cat
package com.theitroad.comheritance; public class Cat extends Animal{ private String color; public Cat(boolean veg, String food, int legs) { super(veg, food, legs); this.color="White"; } public Cat(boolean veg, String food, int legs, String color){ super(veg, food, legs); this.color=color; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } }
注意,我们使用extends
关键字在Java中实现继承。
Java继承测试程序
让我们编写一个简单的测试类来创建Cat对象并使用其某些方法。
package com.theitroad.comheritance; public class AnimalInheritanceTest { public static void main(String[] args) { Cat cat = new Cat(false, "milk", 4, "black"); System.out.println("Cat is Vegetarian?" + cat.isVegetarian()); System.out.println("Cat eats " + cat.getEats()); System.out.println("Cat has " + cat.getNoOfLegs() + " legs."); System.out.println("Cat color is " + cat.getColor()); } }
Java继承程序输出
下图显示了上述程序的输出。
Cat类没有getEats()方法,但仍然有效,因为它是从Animal类继承的。
Java继承要点
代码重用是继承的最重要好处,因为子类继承了超类的变量和方法。
子类不能直接访问超类的私有成员。
如本例所示,Cat类无法访问Animal变量noOfLegs,但可以通过getter和setter方法间接访问。具有默认访问权限的超类成员只有在同一个程序包中才可以访问子类。
父类不继承超类的构造函数。
如果超类没有默认的构造函数,则子类也需要定义一个显式的构造函数。
否则将抛出编译时异常。
在子类构造函数中,在这种情况下,必须调用超类构造函数,并且它应该是子类构造函数中的第一条语句。Java不支持多重继承,子类只能扩展一个类。
Animal类隐式地扩展了Object类,Cat类扩展了Animal类,但是由于java继承的传递性质,Cat类也扩展了Object类。我们可以创建一个子类的实例,然后将其分配给超类变量,这称为upcasting。
以下是上播的简单示例:将超类的实例分配给Subclass变量后,其称为向下转换。
我们需要将其显式转换为Subclass。
例如;
请注意,由于显式转换,即使我们做错了,编译器也不会抱怨。
以下是一些在运行时会抛出" ClassCastException"的情况。我们可以在子类中重写Superclass的方法。
但是,我们应该始终使用@Override注释对覆盖的方法进行注释。
编译器将知道我们正在重写一个方法,并且如果超类方法发生了某些变化,我们将得到一个编译时错误,而不是在运行时得到不想要的结果。我们可以调用超类方法并使用super关键字访问超类变量。
当我们在子类中具有相同的名称变量/方法但我们想访问超类变量/方法时,它会派上用场。
当在超类和子类中定义构造函数并且我们必须显式调用超类构造函数时,也会使用此方法。我们可以使用" instanceof"指令来检查对象之间的继承,下面的示例让我们来看一下。
我们无法在Java中扩展Final类。
如果您不打算在代码中使用超类,即您的超类只是保留可重用代码的基础,则可以将其保留为Abstract类,以避免客户端类不必要的实例化。
它还将限制基类的实例创建。