Java面向对象——继承 详解

java基础

**

Java面向对象之继承

**

上一篇博客中介绍了面向对象之封装,此篇博客则简单来看看这个继承。

      这个继承这个词,乍一听可能想到的就是继承财产(手动滑稽)。Java里的继承又是什么情况呢,我们来看看。

继承:

我们继承同样是应用到类上,关键词:extends、super

extends:用于类继承

      class 子类名 exdents 父类名{}


//父类
public class Parents {

    private String name;

    protected Car car;

    public String article;

}

//子类
public class Son extends Parents {

    private String a;

    public Son(Car car,String artocle){

        super();

        this.car = car;

        this.article = article;

//        this.name = name;   由封装性我们知道name(private)无法继承

    }

}

结合我们类的封装性

父类的非private属性我们可以直接使用

    super是干什么用的?

    继承后还有什么是子类可以用的?

对了,说super之前继承的一些注意点都忘了

注意:

    一个子类只能继承一个类


class One extends Two,Three{}    错误的用法

    但一个父类却能被几个类继承


class One{}

class Two extends One{}

class Three extends One{}

    同样分层继承也是没有问题的


class One{}

class Two extends One{}

class Three extends Two{}

super:调用父类继承得到的实例变量或方法


public class Parents {

    private String name;

    protected Car car;

    public String article;

    public void talk(){

        System.out.println("Parents is talking");

    }

}

public class Son extends Parents {

    private String a;

    public Son(Car car,String article){

        super.talk();

        super.car = car;

        super.article = article;

    }

}

我们看看子类用super能点出来什么

注意:

    1、我们使用super可以点出来父类的变量方法进行使用

    2、使用super();是调用了父类的构造方法(有参则调用父类有参构造、无参则调用无参)。

    3、使用super();在子类的构造方法第一行,其他位置则报错。

    4、super不能出现在static块、方法内。(同this)

我们可以看出,使用继承后,父类的非private权限的相应属性和方法我们都可以在子类调用。

特点:

    1、提高了类与类之间的联系。

    2、提高了代码的复用性

    3、提高了代码的维护性

    3、增加了耦合性(缺点)

我们OOP思想的原则是“高内聚、低耦合”

最后:我们对父子类相关东西玩一玩。


class A{

    int id;

    String name;

    public A(){

    }

    public A(int id,String name) {

        this.id = id;

        this.name = name;

    }
}

class B extends A{

    String sex;

    public B(){

    }

    public B(int id,String name,String sex){

        super();

        this.sex = sex;
    }

}

public class Test {

    public static void main(String[] args) {

        A a = new A();

        A a1 = new A(1,"zs");

        A a2 = new B();

        A a3 = new B(1,"zs","nan");

        B b = new B();

        B b1 = new B(2,"ls","nan");

//        B b2 = (B) new A();   //运行报错 父类不能实例化子类对象

//        B b3 = (B) new A(3,"ww");

//        B b4 = (B) new A(3,"da","nan");  编译报错

    }

}

我们从上面的创建实例化对象时,对于new自身类的情况就不用说了,构造怎么写就是什么。(如a,a1,b,b1)

a2和a3对象,我们发现,用子类去实例化(new)父类对象时,我们可以用父类和子类的所有(非private)属性。

b2、b3和b4对象,我们发现,运行时会发生如下异常

它不允许父类去实例化子类对象。但是子类实例化父类对象是我们之后将经常使用的方式。

由此我们知道,子类拥有父类和自身的非private属性,至于父子类其他东西,请戳下一篇!!!

上一篇 》
面向对象——封装

下一篇 》
方法重写与重载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值