java面向对象(4)

2024-06-23 22:36
文章标签 java 面向对象

本文主要是介绍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否则返回falseif(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{@Overridepublic void sleep() {}@Overridepublic void play() {}@Overridepublic 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();}}

这篇关于java面向对象(4)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088474

相关文章

Java五子棋之坐标校正

上篇针对了Java项目中的解构思维,在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现:坐标校正,我们如何使漫无目的鼠标点击变得有序化和可控化呢? 目录 一、从鼠标监听到获取坐标 1.MouseListener和MouseAdapter 2.mousePressed方法 二、坐标校正的具体实现方法 1.关于fillOval方法 2.坐标获取 3.坐标转换 4.坐

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

22.手绘Spring DI运行时序图

1.依赖注入发生的时间 当Spring loC容器完成了 Bean定义资源的定位、载入和解析注册以后,loC容器中已经管理类Bean 定义的相关数据,但是此时loC容器还没有对所管理的Bean进行依赖注入,依赖注入在以下两种情况 发生: 、用户第一次调用getBean()方法时,loC容器触发依赖注入。 、当用户在配置文件中将<bean>元素配置了 lazy-init二false属性,即让