JAVASE进阶day02(多态,抽象类,接口)

多态

1.为什么要使用:

避免太多相似代码,减少代码重复,屏蔽不同子类的差异性,从而可以使用同一个方法达到不同的效果。

2.定义:

就是同一个对象在不同情况下展现的不同形态

3.如何展现多态:

继承和实现,方法重写,有父类引用指向子类对象

多态的两种形式展现,创建对象指向父类和重写方法

4.多态中成员变量和方法的访问特点:

成员变量没有多态,成员方法编译看左边运行看右边。

5.多态优缺点

好处:提高了程序扩展性,缺点:不能使用子类的特有功能(类型转换可以解决)

6.多态转型

父子类型的相互转换:

        子转父:向上转型,

        父转子:向下转型(向下转型一定要转换成真实类型)搭配instanceof来实现类型转换安全检查

为什么要转型?为了使用子类的特有功能。

7.多态在工作中的应用场景

在工作中一般使用在方法中,父类作为方法中的形参,子类可以传递进来

package com.lu.day02.test2;

public class Hero {//英雄类
    private String name;

    public Hero(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void attack(Hero hero){//攻击
        System.out.println(hero.getName()+"被杀死了");
    }
}
package com.lu.day02.test2;

public class WillDeep extends Hero{//剑圣


    public WillDeep(String name) {
        super(name);
    }

    @Override
    public void attack(Hero hero) {
        System.out.println("剑圣击杀了"+hero.getName());
    }
}
package com.lu.day02.test2;

public class Widow extends Hero{//寡妇
    public Widow(String name) {
        super(name);
    }//寡妇类

    @Override
    public void attack(Hero hero) {
        System.out.println("寡妇击杀了"+hero.getName());
    }
}
package com.lu.day02.test2;

import java.awt.*;

public class Test {
    public static void main(String[] args) {
        Widow widow = new Widow("寡妇");
        Mantis mantis = new Mantis("螳螂");
        KnifeGirl knifeGirl = new KnifeGirl("刀妹");
        WillDeep willDeep = new WillDeep("剑圣");
        willDeep.attack(widow);
        willDeep.attack(mantis);
        willDeep.attack(knifeGirl);


    }
}

抽象类

1.为什么要使用

面向对象中,对象都是通过类来描绘的,反过来,并不是所有的类都是用来描绘对象的,这样的类就是抽象类。

2.概述

用abstract关键字修饰一个类就是抽象类. 可以看成是对普通类的进一步抽象

抽象方法:没有方法体的方法

3.特点

1.可以定义具体方法

2.可以没有抽象方法

3.有抽象方法的类一定是抽象类

4.抽象类不能实例化,只能通过子类实例化

5.虽然不能实例化,但是可以有构造方法,主要用于数据初始化

6.抽象类的子类必须重写抽象父类中的所有抽象方法

4.练习题

1)定义一个水果类Fruit 1)水果类中包含水果的名称,产地,价钱

2)水果类中有开花,结果,被采摘行为.

3)现有红富士苹果,产自山东烟台,价钱20元/斤

4)定义水果工具类(FruitUtil),其中有一静态方法用来专门给买水果的人称重量算钱,(提示:方法参数应该有买的重量以及水果类型)

package com.lu.day02.Test3;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Apple fruit = new Apple();
        fruit.setName("红富士山苹果");
        fruit.setOrigin("山东烟台");
        fruit.setPrice(20);
        System.out.println(fruit);
        System.out.println("请问你要买几斤");
        Scanner scanner = new Scanner(System.in);
        System.out.println(FruitUtil.calculateThePrice(fruit, scanner.nextDouble()));

    }
}
package com.lu.day02.Test3;

public class FruitUtil {
    private FruitUtil(){}
    public static double calculateThePrice(Apple apple,double b){//计算价格
        return apple.getPrice() * b;
    }
}
package com.lu.day02.Test3;

public abstract class Fruit {//水果
    private String name;
    private String origin;//产地
    private double price;//价钱

    public Fruit() {
    }

    public Fruit(String name, String origin, double price) {
        this.name = name;
        this.origin = origin;
        this.price = price;
    }

    public abstract void flowersBloom();
    public abstract void outcome();
    public abstract void pluck();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getOrigin() {
        return origin;
    }

    public void setOrigin(String origin) {
        this.origin = origin;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Fruit{" +
                "name='" + name + '\'' +
                ", origin='" + origin + '\'' +
                ", price=" + price +
                '}';
    }
}
package com.lu.day02.Test3;

public class Apple extends Fruit{
    @Override
    public void flowersBloom() {
        System.out.println(getName()+"开花");
    }

    @Override
    public void outcome() {
        System.out.println(getName()+"结果");
    }

    @Override
    public void pluck() {
        System.out.println(getName()+"采摘");
    }
}

接口

1.为什么要用

为了解决单继承的缺点

2.概述

1.接口提供一种公共的规范,是为了在符合规范的前提下,达到通用的目的。(定义行为规范)

2.java中的接口使用interface定义,是一种对行为的抽象

3.特点

1.接口中主要使用抽象方法,不能有普通方法

2.子类实现接口使用implements,而非extends

3.接口不能直接实例化,可以通过其子类实例化

4.子类如果实现接口,必须实现接口中所有方法

5.子类可以实现多个接口

6.接口中的成员变量都被final以及public以及static隐式修饰,即都为常量

7.接口中可以定义默认方法(java8新增)、静态方法(java8)、私有方法(java9新增)

8.接口中没有构造方法

子类默认要访问父类构造方法,如果接口没有构造方法那访问的是什么呢

4.类和接口的关系

1.类和类

如果符合继承的使用原则,则存在继承关系

2.类和接口

用implements

3.接口和接口

用extends,多继承

5.标记型接口

6.接口的作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值