继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承(例如儿子继承父亲财产)类似。
继承可以理解为一个类从另一个类获取方法和属性的过程。如果类B继承于类A,那么B就拥有A的属性和方法。
继承使用extends关键字。
例如我们已经定义了一个类People:
package jicheng;
class People
{
String name;
int age;
int height;
void say()
{
System.out.println("我的名字是 " + name + ",年龄是 " + age + ",身高是 " + height);
}
}
如果现在需要定义一个类Teacher,它也有name,age,height属性和say()方法,另外还需要增加school,seniority,subject属性和lectureing()方法,怎么办呢?我们要重新定义一个类吗?
完全没有必要,可以先继承People类的成员,在增加自己的成员即可,例如:
package jicheng;
class Teacher extends People
{
String school;//所在学校
String subject;//学科
int seniority;//教龄
//覆盖People类中的say()方法
void say()
{
System.out.println("我叫" + name + ",在" + school + "教" + subject + ",有" + seniority + "年教龄");
}
void lecturing()
{
System.out.println("我已经" + age + "岁了,依然站在讲台上讲课");
}
}
对程序的说明
• name 和 age 变量虽然没有在 Teacher 中定义,但是已在 People 中定义,可以直接拿来用。
• Teacher 是 People 的子类,People 是Teacher 类的父类。
• 子类可以覆盖父类的方法。
• 子类可以继承父类除private以为的所有的成员。
• 构造方法不能被继承。
继承是在维护和可靠性方面的一个伟大进步。如果在People类中进行修改,那么Teacher类就会自动修改,而不需要程序员做任何工作,除了对它进行编译。
**单继承性:**Java允许一个类仅能继承一个其它类,即一个类只能有一个父类,这个限制被称为单继承性。接口允许多继承。
最后对上面的代码进行整理:
package jicheng;
public class Demo
{
public static void main(String[] args)
{
Teacher t = new Teacher();
t.name = "小布";
t.age = 70;
t.school = "清华大学";
t.subject = "Java";
t.seniority = 12;
t.say();
t.lecturing();
}
}
class People
{
String name;
int age;
int height;
void say()
{
System.out.println("我的名字是 " + name + ",年龄是 " + age + ",身高是 " + height);
}
}
class Teacher extends People
{
String school;//所在学校
String subject;//学科
int seniority;//教龄
//覆盖People类中的say()方法
void say()
{
System.out.println("我叫" + name + ",在" + school + "教" + subject + ",有" + seniority + "年教龄");
}
void lecturing()
{
System.out.println("我已经" + age + "岁了,依然站在讲台上讲课");
}
}
运行结果:
我叫小布,在清华大学教Java,有12年教龄
我已经70岁了,依然站在讲台上讲课
为了加强理解,再看一个例子:
package day33;
/*
* 父类 超类 基类
* 子类 派生类
* extends只能继承一个类,java不支持多重继承
* 子类继承父类之后,子类可以调用父类的属性和方法
* 也可以重写父类的属性和方法,还可以增加自己的属性和方法
*/
//父类(动物类)
public class Animal
{
private String type;//类别
private String skin;//肤色
private int legCount;//几条腿
public void eat()
{
System.out.println("动物在吃东西");
}
public void huxi()
{
System.out.println("动物在呼吸");
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getSkin() {
return skin;
}
public void setSkin(String skin) {
this.skin = skin;
}
public int getLegCount() {
return legCount;
}
public void setLegCount(int legCount) {
this.legCount = legCount;
}
}
package day33;
public class Sheep extends Animal
{
public void eat()
{
System.out.println("山羊在吃草");
}
public void fire()
{
System.out.println("山羊在打架");
}
}
package day33;
//子类 老虎类
public class Tiger extends Animal
{
public void eat()
{
System.out.println("老虎在吃东西");
}
public void run()
{
System.out.println("老虎在跑");
}
}
package day33;
public class Test
{
public static void main(String[] args)
{
Tiger t = new Tiger();
t.eat();
t.setType("老虎");
t.setSkin("金黄色");
t.setLegCount(4);
System.out.println(t.getType()+","+t.getSkin()+","+t.getLegCount());
t.run();
Sheep e = new Sheep();
e.eat();
e.fire();
}
}
运行结果:
老虎在吃东西
老虎,金黄色,4
老虎在跑
山羊在吃草
山羊在打架
注意:构造方法不能被继承,掌握这一点很重要。 一个类能得到构造方法,只有两个办法:编写构造方法,或者根本没有构造方法,类有一个默认的构造方法。