java面向对象(4)

目录

1.多态

1.1如何构成多态

1.2多态的调用规则

1.3多态的向下转型

[1.4 instanceof运算符](#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 类名

java 复制代码
 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来继承多个接口

java 复制代码
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)接口与实现类之间存在多态性

java 复制代码
public class MyClass implements MyInterface{

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

}
相关推荐
学java的小菜鸟啊7 分钟前
第五章 网络编程 TCP/UDP/Socket
java·开发语言·网络·数据结构·网络协议·tcp/ip·udp
zheeez11 分钟前
微服务注册中⼼2
java·微服务·nacos·架构
立黄昏粥可温11 分钟前
Python 从入门到实战22(类的定义、使用)
开发语言·python
PerfMan14 分钟前
基于eBPF的procstat软件追踪程序垃圾回收(GC)事件
linux·开发语言·gc·ebpf·垃圾回收·procstat
程序员-珍15 分钟前
SpringBoot v2.6.13 整合 swagger
java·spring boot·后端
徐*红22 分钟前
springboot使用minio(8.5.11)
java·spring boot·spring
聆听HJ22 分钟前
java 解析excel
java·开发语言·excel
溪午闻璐26 分钟前
C++ 文件操作
开发语言·c++
AntDreamer26 分钟前
在实际开发中,如何根据项目需求调整 RecyclerView 的缓存策略?
android·java·缓存·面试·性能优化·kotlin
java_heartLake31 分钟前
设计模式之建造者模式
java·设计模式·建造者模式