面向对象OOP(多态,抽象,接口)

多态:

指的是同一个方法可以根据不同的对象调用出不同的行为;简单来说;多态允许我们使用一个父类类型的引用来指向子类对象;并在运行时根据实际对象的类型来调用相应的方法;这样可以提高代码的灵活性和可扩展性。

  • 多态是方法的多态;不是属性的多态(多态与属性无关)
  • 多态的存在要有3个必要条件:继承;方法重写;父类引用指向子类对象。
  • 父类引用指向子类对象后;用该父类引用调用子类重写的方法;此时多态就出现了。
  • 使用父类做方法的形参和返回值;是多态使用最多的场合;即使增加了新的子类;方法也无需改变;符合开闭原则。

1.向上转型:

将子类对象赋给父类引用;称为向上转型;自动进行类型转换;向上转型可以调用的子类继承的方法;但不能调用子类特有的方法;需要特别理解的是如果子类重写了父类的方法;向上转型后通过父类引用调用的却是真实子类重写的方法。

优点: 直接转换

缺点: 不能调用子类中的独有的方法

·代码演示:

Animal类:
package ZX;

public class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}

Cat类:

package ZX;

public class Cat extends Animal {
    public void eat() {
        System.out.println("猫在吃鱼!!");
    }

    public void catAction() {
        System.out.println("猫给你干仗!!");
    }
}

Test类:

package ZX;

public class Test {
    public static void main(String[] args) {
        Animal cat=new Cat();
        cat.eat();
    }
}

2.向下转型:

将父类的引用变量转换为子类类型;称为向下转型;向下转型后就可以调用子类特有的方法了。

优点:可以使用子类中的独有的方法

缺点: 类型转换异常

·代码演示:

Animal类:

package ZX;

public class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}

Cat类:

package ZX;

public class Cat extends Animal {
    public void eat() {
        System.out.println("猫在吃鱼!!");
    }

    public void catAction() {
        System.out.println("猫给你干仗!!");
    }
}

Test类:

package ZX;

public class Test {
    public static void main(String[] args) {
        Animal cat = new Cat();
        //向下转型
        Cat animal = (Cat)cat;
        animal.catAction();
    }
}

抽象类:

  • 没有方法体的方法就是抽象方法
  • 抽象方法由abstract关键字修饰
  • 抽象方法必须在抽象类中
  • 抽象类由abstract修饰
  • 抽象方法必须被子类重写 被重写成非抽象方法
  • 抽象类不能被实例化 可以实例化其子类声明抽象类
  • 抽象方法其实就是对子类的一种要求,抽象方法必须被重写
  • 抽象类其实就是对子类众多要求的一个集合 抽象类就是多个要求的集中体现
  • 如果子类不想重写父类的抽象方法,子类必须也是抽象类
  • 子类要重写其所有层级父类中定义的抽象方法
  • 抽象类中可以有非抽象方法 非抽象方法可以被子类继承 子类可以重写,也可以不去重写
  • 抽象类的存在就是在可以在为众多子类提出要求的情况下,实现多态
  • 抽象类虽然不能被实例化,但是仍然有构造方法,其实就是为满足继承中,子类的构造方法调用而准备的

接口:

接口是一个抽象类型;是抽象方法的集合;接口通常以interface来声明;一个类通过继承接口的方式;从而来继承接口的抽象方法。

语法:

[修饰符列表] interface 接口名{

        

}

特点:

  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract只能是 public abstract,其他修饰符都会报错)。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法

权限修饰符:

  • default (即默认;什么也不写): 在同一包内可见;不使用任何修饰符;使用对象:类;接口;变量;方法。
  • private : 在同一类内可见。使用对象:变量;方法; 注意:不能修饰类(外部类)。

  • public : 对所有类可见;使用对象:类;接口;变量;方法。

  • protected : 对同一包内的类和所有子类可见;使用对象:变量;方法; 注意:不能修饰类(外部类)

同一类中同一包中不同包中子类其他
public×××
protected××
default×
private

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值