java面向对象(4)

目录

1.多态

1.1如何构成多态

1.2多态的调用规则

1.3多态的向下转型

1.4 instanceof运算符

1.5多态的好处

2.final关键字

3.接口

3.1接口中可以定义哪些成员

3.2接口的使用

3.2接口的特性


1.多态

多态:同一种事物,在不同的时刻表现出不同的状态

1.1如何构成多态

当两个类有直接或间接的继承关系并且父类的引用指向子类对象时就构成了多态

eg:

Animal dog = new Dog();

Animal cat = new Cat();

1.2多态的调用规则

(1)成员方法:编译看左边,运行看右边

编译看左边:在编译期间能调到哪些方法,取决于左边父类的类型

运行看右边:在运行期间,调用的是谁的方法,取决于创建的是谁的对象

(2)静态方法:编译和运行都看左边

对于静态方法,是随着类的加载而加载,并不在对象当中,所以调用时只看左边父类的类型

(3)成员变量:编译和运行都看左边

1.3多态的向下转型

当我们想使用多态时,我们迫不得已将子类类型全部提升为父类类型,这就导致了我们无法调用到子类所特有的方法,为了解决这一问题,多态还存在着向下转型

多态的向下转型就是为了子类能调用到自己独有的方法

注意:

(1)向下转型的前提是向上转型

eg:

Animal dog1 = new Dog();

Dog dog2 = (Dog) dog1;

Animal cat1 = new Cat();

Dog dog3 = (Dog) cat1;//这是错误的

上述两行代码即可实现向下转型,但一定切记将dog1转为Dog类时,dog1这个引用必须指向的是一个Dog对象,不能指向其他类型的对象,换句话说,不能将一个指向猫对象的引用转为狗对象,猫是猫,狗是狗,两者没什么关系

为了避免上述这种类转换异常,java提供了一个运算符instanceof

1.4 instanceof运算符

instanceof运算符是一个比较运算符,它可以用来判断运算符左边对象的类型是否等于右边给定的类的类型,相等返回true,否则返回false

使用:

对象 instanceof 类名

 public void putAnimal(Animal animal) {
        System.out.println("把" + animal.getName() + "装进冰箱");
        animal.eat();

        //instanceof 表示父类类型中持有实际类型 是否是指定的类型
        //父类类型与指定类型相同返回true否则返回false
        if(animal instanceof Dog){
            Dog dog = (Dog)animal;
            dog.lookhome();
        }
    }

1.5多态的好处

提高了代码的可扩展性,减少了代码的冗余

2.final关键字

final关键字可以用来修饰类,成员变量,成员方法,方法中的参数

1.当final修饰类时,表示该类不能被继承

2.当final修饰成员方法时,表示该方法不能被重写

3.当final修饰方法中的参数时,表示该参数在该方法中不能被修改

4.当final修饰成员变量时,它表示该成员变量成为了常量,即一旦初始化就不能修改,此时分为两种情况

(1)情况一:在定义时就初始化,此时相当于所有对象中都有一份值相同的常量值,那不如将其定义为static的,这样,在内存中只存在一份这个值且被所有对象共享.

eg:static final MAX_VALUE = 100;

(2)情况二:在构造方法中初始化,此时相当于每份对象中都有一个该常量,且该常量的值可以自定义

3.接口

接口可以看作是一个特殊的抽象类,在java中用关键字Interface定义一个接口

3.1接口中可以定义哪些成员

(1)常量

在接口中可以直接int num;通过定义变量的方式去定义常量,因为编译器会默认加上public static final,也就是说在接口中 int num == public static final int num;

(2)抽象方法

在接口中可以 void eat();这样来定义一个抽象方法,编译器会默认加上public abstract,也就是说在接口中 void eat() == public abstract void eat();

(3)静态方法

在接口中可以static [返回值] 方法名(参数列表){方法体};来定义一个静态方法,编译器会默认加上public

(4)默认方法

在接口中可以 default [返回值] 方法名(参数列表){方法体};来定义一个默认方法,默认方法是为了让继承该接口的子类在想重写时重写

但在jdk8之前接口中只能定义抽象方法和常量

3.2接口的使用

一个类通过implements来实现多个接口,实现接口时,要么重写接口中的抽象方法,要么将该类声明为抽象类,一个接口通过exends来继承多个接口

public interface InterfaceA {
    void sleep();
}

//一个接口通过extends继承多个接口
public interface InterfaceB extends InterfaceC, InterfaceD {
    void play();
}


public interface InterfaceC {

}


public interface InterfaceD {

}

//一个类通过extends继承一个类并通过implements实现多个接口,并重写接口中的抽象方法
public class MyClass extends Object implements MyInterface,InterfaceA,InterfaceB{
    @Override
    public void sleep() {

    }

    @Override
    public void play() {

    }

    @Override
    public void eat() {

    }
}

3.2接口的特性

(1)接口是隐式的抽象,主要用来定义功能

(2)接口中可以定义常量,抽象方法,静态方法,默认方法

(3)一个接口能继承其他多个接口

(4)接口不能实例化对象

(5)接口是要被类实现,一个接口可以被多个类实现

(6)当类实现接口时必须要实现接口中的抽象方法,否则要将该类定义为抽象类

(7)接口与实现类之间存在多态性

public class MyClass implements MyInterface{

    public static void main(String[] args) {
    
        //接口和实现类之间存在多态性
        MyInterface myInterface = new MyClass();
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值