继承可以看成是类与类之间的衍生关系。比如狗类是动物类,牧羊犬类又是狗类。于是我们可以说狗类继承了动物类,而牧羊犬类就继承了狗类。于是狗类就是动物类的子类(或派生类),动物类就是狗类的父类(或基类)。
在 java 中一个类只有一个父类,所以 Java 中的继承是单继承。就像我们每个人只有一个亲生父亲,而我们如果有一个有钱的父亲我们就是富二代;有一个明星父亲,我们就是星二代。继承可以让子类直接拥有父类的所有属性和方法(属性和方法的修饰符是 PRivate 就不行,因为是私有的嘛)。而继承的好处便是可以实现代码的复用,使我们程序猿的福利啊!
我们创建一个类需要它来继承某一个类的语法:
class 子类 extends 父类例如我们定义了一个 Animal 类,我们在创建一个 Dog 类,我们需要它继承 Animal 类
class Dog extends Animal { ...}我们先创建一个父类 Animal
package com.shiyanlou;public class Animal { public int legNum; //动物四肢的数量 //类方法 public void bark() { System.out.println("动物叫!"); }}接下来创建一个子类
1、点击创建 class 类
2、输入子类名称,点击Superclass
后面的Browse...
寻找父类,与之建立继承关系
3、在Choose a type:
下的输入框内输入要寻找的父类,然后选择,结束。
package com.shiyanlou;public class Dog extends Animal {}上面便是系统生成的代码,Dog 类继承了父类 Animal,我们 Dog 类里什么都没有写,其实它继承了父类 Animal,所以 Dog 类拥有 Animal 类的全部方法和属性(除开私有的方法和属性)。我们创建一个测试类测试一下。
方法的重写
虽然子类可以继承父类的方法,但如果子类对父类的方法不满意,子类想在里面加入适合自己的一些操作时,我们就需要将方法进行重写。并且子类在调用方法中,优先调用子类的方法
比如上一个例子中 Animal 有bark()
这个方法代表了动物叫,但是不同的动物有不同的叫法,比如狗是汪汪汪,猫是喵喵喵。
当然在方法重写时我们需要注意,重写的方法一定要与原父类的方法语法保持一致,比如返回值类型,参数类型及个数,和方法名都必须一致。
例如:
package com.shiyanlou;public class Dog extends Animal { //重写父类方法 public void bark() { System.out.println("汪!汪!汪!"); }}继承的初始化顺序
我们学习了继承后,知道在一个继承关系中一定会有一个父类和至少一个子类,那么在程序运行的过程中,是为父类进行初始化,还是先调用的子类进行初始化的呢? 继承的初始化顺序是先初始化父类再初始化子类。
我们根据代码来验证一下。
package com.shiyanlou;public class Animal { public int legNum = 4; // 动物四肢的数量 //Animal的构造方法 public Animal(){ System.out.println("动物有" + legNum + "腿"); System.out.println("父类的构造方法被调用!"); }}package com.shiyanlou;public class Dog extends Animal { //Dog类的构造方法 public Dog(){ System.out.println("子类的构造方法被调用!"); }}package com.shiyanlou;public class test { public static void main(String[] args) { // TODO Auto-generated method stub Dog a = new Dog(); //生成一个Dog类对象a }}最后输出结果:
由此可知,系统先创建了父类对象,再创建了子类对象,先初始化了属性,再调用了构造函数。
补充知识点:
final
关键字可以修饰类、方法、属性和变量
final 修饰类,则该类不允许被继承
final 修饰方法,则该方法不允许被覆盖(重写)
final 修饰属性:则该类的属性不会进行隐式的初始化(类的初始化属性必须有值)或在构造方法中赋值(但只能选其一)
final 修饰变量,则该变量的值只能赋一次值,即变为常量
super
关键字在子类内部使用,代表父类对象。
访问父类的属性 super.属性名
访问父类的方法 super.bark()
新闻热点
疑难解答