继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法。
extends
关键字。
class 父类{ } class 子类 extends 父类{ }
通过实例来说明这个需求。开发动物类,动物分别为狗和猫。
狗类:
public class Dog{ private String name; private int id; public Dog(String myName, int myid){ name = myName; id = myid; } public void eat(){ System.out.println(name+"正在吃"); } public void sleep(){ System.out.println(name+"正在睡"); } public void introduction(){ System.out.println("大家好!我是" + id + "号" + name + ".") } }
猫类:
public class Cat{ private String name; private int id; public Cat(String myName, int myid){ name = myName; id = myid; } public void eat(){ System.out.println(name+"正在吃"); } public void sleep(){ System.out.println(name+"正在睡"); } public void introduction(){ System.out.println("大家好!我是" + id + "号" + name + ".") } }
这两段代码可以看出,存在重复,解决这个问题,需要继承,将两段代码相同的部分提取出来组成一个类。
公共父类:
public class Animal{ private String name; private int id; public Animal(String myName, int myid){ name = myName; id = myid; } public void eat(){ System.out.println(name+"正在吃"); } public void sleep(){ System.out.println(name+"正在睡"); } public void introduction() { System.out.println("大家好!我是" + id + "号" + name + "."); } }
这个Animal类作为一个父类,狗类和猫类继承这个类之后,具有父类中的属性和方法。
子类不会存在重复性代码,维护性也高。
狗类:
public class Dog extends Animal{ public Dog(String myName, int myid){ super(myName, myid) } }
猫类:
public class Cat extends Animal{ public Cat(String myName, int myid){ super(myName, myid); } }
Java不支持多继承,但支持多重继承。
使用 extends
和 implements
这两个关键字实现继承。
所有类都继承于 java.lang.Object
,当没有上面的两个关键字,默认继承 Object
类(这个类在 java.lang
包中,不需要 import
)。
在 Java 中,类的继承是单一继承,一个子类只有一个父类。
public class Animal{ private String name; private int id; public Animal(String myName, int myid){ name = myName; id = myid; } public void eat(){ System.out.println(name+"正在吃"); } public void sleep(){ System.out.println(name+"正在睡"); } } public class dog extends Animal{ }
implements
关键字变相的使 java 具有多继承的特性,可以同时继承多个接口(接口之间逗号隔开)。
public interface A{ public void eat(); public void sleep(); } public interface B{ public void show(); } public class C implements A,B{ }
super
关键字:通过 super 实现对父类成员的访问,用来引用当前对象的父类。
this
关键字:指向自己的引用。
class Animal{ void eat(){ System.out.println("animal : eat") } } class Dog extends Animal{ void eat(){ System.out.println("dog : eat"); } void eatTest(){ this.eat(); super.eat(); } } public class Test{ public static void main(String[] args){ Animal a = new Animal(); a.eat(); Dog d = new Dog(); d.eatTest(); } }
输出:
animal : eat dog : eat animal : eat
final 关键字可以把类定义为不能继承的,即最终类。或者用于修饰方法,该方法不能被子类重写。
声明类
final class 类名{ }
声明方法
修饰符(public/private/default/protected) final 返回值类型 方法名(){ }
注意:实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。
被声明为 final 类的方法也自动声明为 final,但实例变量并不是 final。
子类是不继承父类的构造器(构造方法或构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式的通过 super
关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要 super
关键字调用父类构造器,系统会自动调用父类的无参构造器。
class SuperClass{ private int n; SuperClass(){ System.out.println("SuperClass()"); } SuperClass(int n){ System.out.println("SuperClass(int n)"); } } // SubClass 类继承 class SubClass extends SuperClass{ private int n; SubClass(){ // 自动调用父类的无参构造器 System.out.println("SubClass"); } public SubClass(int n){ super(300); // 调用父类中带有参数的构造器 System.out.println("SubClass(int n): " + n); this.n = n; } } // SubClass2 类继承 class SubClass2 extends SuperClass{ private int n; SubClass2(){ super(300); // 调用父类中带有参数的构造器 System.out.println("SubClass2"); } public SubClass2(int n){ // 自动调用父类的无参构造器 System.out.println("SubClass2(int n): " + n); this.n = n; } } public class TestSuperSub{ public static void main(String[] args) { System.out.println("-------SubClass 类继承--------"); SubClass sc1 = new SubClass(); SubClass sc2 = new SubClass(100); System.out.println("-------SubClass2 类继承---------"); SubClass2 sc3 = new SubClass2(); SubClass2 sc4 = new SubClass2(200); } }
输出结果:
-------SubClass 类继承-------- SuperClass() SubClass SuperClass(int n) SubClass(int n): 100 -------SubClass2 类继承--------- SuperClass(int n) SubClass2 SuperClass() SubClass2(int n): 200