Java的继承和多态,真的明白它的实际用处吗?

继承

继承的好处是代码复用。继承的子类自动拥有父类中的所有属性和方法。所以继承已存在的类就是复用这些类的方法和域。在此基础上,子类还可以添加一些新的方法和域,以满足新的需求。

直接上例子:

//父类
public class Father {
    public void doSome1(){
        System.out.println("父类doSome1");
    }
    public void doSome2(){
        System.out.println("父类doSome2");
    }
}
//子类
public class Son extends Father{
    @Override
    public void doSome1() {
        System.out.println("子类重写doSome1");
    }
    public void doOther(){
        System.out.println("子类doOther");
    }
}
//测试类
public class TestExtend {
    public static void main(String[] args) {
        Son son = new Son();
        son.doSome1();//子类重写
        son.doSome2();//继承自父类
        son.doOther();//子类扩展
    }
}

测试类运行结果:

多态

先说几个概念,“向上转型”、“父类的引用指向子类”、“自动类型转化”,它们都是一个意思。形如代码:Father father = new Son();这里的father就是”引用“。

“多态”字面理解:多种形态,多种状态。

java程序分为编译阶段和运行阶段,多态其实就是编译时候是一种形态,运行的时候另一种形态,编译阶段编译器认为father对象是Father类型,father只能访问到Father类的方法,假如访问子类的就会报错,比如访问子类Son的方法doOther()会爆红:

 

但它是从Son类new出来的,本质是Son类,运行阶段真正执行的是Son类的方法。还是上述的Father类和Son类,重写测试类:

public class TestExtend {
    public static void main(String[] args) {
        Father father = new Son();
        father.doSome1();
    }
}

测试类执行结果:

总结

new关键字后面的是对象的本质,“引用”只是在编译阶段限制了对象的功能。

多态和继承在开发中的作用

为了提高程序的扩展性,降低程序的耦合度。我们采用面向抽象,面向接口编程,比如我们有这样一个动作,“喂狗”、“喂猫”...我们如果用代码实现可以是这样:

//狗
public class Dog {
    public void eat(){
        System.out.println("狗在进食");
    }
}
//猫
public class Cat {
    public void eat(){
        System.out.println("猫在进食");
    }
}

//测试
public class Master {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        feed(dog);
        feed(cat);
    }
    public static void feed(Dog a){
        a.eat();
    }
    public static void feed(Cat a){
        a.eat();
    }
}

很容易看出上述代码的缺陷,我每次喂一个动物,我都需要写一个feed方法,而面向接口编程,优化之后的代码:

//写一个抽象接口,无论是狗还是猫,鸡鸭鹅,都是动物
public interface Animal {
    public  void eat();
}
//狗
public class Dog implements Animal {
    public void eat(){
        System.out.println("狗在进食");
    }
}
//猫
public class Cat implements Animal{
    public void eat(){
        System.out.println("猫在进食");
    }
}

//测试
public class Master {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        feed(dog);
        feed(cat);
    }
    public static void feed(Animal a){
        a.eat();
    }
}

通过接口编程,我们只需要写一个feed方法就可以喂所有的动物了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值