面向对象(5)abstract 抽象与多态基础

21 篇文章 0 订阅
7 篇文章 0 订阅

object类是所有类的父类

object类中有几个方法
toString() 返回当前对象本身的有关信息,按字符串对象返回
equals()比较两个对象是否是同一个对象
比较两个对象是否是同一个对象,是则返回true
操作符==
简单数据类型,直接比较值。如1==2
引用类型,比较两者是否为同一对象

hashCode() 返回对象的哈希代码值
生成随机的哈希值
在这里插入图片描述

getClass()获取当前对象所属的类信息,返回Class对象

abstract关键字创建抽象类 例如 public abstract class 类名{}
abstract也可用于方法——抽象方法
抽象方法没有方法体
抽象方法必须在抽象类里
抽象方法必须在子类中被实现,除非子类是抽象类
public abstract 方法返回值 方法名();
记住抽象方法不能有大括号也就是不能有方法体
子类可以重写父类的抽象方法。
例如定义个抽象宠物类
创建抽象方法跑 创建狗类 继承宠物类 重写抽象方法跑

首先宠物类:

public abstract class Pet {

    private String name;

    public abstract void run();


    public String getName() {
        return name;
    }

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

}

抽象方法后一定不能有方法体

狗类:

public class Dog extends Pet {

    @Override
    public void run() {
        System.out.println("狗正在跑");
    }
}

继承父类并重写方法
编写测试类:

public class TestPet {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.run();
    }
}

结果:狗正在跑
在这里插入图片描述
final关键字的作用在类中使用
public final class 类名{}
代表此类为最终类,不能被其他类继承
public final 方法返回值 方法名(){}
代表此方法不能被重写
final在属性变量中代表常量

多态:同一个引用类型,使用不同实例而执行不同操作
编写具有继承关系的父类和子类
子类重写父类方法
使用父类的引用指向子类的对象

例如给宠物喂食是需要一个主人类,正常的操作是
狗类一个吃的方法,企鹅类一个吃的方法,然后主人类中一个喂狗的方法 一个喂企鹅的方法
但是使用多态就可以省去主人的喂狗方法而是直接喂成宠物类,前提条件 企鹅和狗必须都属于宠物类

定义抽象宠物类:

public abstract class Pet {
    private String name;
    private int health;
    private int love;

    public  abstract void eat();
     public String getName() {
        return name;
    }

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

    public int getHealth() {
        return health;
    }

    public void setHealth(int health) {
        this.health = health;
    }

    public int getLove() {
        return love;
    }

    public void setLove(int love) {
        this.love = love;
    }
}

其中sett和get方法可以忽略不计因为这里只显示多态的使用。

首先定义抽象方法吃

狗类

public class Dog extends Pet {

    private  String strain;

    public String getStrain() {
        return strain;
    }

    public void setStrain(String strain) {
        this.strain = strain;
    }

    @Override
    public void eat() {
        System.out.println("吃狗粮");
        super.setHealth(super.getHealth()+5);

    }

狗类继承父类宠物类并重写吃的方法

public class Penguin extends Pet {
    private String sex;

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }


    @Override
    public void eat() {
        System.out.println("吃鱼");
        super.setHealth(super.getHealth()+6);
    }

企鹅继承父类宠物类并重写吃的方法

主人类

public class Master {
    public void feed(Pet pet){pet.eat();
    }

使用父类作为方法形参实现多态

方法体中引用父类的吃方法

测试类

public class TestMaster {
    public static void main(String[] args) {
        Pet dog=new Dog();
       Pet penguin=new Penguin();
        Master master=new Master();
        master.feed(dog);
        master.feed(penguin);

主人类中的喂食带参方法
参数为宠物类型的狗对象
就是狗吃的方法
为宠物类型的企鹅对象
就是企鹅吃的方法
结果:
在这里插入图片描述
第一种方法为使用父类作为方法形参实现多态
下面演示第二种方法
使用父类作为方法返回值实现多态

实现控制台输入领养宠物
输入编号领养

大体不变
宠物类:

public abstract class Pet {
    private String name;
    private int health;
    private int love;
    public abstract void print();

狗类

public class Dog extends Pet {

    private  String strain;

    public String getStrain() {
        return strain;
    }

    public void setStrain(String strain) {
        this.strain = strain;
    }
     @Override
    public void print() {
        System.out.println("这是一条狗");
    }

企鹅类

public class Penguin extends Pet {
    private String sex;

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
     @Override
    public void print() {
        System.out.println("这是一只企鹅");
    }

主人类:

public class Master {
 public Pet getPet(int typeid){
        Pet pet=null;
        if (typeid==1){
            pet=new Dog();
        }else if (typeid==2){
            pet=new Penguin();
        }
        return pet;
    }
}

这里直接以父类为返回值把控制台输入的编号作为参数传入方法, 然后判断如果输入为1 宠物对象为狗类型 则返回狗的print方法
输入2 宠物对象为企鹅类型返回企鹅的print方法

测试类:

public class TestMaster {
    public static void main(String[] args) {
        Pet dog=new Dog();
       Pet penguin=new Penguin();
        Master master=new Master();
         Scanner input=new Scanner(System.in);
        System.out.println("请选择宠物1.狗2.企鹅");
        int typeid=input.nextInt();
        Pet pet=master.getPet(typeid);
        pet.print();


结果:
在这里插入图片描述
instanceof运算符判断其左边对象是否为其右边类的实例
返回的值为boolean值
例如实现宠物玩耍 狗玩飞碟 企鹅游泳
这里也会用到强制转换
宠物类:

public abstract class Pet {
    private String name;
    private int health;
    private int love;

狗类:

ublic class Dog extends Pet {

    private  String strain;

    public String getStrain() {
        return strain;
    }

    public void setStrain(String strain) {
        this.strain = strain;
        
    }
     public void playplate(){
        System.out.println("狗狗在玩飞碟");
    }
}

企鹅类:

public class Penguin extends Pet {
    private String sex;

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
        public void swimming(){
        System.out.println("企鹅在游泳");
    }
    }
    

主人类:

public class Master {
public void play(Pet pet){
        if (pet instanceof Dog){
            Dog dog=(Dog) pet;
            dog.playplate();
        }else if (pet instanceof Penguin){
            Penguin penguin=(Penguin) pet;
            penguin.swimming();
        }
    }
}

利用instanceof运算符判断是否一致
如果不一致则要使用强制类型转换

测试类:

public class TestMaster {
    public static void main(String[] args) {
        Pet dog=new Dog();
       Pet penguin=new Penguin();
        Master master=new Master();
         master.play(dog);
        master.play(penguin);
        

结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值