关于继承,你掌握多少?来检测一下吧:

点击检测

概念

继承是面向对象软件技术当中的一个概念,与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。

这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。

子类的创建可以增加新数据、新功能,可以继承父类全部的功能,但是不能选择性的继承父类的部分功能。继承是类与类之间的关系,不是对象与对象之间的关系。

例如:先定义一个类叫车,车有以下属性:车体大小、颜色、轮胎、方向盘、品牌、速度、排气量,由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。

如果某类B“继承”另某类A,就把这个B称为“A的子类或派生类(subclass)”,而把类A称为“B的父类”也可以称为“A是B的超类或基类(superclass)”。

如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。

继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。另外,为子类别追加新的属性和方法也是常见的做法。一般静态的面向对象编程语言,继承属于静态的,意即子类别的行为在编译期就已经决定,无法在执行期扩充。

那么如何使用继承呢?用extends关键字来继承父类。

如上面A类与B类,当写继承语句时,class A类 extends B类{ } 其中A类是子类,B类是父类。

继承的语句格式:

class 子类名 extends 父类名{}

class 父类 { } class 子类 extends 父类 { }

 

 

继承关键字(keyword)

继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于java.lang.Object,当一个类没有继承的两个关键字,

则默认继承object(这个类在 java.lang包中,所以不需要 import)祖先类。

1)extends关键字

在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。

public class Animal {
    private String name;
    private int id;
 
    public Animal(String Name, String id) {
        this.name= name;
        this.id= id;
    }
 
    public void eat(){
        System.out.println(name+"正在吃");
    }
 
    public void sleep(){
        System.out.println(name+"正在睡");
    }
     
    public void introduce() {
        System.out.println("大家好!我是"+ id+ "号"+ name+ ".");
    }
}
 
public  class   Mouse extends   Animal {
    public  Mouse(String myName, intmyId) {
        super(Name, Id);
    }
}

2)implements关键字

implements 关键字可以变相的使Java具有多继承的特性,使用范围为类实现接口的情况,可以同时实现多个接口(接口之间采用逗号分隔)。

public interface A {
    public void eat();
    public void sleep();
}
 
public interface B {
    public void run();
}
 
public  class   C implements A,B {
 
}

3)final关键字

final可以修饰类、变量、方法。实例变量也可以被final修饰,被 final 修饰的变量在Java中就是常量,

被 final 修饰的类的属性和方法自动地声明为 final,但是被final修饰实例属性和变量,并不能让所在类变成final类

final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:

声明类:finalclass类名 {//类体}

声明方法:修饰符(public/private/default/protected) final返回值类型 方法名(){//方法体}

4)static关键字

static修饰成员变量(属性)和方法、代码块(不能出现在方法内部),static修饰变量(属性)和方法,得到的是类变量和类方法,类变量和类方法用所在类的类名直接调用。static和abstract不能一起使用。

由static修饰的变量和方法,不能用this调用。静态方法可以调用静态的方法,普通方法也可以调用静态方法,静态方法不能调用普通方法。

5)this关键字

this 关键字在Java方法中只能用在实例变量和实例方法上,不能用在由static、final修饰的类变量和类方法上

如果在Java方法中,实例化的成员变量和某方法的参数变量同名时,根据内部屏蔽外部的原则,即实例化的成员变量在这个方法内暂时失效,

这时如果想在该方法中使用这被屏蔽的成员变量,用“this.成员变量名”的方式调用该成员变量,并且将参数变量赋值给this调用的成员变量,

格式如下:this.本类实例变量=参数变量;

public class Teacher {
    private String name; // 教师名称
    private double salary; // 工资
    private int age; // 年龄
 
    // 创建构造方法,为上面的3个成员变量的属性赋初始值
    public Teacher(String name,int age,double salary) {
        this.name = name; // 设置教师名称
        this.age = age; // 设置教师年龄
        this.salary = salary; // 设置教师工资
    }
 
    //在一个构造器中调用另一个构造器
    public Teacher(){
        This("杜威",98,10000.0)
    }
 
    //当需要返回当前对象的引用时,常常使用return this。
    publicStudent AgeIncrement(){
        age+=2;
        return this;
    }
}
 
publicclassThisDemo{
    public static void main(String[] args) {
        Teacher teacher = new Teacher("王刚",5000.0,45);
        System.out.println("教师信息如下:");
        System.out.println("教师名称:"+teacher.name+"\n教师年龄:"+teacher.age+"\n教师工资:"+teacher.salary);
    }
}

用来访问本类的成员方法:this.本类实例方法名

6)super关键字:super是在子类中调用被屏蔽的成员变量和方法

public class SuperClass {
    int sum, i = 50, j =3;
    int operator(){
        sum=i+j;
        return sum;
    }
}
public class SubClass extends SuperClass {
    int i =100, j=6;
    int operator(){
        sum=i+j;
        return sum;
    }
    public void showMessage() {
        System.out.println("this.i="+this.i+ ",this.j="+this.j+ " ,this.operator() = "+ this.operator() );
        System.out.println("super.i = "+ super.i +",super.j= "+super.j +",super.operator() = "+ super.operator());
    }
}
public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SubClass subObject =new SubClass();
        subObject.showMessage();
    }
}

警告

1、子类拥有父类的特征,而父类没有,父类更通用,子类更具体(特征包括属性和方法,自身的特性,拥有父类没有的)

2、使用extends继承父类,语句格式:class 子类名 extends 父类名{}

3、父类中一般只定义一般属性和方法(这个一般可以理解为是子类共有的,这就是父类更通用,而子类拥有其他的,所以子类更具体)

4、子类中通过super关键字来调用父构造方法

5、在子类中可以继承父类的哪些东西,哪些不可以继承

父类中public、protected修饰的属性和方法可以继承,private修饰的属性和方法可以被继承,但子类无法调用

6、规则:创建子类对象的时候,首先调用的是父类的无参构造方法创建一个父类对象

7、可以在子类中显示调用父类的有参构造方法

8、如果父类的属性均为private修饰,则可以通过共有的getter、setter方法来调用

有些编程语言支持多重继承,即一个子类别可以同时有多个父类别,比如C++编程语言;而在有些编程语言中,一个子类别只能继承自一个父类别,比如Java编程语言,这时可以利用接口来实现与多重继承相似的效果。

现今面向对象程式设计技巧中,继承并非以继承类别的“行为”为主,而是继承类别的“型态”,使得元件的型态一致。另外在设计模式中提到一个守则,“多用合成,少用继承”,此守则也是用来处理继承无法在执行期动态扩充行为的遗憾。