一. 继承的概念
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法。
1. 类的继承格式
extends
关键字。
class 父类{
}
class 子类 extends 父类{
}
2. 为什么继承
通过实例来说明这个需求。开发动物类,动物分别为狗和猫。
狗类:
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);
}
}
3. 继承类型
Java不支持多继承,但支持多重继承。
二. 继承的特性
- 子类拥有父类非private的属性、方法
- 子类拥有自己的属性和方法。即对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java的继承是单继承,但是可以多重继承。
- 继承的缺点,造成代码联系越紧密,独立性差。
三. 继承关键字
使用 extends
和 implements
这两个关键字实现继承。
所有类都继承于 java.lang.Object
,当没有上面的两个关键字,默认继承 Object
类(这个类在 java.lang
包中,不需要 import
)。
1. extends
在 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{
}
2. implements
implements
关键字变相的使 java 具有多继承的特性,可以同时继承多个接口(接口之间逗号隔开)。
public interface A{
public void eat();
public void sleep();
}
public interface B{
public void show();
}
public class C implements A,B{
}
3. super 和 this
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
4. final关键字
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