从零开始学Java-继承,接口,多态

面向对象编程的ava与面向过程的C语言最大的不同的引用了对象的概念,而具有相同方法(函数)的类可以抽象为一个父类,由其他的子类通过继承来获得与父类相同的方法,而在这个过程中,产生了子类的方法覆盖和多父类继承的问题(这种继承方法不存在 ),因此Java语言发明了接口和多态来解决。

继承

一提到继承,其实直接上继承树就会一目了然了,这也侧面印证了我校为什么要先学数据结构再学java的原因,继承通俗的来说是一个过程,通过继承,子类可以拥有父类的实际变量与方法函数,并且可以通过覆盖的的方式去在子类中定义与父类方法函数名称相同但是执行内容不同的方法函数。
直接上继承树:
在这里插入图片描述
在继承树中,子类会继承父类的所有实际变量与方法,不管在子类中有没有定义与覆盖,都是始终存在的。如果子类Son1中覆盖了父类Father的work方法,那么Son2所继承的work方法是Son1覆盖的work方法。继承的规则一般是由下向上继承里子类最近的父类的方法且一个子类至多只能用有一个父类不可以多父类继承,假如多个父类中有相同名称的方法函数,那么子类则不知道该从哪个父类中继承的问题,因此不可以多父类继承
那么什么是覆盖呢,覆盖是指从父类中继承过来的方法函数在子类中内容需要被修改以适应子类的需求,那么我们就可以重新的定义这个方法函数,按照返回类型,名称,形参相同的规则重新定义就被称为覆盖,如果只是名称相同,而返回类型,与形参的类型顺序不同,则称为重载,重载的本质是以相同的名字定义两个不同的方法函数而不是将父类的方法函数覆盖。
注意:重载和继承一点关系也没有,但覆盖与继承有着密切的关系。
而在代码中要怎么写呢?
一般通过定义:class+子类名称+extends+父类名称{} 表明继承关系。

class Father{
    int a,b;
    void work(int x){
        System.out.println("This is Father "+ x);
    }
}
class Son extends Father{}
public class Test {
    public static void main(String[] args){
        Son Son1=new Son();
        Son1.a=2;Son1.b=3;
        System.out.println("Son1'a "+Son1.a);
        System.out.println("Son1'b "+Son1.b);
        int x=1;
        Son1.work(x);
    }
} 

运行结果:Son1'a 2 Son1'b 3 This is Father 1 说明子类型继承了父类型(回车被忽略)
判断一个类是否为另一个类的子类,可以用一个IS-A结构判断,例如:Cat is a Animal. 如果符合HAS-A结构,则必然不是父子继承关系,例如:洗手间 has a 马桶。
一般继承树都不超过3层。

接口

刚刚提到了子类无法从多个父类中继承的问题,那么如果一个子类既包含类A又包含类B的方法函数,那么如何让这个子类对A和B进行继承呢,我们虽然无法直接继承两个父类,但是我们引入接口来解决这个问题,接口的存在则可以让一个子类同时拥有两个及以上的类的方法函数。
直接上继承树:在这里插入图片描述
如果Son只是与Interface相接,则只具备Interface的实际变量与方法函数,相当于继承,但是与继承不同的是接口中设置的方法函数是抽象函数,需要在子类中重新设置。
如果Son既继承了Father又与Interace相接,则Son包含了所有Father与Interace的实际变量与Father的所有方法函数,并且需要重新设置Interface中的方法函数。
那么什么是抽象函数呢,我们将抽象函数与抽象类一起讲,引入抽象类与抽象方法的环境是为了解决一类问题:一个父类与多个子类之间有一个相同的方法函数,但是对于不同的子类该方法函数的内容又不同,例如:Animal是父类,子类有猫,狗,牛,假设猫狗牛的eat()函数不同,那么我们则可以设置一个只有函数名称的eat在父类中,在每个子类中都重新写一遍这个eat函数即可,这就是抽象方法的引出,而抽象类相当于一个没有实际意义无法被初始化,因为抽象类中的所有方法都是抽象方法,但是拥有继承属性的类,这个类中又包含了许多方法可以根据子类的不同需要去重新修改,它就像是一个题目或者框架,无法去初始化这个框架,但是你可以在它的子类下去定义框架中的内容,且它的子类中一定要定义抽象类中的方法。
抽象类的定义:abstract+class+类名称{}
抽象方法的的定义:
public+abstract+返回类型+方法名称();
一般来说定义一个接口(无继承父类)是用interface来替代class,其中接口中所有的方法都是抽象方法。
接口:Interface+类名称{各种抽象方法}
子类 :class+类名称+interface+接口名称{}

interface Father{
    int a=2,b=3;
    public void work(int x);
}//接口定义
class Son implements Father{
   public void work(int x){
        System.out.println("This is Son"+x);
    }//必须写抽象函数
}//子类定义

如果这个接口所接的类已经是某个父类的子类,定义方法不变,但是子类的定义方法变成:

class+类名称+extends+父类名称+implements+接口名称+{}
interface Interface{
    int a=2,b=3;
    public void work1(int x);
}
class Father{
    int c,d;
    void work2(int x){
        x+=5;
        System.out.println("This is Faher "+x);
    }
}
class Son extends Father implements Interface{
   public void work1(int x){
        System.out.println("This is Son "+x);
    }
}
public class Test {
    public static void main(String[] args){
        Son Son1=new Son();
        int x=2;
        System.out.println("Son1'a "+Son1.a);
        System.out.println("Son1'b "+Son1.b);
        Son1.work1(x);
        Son1.work2(x);
    }
} 

运行结果:

Son1'a 2
Son1'b 3
This is Son 2
This is Faher 7

多态
多态即多种状态,通过继承,接口,重载来使一个类拥有不同的形态,称为多态。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值