Java 继承

(摘自头歌)
任务描述

掌握继承的基本概念以及怎么使用继承。

相关知识

1.继承的基本概念;2.继承的特性;3.子类对象的实例化过程。

继承的基本概念

所谓继承:是指可以让某个类型的对象获得另一个类型的对象的属性的方法。

假设有一个Person类,里面有nameage两个属性,

而另外一个Student类,需要有nameageschool三个属性,

可以发现Person中已经存在有nameage两个属性,所以不希望在Student类中再重新声明这两个属性。

范例:

public class Test{
    public static void main(String[] args) {
        Student s = new Student();
        // 访问Person类中的name属性
        s.name = "张三";
        // 访问Person类中的age属性
        s.age = 18;
        // 访问Student类中的school属性
        s.school = "哈佛大学";
        System.out.println("姓名:" + s.name + ",年龄:" + s.age + ",学校:" + s.school);
    }
}
class Person 
{
    String name;
    int age;
}
class Student extends Person 
{
    String school;
}

输出结果: 姓名:张三,年龄:18,学校:哈佛大学

由上面的程序可以发现,在Student类中虽然并未定义nameage属性,但在程序外部却依然可以调用nameage,这是因为Student类直接继承自Person类,也就是说Student类直接继承了Person类中的属性,所以Student类的对象才可以访问到父类中的成员。

继承的特性
  • 子类拥有父类private的属性和方法;

  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展;

  • 子类可以用自己的方式实现父类的方法;

  • Java中只允许单继承,而不允许多重继承,也就是说一个子类只能有一个父类,但是Java中却允许多层继承,多层继承就是,例如类C继承类B,类B继承类A,所以按照关系就是类A是类B的父类,类B是类C的父类,这是Java继承区别于C++继承的一个特性;

  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。

多重继承:

class A{
    ...
}
class B{
    ...
}
class C extends A,B{
    ...
}

由上面可以发现类C同时继承了类A与类B,也就是说类C同时继承了两个父类,这在Java中是不允许的。 多层继承:

class A{
    ...
}
class B extends A{
    ...
}
class C extends B{
    ...
}

由上面可以发现类B继承了类A,而类C又继承了类B,也就是说类B是类A的子类,而类C则是类A的孙子类。

子类对象的实例化过程

既然子类可以继承直接父类中的方法与属性,那父类中的构造方法呢?请看下面的范例:

public class Test {
    public static void main(String[] args) {
        Student s = new Student();
    }
}

class Person {
    String name;
    int age;

    // 父类的构造方法
    public Person() {
        System.out.println("1.public Person(){}");
    }
}

class Student extends Person {
    String school;

    // 子类的构造方法
    public Student() {
        System.out.println("2.public Student(){}");
    }
}

输出结果: 1.public Person(){} 2.public Student(){}

从程序输出结果中可以发现,虽然程序第3行实例化的是子类的对象,但是程序却先去调用父类中的无参构造方法,之后再调用了子类本身的构造方法。所以由此可以得出结论,子类对象在实例化时会默认先去调用父类中的无参构造方法,之后再调用本类中的相应构造方法。 实际上在本范例中,在子类构造方法的第一行默认隐含了一个super()语句,上面的程序如果改写成下面的形式,也是可以的:

class Student extends Person{
    String school ;

    // 子类的构造方法
    public Student(){
        super() ; //实际上在程序的这里隐含了这样一条语句
        System.out.println("2.public Student(){}");
    }
}

继承条件下构造方法调用规则如下:

  • 如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下写不写super()语句效果都是一样;

  • 如果子类的构造方法中通过super显示调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法;

  • 如果子类的构造方法中通过this显示调用自身的其他构造方法,在相应构造方法中应用以上两条规则;

  • 特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止。

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值